如何利用FutureBuilder提高开发效率

来自:互联网
时间:2020-05-26
阅读:
免费资源网 - https://freexyz.cn/

常见场景

展示请求按钮 用户点击按钮,显示loading 展示数据或者错误

如何利用FutureBuilder提高开发效率

抽象模式

  1. 展示请求按钮(初始状态) 用户点击按钮,显示loading(请求中状态) 展示数据或者错误 (结束状态(成功或失败))

转换成程序语言

以上三种现实情况对应 AsyncSnapshot 三个状态

ConnectionState.none 初始态 ConnectionState.waiting 请求态 ConnectionState.done 完成态 snapshot.hasError 完成(异常) snapshot.hasData  完成(正常)

使用 FutureBuilder 处理这个场景

这篇文章的主角,FutureBuilder 就是为了解决这个问题存在的。它接收一个 Future 请求,和对应以上几种情况的 widget 回调。即可把数据和界面串联起来,避免额外声明仅用来传递数据用的变量。

提前声明了一个 _showResult 变量,以表示页面是否触发请求。

并且封装了一个 _fetch() 网络请求。

Future<Map> _fetch() async {
 return (await Dio().get("https://jsonplaceholder.typicode.com/users/1"))
 .data;
}

请求的结果是任意的,不管是封装好的对象,map,list,都可以,只要是一个 Future<T>
把这个 Future 调用安放到 FutureBuilder 的 future 参数上, 并用 _showResult 来控制何时来触发这个请求。

FutureBuilder(
 future: _showResult ? _fetch() : null,
 ...
)

再把每一个 Future 的结果对应的 widget 设置到 builder 参数上:

FutureBuilder(
 ...
 builder: (context, snapshot) {
  switch (snapshot.connectionState) {
  case ConnectionState.none: // -------- 初始态
   return RaisedButton(
   onPressed: () {
    setState(() {
    _showResult = true; // 点击按钮,触发请求
    });
   },
   child: Text("start"),
   );
  case ConnectionState.waiting: // -------- 请求态
   return CircularProgressIndicator();
  case ConnectionState.done: // -------- 完成态
   if (snapshot.hasError) { // 异常
   return Text(
    '${snapshot.error}', 
    style: TextStyle(color: Colors.red),
   );
   } else { // 正常
   return Text(snapshot.data["name"]);
   }
   break;
  default:
   break;
  }
  return Container();
 },
 ),

FutureBuilder 把数据请求的 Future<T> 中的数据 T 通过 Builder 的 ConnectionState 衍生出所有可能性,并在每个可能性里 return 一个 Widgets。最终实现了 state -> UI 的目的

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。

免费资源网 - https://freexyz.cn/
返回顶部
顶部