Flutter开发(二十一):Flutter中Future与FutureBuilder

1.什么是 Future 

2.Future 常见用法

3.什么是 FutureBuilder

4.FutureBuilder 常见用法

1.什么是 Future 

future 表示接下来的某个时间的值或错误,用 future 可以在 Flutter 实现异步操作。

Future 是 dart:async 包中的一个类,使用它需要导入 dart:async 包,Future 有两种状态:

pending        执行中

completed        执行结束,有可能成功或失败

2.Future 常见用法

使用 Future.then 获取 future 的值与捕获异常。

结合 async,await

future.whenComplete

future.timeout

使用 Future.then 获取 future 的值与捕获异常:

import 'dart:async';

Future<String> textFuture(){
  return Future.value('sucess');
}
void main() {
  //如果catchError和onError同时存在,只会调用onError
  textFuture().then((s){
    print(s);
  },onError: (e){
    print('onError:');
    print(e);
  }).catchError((e){
    print('onError:');
    print(e);
  });
}

结合 async,await:会先打印1,2,3,111。

import 'dart:async';

test() async{
  //等待1秒执行。
  int reselt = await Future.delayed(Duration(milliseconds: 1000),(){
    return Future.value(111);
  });
  print('3');
  print(reselt);
}
void main() {
  print('1');
  test();
  print('2');
}

future.whenComplete

future 结束做一些事情。then().catchError() 模式类似于 try-catch,try-catch 中有个 finally 代码块,future.whenComplete 就是 Future 的 finally 。

import 'dart:async';

void main() {
  var random = Random();
  Future.delayed(Duration(seconds: 2),(){
    if(random.nextBool()){
      return 100;
    }else{
      throw 'boom!';
    }
  }).then(print).catchError(print).whenComplete((){
    print('Future执行结束');
  });
}

future.timeout

设置超时时间,如网络请求。

import 'dart:async';

void main() {
  Future.delayed(Duration(seconds: 3),(){
      return 100;
  }).timeout(new Duration(seconds: 2)).then(print).catchError(print);
}

结果会超时:

 TimeoutException after 0:00:02.000000: Future not completed

3.什么是 FutureBuilder

它是将异步操作和异步UI更新结合在一起的类,通过它可以进行网络请求然后针对结果更新UI。

里面有三个构造函数:

future:网络请求

initialData:非空的 Future 完成前的初始化数据。

builder:回调函数,处理完成成功/失败更新UI处理结果。

4.FutureBuilder 常见用法

网络请求完成之后更新UI,详细代码:

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyApp> {
  late String result="";

  Future<CommonModel> fetchPost() async {
    final response = await http
        .get('http://www.devio.org/io/flutter_app/json/test_common_model.json');
    final result = json.decode(response.body);
    return new CommonModel.fromJson(result);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(

          appBar: AppBar(
            title: Text('Title'),
          ),
          //Stack相对布局
          body: FutureBuilder<CommonModel>(
            //开始网络请求
              future: fetchPost(),
              builder:
                  (BuildContext context,
                  AsyncSnapshot<CommonModel> snapshot) {
                //判断连接状态
                switch (snapshot.connectionState){
                  case ConnectionState.none:
                    print('没有状态');
                    return new Text('没有状态');
                  case ConnectionState.waiting:
                    //加载中
                    print('加载中');
                    return new Center(child: new CircularProgressIndicator(),);
                  case ConnectionState.done:
                    print('处理完成');
                    //处理完成失败/成功
                    if(snapshot.hasError){
                      return new Text('${snapshot.error}',
                        style: TextStyle(color: Colors.red),);
                    }else{
                      return new Column(children: [
                        Text('icon:${snapshot.data?.icon}'),
                        Text('statusBarColor:${snapshot.data?.statusBarColor}'),
                        Text('url:${snapshot.data?.url}'),
                        Text('title:${snapshot.data?.title}'),
                      ]);
                    }
                  default:
                    print('错误?');
                    return new Text('错误');
                }
              }),
      ),
    );
  }
}

class CommonModel {
  final String icon;
  final String title;
  final String url;
  final String statusBarColor;
  final bool hideAppBar;

  CommonModel(
      {required this.icon,
      required this.title,
      required this.url,
      required this.statusBarColor,
      required this.hideAppBar});

  factory CommonModel.fromJson(Map<String, dynamic> json) {
    return CommonModel(
        icon: json['icon'],
        title: json['title'],
        url: json['url'],
        statusBarColor: json['statusBarColor'],
        hideAppBar: json['hideAppBar']);
  }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值