题记
—— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天。

** 你可能需要
CSDN 网易云课堂教程
掘金 EDU学院教程
知乎 Flutter系列文章

本文是异步编程的延时策略篇章,在Flutter中实现延时操作有两种方式,一种是通过Future,另一种是通过Timer。


1 Future

在Flutter中实现延时 1秒的操作,使用Fluture来实现,代码如下:

    ///代码清单 1-1 ///方式一///参数一 延时的时间///参数二 延时执行的方法Future.delayed(Duration(milliseconds: 1000), () {print("延时1秒执行");});
    ///代码清单 1-2///方式二Future.delayed(Duration(milliseconds: 1000)).whenComplete((){print("延时1秒执行 whenComplete ");});
    ///代码清单 1-3///方式二Future.delayed(Duration(milliseconds:1000)).then((value){print("延时1秒执行 then ");});

在上述代码清单 1-1、1-2、1-3中分别展示了使用Future的延时操作的三种方式,这三种方式 是小编实现延时操作的一些思路,一般建议使用代码清单1-1中所示的第一种,对于代码清单1-2与1-3中所示的whenComplete与then函数,功能更强大,应当用到合适的位置。

Future的then函数返回值类型为一个Future对象,所以支持链式调用,组合在一起就是串行方式调用,如下代码块 1-4 中所示:

    ///代码清单 1-4Future.delayed(Duration(milliseconds: 1000), () {print("延时1秒执行");return Future.value("测试数据");}).then((value) {//函数一print(" then  $value");return Future.value("测试数据 2");}).then((value) {///函数二print(" then  $value");return Future.value("测试数据 2");}).then((value) {//函数三///value 就是 函数一中回传的值print(" then  $value");});

假如在then函数中任何一个环节出现了异常,那么后续的函数将会被中断执行(如清单1-4中的then函数一出现了问题,then函数二与三就都不会执行)相当于是程序线程停止在这里了,对于手机界面来讲就是无响应或者是红屏显示。

在代码清单1-3中所示的whenComplete方法,并返回一个Future,类似于try-catch-finally中的finally块,所以用whenComplete来结尾多个异步操作是一个合适的解决方案,如下代码清单1-5所示

/// 代码清单 1-5Future.delayed(Duration(milliseconds: 1000), () {print("延时1秒执行");return Future.value("测试数据");}).then((value) {//函数一print(" then  $value");return Future.value("测试数据 2");}).then((value) {///函数二print(" then  $value");throw 'Error!';return Future.value("测试数据 3");}).then((value) {//函数三///value 就是 函数一中回传的值print(" then  $value");}).catchError((err) {print('Caught $err'); // Handle the error.},test: (e){print('Caughte  $e'); // Hanreturn e is String;}).whenComplete((){print("程序执行完成");});

在代码清单 1-5中也使用到了catchError函数,在这里,当then这几个函数中任何一个处理出现 异常,都会回调此方法,如这里在函数二中通过 throw抛出的一个异常,在catchError函数中捕捉到这个异常,然后回调test方法块,再回调catchError的参数一的函数处理,类似try-catch-finally中的catch,它的定义如下代码清单1-6所示:

/// 代码清单 1-6Future<T> catchError(Function onError, {bool test(Object error)});

2 Timer

通过Timer来实现延时2秒的操作,如下代码清单 2-1 所示:

    ///延时2秒Timer timer =  new Timer(Duration(milliseconds: 2000), (){});

相比来讲 Future中实现的延时操作也是通过Timer来实现的,在实际开发中,如果只是一个单纯的延时操作,小编建议使用Timer,如下代码清单2-2所示,在当前Widget销毁时取消延时任务,可避免内存泄漏。

class _TimerDelayedTestPageState extends State{///声明Timer timer;@overridevoid initState() {super.initState();///延时2秒timer =  new Timer(Duration(milliseconds: 2000), (){});}@overridevoid dispose() {///取消延时任务timer.cancel();super.dispose();}... ... }

完毕

Flutter延时任务、Flutter通过Future与Timer实现延时任务相关推荐

  1. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 完整代码示例 )

    文章目录 前言 一.Android 端完整代码示例 二.Flutter 端完整代码示例 三.相关资源 前言 前置博客 : [Flutter]Flutter 混合开发 ( Flutter 与 Nativ ...

  2. Flutter实战一Flutter聊天应用(二十)

    在上一篇文章<Flutter实战一Flutter聊天应用(十九)>中,我们完成了删除用户的逻辑,就是将会话的有效性设置为false就可以了.那么当会话的有效性为false时,用户再次添加该 ...

  3. Flutter实战一Flutter聊天应用(十六)

    在上一篇文章<Flutter实战一Flutter聊天应用(十五)>中,我们完成了登陆屏幕.在用户登陆成功后,会在本地创建一个LandingInformation文件,以使应用程序在启动时可 ...

  4. Flutter实战一Flutter聊天应用(十五)

    在上一篇文章<Flutter实战一Flutter聊天应用(十四)>中,我们完成了注册屏幕.为了保持应用程序入口只有一个,即登陆屏幕,用户注册完成之后会返回手机号码.密码到登陆屏幕,让用户点 ...

  5. Flutter 内幕:Flutter 在内部是如何工作的?

    Flutter 内部是如何工作的?Widgets.Elements.BuildContext 到底是什么东西?为什么 Flutter 可以运行那么快?为什么有时候运行的效果并不符合我们的预期?什么是所 ...

  6. 【Flutter】开发 Flutter 包和插件 ( 开发 Dart 插件包 | 发布 Dart 插件包 )

    文章目录 前言 一.开发 Dart 包内容 二.配置 pubspec.yaml 三.编写 Dart 包使用说明 四.编写 Dart 包授权许可 五.设置版本变更记录 六.验证 Dart 包正确性 七. ...

  7. 【Flutter】开发 Flutter 包和插件 ( Flutter 包和插件简介 | 创建 Flutter 插件 | 创建 Dart 包 )

    文章目录 一.Flutter 包和插件简介 二.创建 Flutter 插件 1.Android Studio 中可视化创建 2.命令行创建 三.创建 Dart 包 1.Android Studio 中 ...

  8. 【Flutter】自定义 Flutter 组件 ( 创建自定义 StatelessWidget、StatefulWidget 组件 | 调用自定义组件 )

    文章目录 一.Flutter 组件简介 二.Flutter 自定义 StatelessWidget 组件流程 1.导入父类包 2.选择继承的父类 3.设置成员变量及构造函数 4.重写 build 方法 ...

  9. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 MethodChannel 通信 )

    文章目录 前言 一.Android 端 MethodChannel 构造函数 二.Android 端 setMethodCallHandler 方法 三.Android 端实现 MethodChann ...

最新文章

  1. javascript之原型
  2. 2.3.NLTK工具包安装、分词、Text对象、停用词、过滤掉停用词、词性标注、分块、命名实体识别、数据清洗实例、参考文章
  3. extjs 方法执行顺序_TestNG之注解变压器amp;方法拦截器
  4. 寻找最大的K个数(下)
  5. php CURL带有验证码验证登录的例子
  6. 阅读邮件回复邮件计算机操作题,《电子邮件》阅读练习题附答案
  7. paip.提升性能---- 网站并发数的总结.txt
  8. lcd显示c语言程序,LCD1602液晶显示(51单片机c语言)
  9. java数组按大小排序_Java数组排序
  10. Linux/Ubuntu20 安装 TP-link(RTL8812AU) 无线网卡驱动
  11. IP的正则表达式 IP地址的正则表达式写法
  12. Cesium基础知识-创建3D地球
  13. 科思创为全新概念车丰田LQ提供可持续解决方案
  14. 声学感知刻度(mel scale、Bark scale、ERB)与声学特征提取(MFCC、BFCC、GFCC)
  15. docker使用-p参数映射端口失败
  16. 阿里云ACP认证有用吗?
  17. Joystick Shield 的使用方法
  18. 用c语言交通信号灯论文,plc交通信号灯毕业论文.doc
  19. java判断回文用valueof_回文判断 - 平行宇宙 - ITeye博客
  20. STM32入门开发--LED模块实现跑马灯

热门文章

  1. Blazeface 人脸检测器
  2. 百度大脑公开课!快速定制高精度计算机视觉模型
  3. 一篇文章带你了解Python运算符重载
  4. 祝贺!港中文助理教授周博磊宣布加入UCLA
  5. 指南 | Pytorch定义网络的几种方法
  6. 哥大首位华裔女校长:人工智能的春天来了
  7. 收藏 | 使用 Mask-RCNN 在实例分割应用中克服过拟合
  8. 招生 | 上海交通大学人工智能课题组招收博士生
  9. 机器学习(八)支持向量机svm终结篇
  10. C++ vector类型要点总结(以及各种algorithm算法函数)