Flutter如何做到网络请求(多个网络请求)完成之后再加载页面

2023-11-09

很多时候我们有这样一个需求,需要在网络请求完了之后再去渲染页面,尤其是在一个界面有多个相关网络请求的时候需要处理。
这里不得不提到一个系统的组件FutureBuilder,我们直接来看用法。

单网络请求:

 @override
  Widget buildWidget(BuildContext context, Store<UserState> store) {
    // TODO: implement buildWidget

    return Scaffold(
      body: FutureBuilder(
          future: _futureBuilderFuture,
          builder: (BuildContext context, AsyncSnapshot snapShot) {
            print('connectionState:${snapShot.connectionState}');
            if (snapShot.connectionState == ConnectionState.waiting) {
              return Text('Loading...');
            } else if (snapShot.connectionState == ConnectionState.done) {
              print(snapShot.hasError);
              print('data:${snapShot.data}');
              if (snapShot.hasError) {
                return Text('Error: ${snapShot.error}');
              }

              return ListView(
              ...

其中第一个参数 future对应的是一个具有Future返回值的方法,这个方法可以是一个网络请求,比如

 Future<CommonModel> fetchPost() async {
    final response = await http.get('http://www.devio.org/io/flutter_app/json/test_common_model.json');
    Utf8Decoder utf8decoder = Utf8Decoder(); //fix 中文乱码
    var result = json.decode(utf8decoder.convert(response.bodyBytes));
    return CommonModel.fromJson(result);
  }

那我们写法是

  future: fetchPost(),

避免重复网络请求:

但是这样写会有一个问题,那就是当我们调用setstate的时候,将会刷新整个FutureBuilder,结果会是fetchPost这个方法会调用多次,造成了不必要的请求和资源浪费。所以我们建议这样写

  var _futureBuilderFuture;
  @override
  void initState() {
    _futureBuilderFuture = getDatas();
    super.initState();
  }

引用的时候

  future: _futureBuilderFuture,

这样当我们调用setstate的时候,就不会有多次网络请求了

下来还有个问题,刚才是界面只有一个网络请求,那么假如有多个呢,写法如下:

  Future getDatas() async {
    
    return Future.wait([getDelegationData(), getData()]);
  }

多网络请求:

其中getDelegationData ,getData是两个单独的网络请求,写法如下

 Future getData() async {
    var data = {
      'iReq': "BTC_USDT",
    };
  TradeInfo response = await TradeService.getData(this, data.toString());
}

getDelegationData一样,不再给出,这样的话等两个请求都结束之后会返回一个新的Future到我们的FutureBuilder

   if (snapShot.connectionState == ConnectionState.waiting) {
              return Text('Loading...');
            } else if (snapShot.connectionState == ConnectionState.done) {
              print(snapShot.hasError);
              print('data:${snapShot.data}');
              if (snapShot.hasError) {
                return Text('Error: ${snapShot.error}');
              }

这里的话就用到了snapShot的几种状态,用来判断网络请求处于哪一个阶段,等待(请求中),done完成,包括如果请求有异常的话,我们可以打印出来 return Text(‘Error: ${snapShot.error}’);

注意事项:

这里有一个情况就是我们在调用Future.wait([getDelegationData(), getData()]);的时候,请求网络的顺序是按参数的先后顺序执行的,先走getDelegationData请求,再走getData,但是返回数据结果的顺序却不能保证,因为是根据请求需要的时间决定的,异步的,所以我们尽量把数据处理放在ConnectionState.done之后再处理。

多网络请求如何控制顺序:

另外如果你的网络请求有逻辑关系,比如第一个接口的返回值要当做第二个接口的请求参数,那么写法如下

Future testThen2()  asyn {
  Future getDatas() async {
  return getDelegationData().then((e){
    getData();
  });
  }
// 请求顺序是从外层到里层即 getDatas=====getDelegationData===getData

以上over,有不足之处请提出改正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter如何做到网络请求(多个网络请求)完成之后再加载页面 的相关文章

  • Future.get() 总是被 InterruptedException 中断

    我在 Java 中的 Future get 遇到了一个奇怪的问题 它总是返回一个 InterruptedException 但奇怪的是异常的原因是 null 所以我不知道是谁打断了我 情况变得更糟 因为我在调用 get 之前进行检查 而 F
  • Java - Future.get() 多次调用

    Java 是如何实现的Future get 任务完成后多次调用的情况下表现如何 它返回相同的结果吗 或者抛出一个ExecutionException如果计算失败 一次又一次出现相同的异常 我在文档中找不到任何有关它的内容 您可以致电get
  • Scala 中的阻塞关键字

    有什么区别Future blocking blockingCall and blocking Future blockingCall 这两个都定义在scala concurrent 我看过在 scala 文档中 http docs scal
  • 如何将 future 移至 lambda 表达式

    我正在使用 Visual Studio 2013 我想实现这行代码 f p get future auto task f std move f use f 我知道解决方案here https stackoverflow com questi
  • Rx Java Observable 执行直到某个条件

    我正在尝试找到一种执行可观察的方法 直到满足某些条件 考虑以下示例 myDelayedObservable createListenerObserver public Observable
  • 如何在 Scala 中转换失败的未来异常?

    我一直用recover转换失败期货中的异常 类似于 def selectFromDatabase id Long Future Entity val entity selectFromDatabase id recover case e D
  • Erlang 中的 Future 和 Promise

    Erlang 有等价物吗未来与承诺 http en wikipedia org wiki Futures and promises 或者因为 future 和 Promise 正在解决 Erlang 系统中不存在的问题 例如同步编排 因此我
  • “Future.successful(无)”和“Future(无)”之间有什么区别

    Future apply启动异步计算 而Future successful使用指定的结果创建一个已经完成的 Future Now is Future None Future apply None 效率低于Future successful
  • Dismissible verifyDismiss 与新的路线导航结合导致 Flutter 崩溃

    上下文 我在测试时偶然发现了一次轻微的崩溃ListView of DismissibleFlutter 中的 s 当滑动可关闭时 Dialog显示使用confirmDismiss选项 用于确认 这一切都运行良好 但是在测试不太可能的用例时
  • 为什么这个从未来列表到未来列表的转换能够编译并起作用?

    免责声明 下面的代码片段与正在进行的 Coursera 课程之一相关 我们假设它只是出于学习目的而发布 不应用于作为家庭作业的解决方案提交 正如下面的评论所述 我们需要将 Future 列表转换为列表的单个 Future 更重要的是 如果至
  • Scala:用于未来理解的 ExecutionContext

    当我做一个future 或应用类似的方法onSuccess and map 我可以为它们指定 ExecutionContext 例如 val f future code executionContext f map someFunction
  • 在日期/时间调用方法

    我正在寻找一个modern在给定日期 时间执行给定方法的方法 ZonedDateTime尤其 我知道Timer类和Quartz库 如下所示 线程包括完整的解决方案 Java 在特定日期执行方法 关闭 https stackoverflow
  • Scala Futures 如何与 flatMap 链接在一起?

    我正在 Scala 中首次使用 Futures 并且正在研究使用 flatMap 组合器的示例 我一直在关注这个讨论 http docs scala lang org overviews core futures html http doc
  • 使用返回 Future 的函数映射 Stream

    有时我发现自己处于这样的境地 Stream X and a function X gt Future Y 我想组合成一个Future Stream Y 而且我似乎找不到办法做到这一点 例如 我有 val x 1 until 10 toStr
  • Dart 内部的 wait 到底做了什么?

    我正在开发一个需要使用本地存储的颤振应用程序 由于Android中的文档目录路径将在Future中给出 因此每次我想使用该路径时 我都必须检查future是否完成 代码可能类似于下面 class DataStructure late Fut
  • Akka Actor 询问和类型安全

    我如何使用 Akka Actor Ask 并维护类型安全 或者避免使用 询问 而使用 告诉 打电话时 or ask在 Akka Actor 上 Future Any 返回 我必须通过进行显式转换future mapTo MyType 我不喜
  • 等待多个 future 的回调

    最近我深入研究了一些使用 API 的工作 该API使用Unirest http库来简化从网络接收的工作 当然 由于数据是从 API 服务器调用的 因此我尝试通过使用对 API 的异步调用来提高效率 我的想法结构如下 通过返回 future
  • 在 showModalBottomSheet 外部单击时,如何控制传递给 Navigator.pop() 的内容?

    我启动一个模态底部工作表 然后使用返回的数据作为其未来 var modalFuture showModalBottomSheet modalFuture then data Use data 我通过以下方式从模态小部件返回数据 Naviga
  • Await.ready 和 Await.result 的区别

    我知道这是一个开放式问题 我深表歉意 我理解了Await ready回报Awaitable type while Await result回报T但我还是让他们感到困惑 两者有什么区别 一个是阻塞的 另一个是非阻塞的 它们都会阻塞直到 fut
  • Python `concurrent.futures`:根据完成顺序迭代 future

    我想要类似的东西executor map 除了当我迭代结果时 我想根据完成的顺序迭代它们 例如首先完成的工作项应该首先出现在迭代中 等等 这样 当且仅当序列中的每个工作项尚未完成时 迭代就会阻塞 我知道如何使用队列自己实现这一点 但我想知道

随机推荐

  • 测试工作中一定要学会做业务总结

    前言 在日常的测试工作中 不知道大家是否会有梳理自己测试业务的习惯 我个人觉得这个事情是值得做的 最好培养成一个习惯 另外一定要依托于业务价值来实现自己的变现 梳理被测业务 就是一种很好的自我提升方式 测试工作中一定要学会业务总结 一 为什
  • JavaWeb之xml学习笔记一(约束初步使用)

    html和xml的不同点 元素和属性 html中的元素和属性都是预先设定的 而xml中没有预想设定的元素和属性 xml是可扩张的标记语言 标记可以用户自定义元素和属性 使用目的 html使用来显示界面的 注重的是外观和功能 而xml是用来传
  • Feign远程调用 请求头丢失问题及解决方案

    问题描述 在微服务项目中 通过Feign远程调用另一个模块的接口 由于请求头没传过去导致接口调用失败 解决办法 feign调用远程接口时 会扫描所有的拦截器 执行apply方法 我们可以创建一个拦截器放到spring容器中 在拦截器里把原来
  • module ‘scipy.misc‘ has no attribute ‘imresize‘

    报错 AttributeError module scipy misc has no attribute imresize 解决方法 使用skimage库 conda install scikit image 注意 scipy misc i
  • 第十六章PHY -基于Linux3.10

    下载地址 http download csdn net detail shichaog 8620701 16 1 PHY 本章和OSI模型中的物理层和数据链路层关系密切 在嵌入式SOC上 通常集成有ARM核和MAC控制器 以及增加数据传输带
  • 信噪比和信干噪比

    1 信噪比 即香农公式 信道容量公式 中的S N C B log 2
  • java和javascript区别_java和javascript之间有什么区别

    java和javascript之间有什么区别 本篇文章就给大家介绍java和javascript之间的区别 让大家了解java和javascript是什么 它们之间的差异有哪些 有一定的参考价值 有需要的朋友可以参考一下 希望对你们有所帮助
  • 数据库实验——数据表的导入导出

    管理数据表 创建表的目在于利用表进行数据的存储和管理 对数据进行管理的前提是数据的存储 向表中添加数据 没有数据的表是没有任何实际意义的 添加完成后 用户也可以根据自己的需要对表中数据进行修改和删除 在SQL Server 2008中 对于
  • PowerDesigner显示汉字表名和英文表名

    菜单 gt Tool gt Model Options gt Name Convention gt 右侧display中选择显示name还是code 不支持同时显示 但可以选择显示code 然后将name填入stereotype中 变相同时
  • torchtext建立词表build_vocab()时使用自己的word2vec模型

    代码如下 如果对于torchtext本身不太了解 可以参考 torchtext处理文本数据 构造dataset读取文本 学习一 torchtext处理文本数据 构造dataset读取文本 学习一 from torchtext import
  • Java运行机制及运行过程

    Java核心机制 Java虚拟机 JVM Java Virtual Machine JVM是一个虚拟的计算机 具有指令集并使用不同的存储区域 负责执行指令 管理数据 内存 寄存器 包含在JDK中 对于不同的平台 有不同的虚拟机 Java虚拟
  • Java开发必学!kafka从入门到精通

    四面阿里 面试岗位是研发工程师 直接找蚂蚁金服的大佬进行内推 参与了阿里巴巴中间件部门的提前批面试 一共经历了四次面试 拿到了口头offer 一面 自我介绍 项目中做了什么 难点呢 Java的线程池说一下 各个参数的作用 如何进行的 Red
  • Could NOT find CUDNN: Found unsuitable version “..“, but required is at least “6“

    现象 在编译cuda版本的opencv4 1时 使用cmake配置时找不到cudnn 实际已安装 原因 由于安装的cudnn版本为8 2 原先记录cudnn版本的宏定义 CUDNN MAJOR和CUDNN MINOR 由cudnn h 移动
  • python--数据分析pandas

    1 pandas概述 Pandas是进行科学数据分析中另一个比较常用的数据库 基于NumPy 但加入了更多的高级数据结构以及操作工具 进一步简化了NumPy等运算与应用 1 1安装 pip install pandas 可以通过import
  • mysql主备 jdbc链接_mysql8 参考手册-使用JDBC配置连接的服务器故障转移

    MySQL Connecto J支持服务器故障转移 当基础活动连接发生与连接有关的错误时 将发生故障转移 连接错误 默认情况下 传递给客户端 其中有通过处理它们 例如 重新创建工作对象 Statement ResultSet 等 并重新启动
  • 线程结束的三种方式

    停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作 也就是放弃当前的操作 在 Java 中有以下 3 种方法可以终止正在运行的线程 使用退出标志 使线程正常退出 也就是当 run 方法完成后线程中止 使用 stop 方法强行终止线
  • QT之paintEvent事件

    当发生一下情况时会产生绘制事件并调用paintEvent 函数 1 在窗口部件第一次显示时 系统会自动产生一个绘图事件 从而强制绘制这个窗口部件 2 当重新调整窗口部件的大小时 系统也会产生一个绘制事件 3 当窗口部件被其他窗口部件遮挡 然
  • 解决小程序无法正常显示.webp格式图片的问题

    在小程序开发过程中可能会出现 微信开发者可以正常显示图片 而用iPhone预览或真机调试的时候却没有显示图片 的问题 有可能是因为图片格式iOS不支持所导致 将其图片格式转为 jpg格式即可 解决方法 判断系统是否为iOS 是 可用正则替换
  • 设备管理器没有生物识别解决方法

    Windows11的设备管理器中未显示生物识别设备 Win 电脑技术网 it资讯 游戏攻略 手机教程 电脑教程 无线路由器设置 设置无线路由器 办公软件教程 电脑系统安装 电脑维修知识 tagxp com
  • Flutter如何做到网络请求(多个网络请求)完成之后再加载页面

    很多时候我们有这样一个需求 需要在网络请求完了之后再去渲染页面 尤其是在一个界面有多个相关网络请求的时候需要处理 这里不得不提到一个系统的组件FutureBuilder 我们直接来看用法 FutureBuilder用法 单网络请求 避免重复