Flutter Widgets 之 FutureBuilder-LMLPHP


展示异步任务状态


当有一个Future(异步)任务需要展示给用户时,可以使用FutureBuilder控件来完成,比如向服务器发送数据成功时显示成功提示:

效果如下:

Flutter Widgets 之 FutureBuilder-LMLPHP


在Future任务中出现异常如何处理,下面模拟出现异常,修改_future:


效果如下:

Flutter Widgets 之 FutureBuilder-LMLPHP


builder是FutureBuilder的构建函数,在这里可以判断状态及数据显示不同的UI,

ConnectionState的状态包含四种:nonewaitingactivedone,但我们只需要关注done状态,此状态表示Future执行完成,snapshot参数的类型是AsyncSnapshot<T>


ListView加载网络数据


FutureBuilder还有一个比较常用的场景:网络加载数据并列表展示,这是一个非常常见的功能,在网络请求过程中显示loading,请求失败时显示失败UI,成功时显示成功UI。


模拟成功网络请求,通常会返回json字符串:


构建FutureBuilder控件:


构建loading控件:


构建网络加载失败控件:

数据加载成功,构建数据展示控件:


效果如下:

Flutter Widgets 之 FutureBuilder-LMLPHP


模拟网络加载失败:

效果如下:

Flutter Widgets 之 FutureBuilder-LMLPHP


通过上面的示例说明FutureBuilder控件极大的简化了异步任务相关显示的控件,不再需要开发者自己维护各种状态以及更新时调用`State.setState`。


防止FutureBuilder重绘


FutureBuilder是一个StatefulWidget控件,如果在FutureBuilder控件节点的父节点重绘`rebuild`,那么FutureBuilder也会重绘,这不仅耗费不必要的资源,如果是网络请求还会消耗用户的流量,这是非常糟糕的体验,如何解决这个问题?


通过源代码发现FutureBuilder重绘逻辑是这样的:


FutureBuilder在重建时判断旧的future和新的future是否相等,如果不相等才会重建,所以我们只需要让其相等即可,有人可能会以为设置的future是同一个函数,如下:

上面的方式是不相等的,是错误的用法,可以将_future方法赋值给变量:

这才是正确的用法。


更多相关阅读:

本文分享自微信公众号 - 老孟Flutter(lao_meng_qd)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

09-04 03:27