flutter 之 Dart 异步编程【详解】

简介: flutter 之 Dart 异步编程【详解】

Dart是一种单线程模型的语言,通过将程序中耗时的任务尽量放在运行后期执行实现异步编程,具体依赖事件循环机制。

事件循环

共两个异步队列,分别是事件队列(eventqueue)和微任务队列(microtaskqueue)

每当遇到耗时任务,就将它们放入异步队列,等其他任务执行完后,事件循环就会循环获取两个队列中的异步任务来执行。

事件循环机制如下图:

  1. 执行同步任务
  2. 执行微任务(微任务清空前,事件将一直等待执行)
  3. 执行事件

微任务队列

用来放入一些耗时相对较短的异步任务。

通过调用async包下的scheduleMicrotask()方法可以将自定义的耗时任务放入微任务队列中。

import 'dart:async';

void firstTask() {
  for (int i=0; i<100000; i++) {
    doSomethings();
  }
  print("任务一执行结束");
}

void main() {
  scheduleMicrotask(firstTask);
  secondTask();
}

执行结果

任务二开始执行
任务一执行结束
  • Flutter源代码中,微任务队列通常用于资源释放等需要立即执行的操作
  • 应用开发中尽量不使用微任务队列,而使用事件队列作为异步任务的载体

事件队列

大部分耗时任务放在事件队列中,包括所有的外部任务(如键盘事件、手势事件、渲染事件、计时器等)

通过使用async包下的Future类可以将自定义的耗时任务放入事件队列中。

Future类提供了Future()和Future.delayed()两个构造函数。

立即放入事件队列 Future()

// 立即将任务放入事件
Future(() {
  // 异步代码
  print('异步任务');
});

Future()内的代码会在同步任务和微任务之后运行,这个异步任务执行完之后,可以通过它的then()方法在异步任务完成后接收到通知,执行下一步操作。

Future(() {
  print('Future异步任务');
}).then((_) {
  print('Future任务完成,下一步操作');
});

延后放入事件队列 Future.delayed()

用于在之后的某个时间点将任务放入事件队列中。

// 1s后将任务放入事件对中
new Future.delayed(const Duration(seconds:1), () {
  // 异步代码
});

综合范例:

void main(){
    print('同步任务一');

    Future(() {
      print('Future任务');
      return 'msg';
    }).then((v) {
      print('Future任务完成并接收到 $v');
    });

 scheduleMicrotask(() {
      print('Microtask任务');
    });

    print('同步任务二');
}
同步任务一
同步任务二
Microtask任务
Future任务
Future任务完成并接收到msg
目录
相关文章
|
26天前
|
开发框架 Dart 前端开发
Flutter 是谷歌推出的一款高效跨平台移动应用开发框架,使用 Dart 语言,具备快速开发、跨平台支持、高性能、热重载及美观界面等特点。
Flutter 是谷歌推出的一款高效跨平台移动应用开发框架,使用 Dart 语言,具备快速开发、跨平台支持、高性能、热重载及美观界面等特点。本文从 Flutter 简介、特点、开发环境搭建、应用架构、组件详解、路由管理、状态管理、与原生代码交互、性能优化、应用发布与部署及未来趋势等方面,全面解析 Flutter 技术,助你掌握这一前沿开发工具。
56 8
|
3月前
|
Dart
如何在 Flutter 项目中使用 Dart 语言?
如何在 Flutter 项目中使用 Dart 语言?
137 58
|
1月前
|
Dart
flutter dart mixin 姿势
flutter dart mixin 姿势
|
2月前
|
Dart 开发者 Windows
flutter:dart的学习
本文介绍了Dart语言的下载方法及基本使用,包括在Windows系统上和VSCode中的安装步骤,并展示了如何运行Dart代码。此外,还详细说明了Dart的基础语法、构造函数、泛型以及库的使用方法。文中通过示例代码解释了闭包、运算符等概念,并介绍了Dart的新特性如非空断言操作符和延迟初始化变量。最后,提供了添加第三方库依赖的方法。
34 12
|
2月前
|
机器学习/深度学习 开发框架 Dart
Flutter asynchronous 异步编程技巧
本文深入探讨了Flutter中的异步编程技巧,包括Future、Microtask及并发处理的最佳实践。文章详细讲解了Future.wait、FutureBuilder和Microtask的应用,帮助开发者提升应用性能。通过实例演示了如何利用Future.wait实现并发执行,FutureBuilder简化UI构建,以及Microtask的高优先级执行特性。适合希望优化Flutter应用异步性能的开发者阅读。
|
4月前
|
Dart 前端开发 JavaScript
Flutter&Dart-异步编程Future、Stream极速入门
Flutter&Dart-异步编程Future、Stream极速入门
89 4
Flutter&Dart-异步编程Future、Stream极速入门
|
4月前
|
Dart JavaScript 前端开发
Dart或Flutter中解决异常-type ‘int‘ is not a subtype of type ‘double‘
Dart或Flutter中解决异常-type ‘int‘ is not a subtype of type ‘double‘
156 4
|
4月前
|
Dart 开发工具 Android开发
Android Studio导入Flutter项目提示Dart SDK is not configured
Android Studio导入Flutter项目提示Dart SDK is not configured
389 4
|
4月前
|
Dart 安全 API
Android跨平台开发之Dart 3.5 与 Flutter 3.24:革新跨平台应用开发
【Dart 3.5 与 Flutter 3.24:革新跨平台应用开发】首发于公众号“AntDream”。本文深度解析 Dart 3.5 和 Flutter 3.24 的新特性,包括空安全强化、Web 与原生互操作性增强及 Flutter GPU API 等,展示了如何提升代码质量和用户体验。
69 1
|
4月前
|
Dart 开发工具
消除Flutter doctor的警告Warning: `dart` on your path resolves to xxx/bin/dart
消除Flutter doctor的警告Warning: `dart` on your path resolves to xxx/bin/dart
87 0