Flutter异步01,Future、Event Queue、Microtask Queue

前言

不废话(废话后面慢慢补充),先上Flutter中 什么代码丝会被立即执行、什么代码是被添加到Microtask Queue中执行、什么代码是被添加到Event Queue中执行的 总结

总结:

scss 复制代码
  // event Queue 👇
  Future(() => print("event1"));
  Future.delayed(
      Duration.zero,
      () => print(
          "event2")); //1.即使是0也会和直接执行有区别因为是被加到了event Queue里 2.时间代表至少要等time后加入到event Queue然后等待执行 3.谁先被加入谁就先执行
  //event Queue 👆

  //microtask 👇
  
   Future.error(Exception("something went error"))
    .then((value) => print('$value xxx'))
    .catchError((error) => print(error))
    .whenComplete(() => print("Complete")); //  符合Future.error() 和 和_completed.then()
      
  scheduleMicrotask(() => print("microtask1")); // 符合 scheduleMicrotask()
  Future.microtask(() => print("microtask2")); // 符合 Future.microtask()
  Future.value("123").then((value) => print(
      "microtask3")); //因为Future.value是立即完成的,符合_completed.then(),所以被加入到了microtask
  //microtask 👆

  print("main 1");
  //立即执行 👇
  Future.sync(() => print("sync 1")); // 符合 Future.sync()
  //不会放到Event Queue里,会立即执行
  Future.value(getName()); // 符合 Future.value()
  Future.delayed(Duration(seconds: 1), () => print('delayed'))
  .then((value) {
    scheduleMicrotask(() => print('Microtask'));
    print('then');
  })
  .then((value) => print('then2'));//这个delayed并不是立即执行。这里打印顺序delayed>then>then2>Microtask,想说明_.then()的内容先于Microtask执行
  print("main 2");
  //立即执行 👆
  
vbnet 复制代码
// 直接执行
flutter: main 1
flutter: sync 1
flutter: getName
flutter: main 2

// Microtask Queue
flutter: Exception: something went error
flutter: Complete
flutter: microtask1
flutter: microtask2
flutter: microtask3

// Event Queue
flutter: event1
flutter: event2
flutter: delayed
flutter: then
flutter: then2
flutter: Microtask

直接运行的代码

  1. Future.sync()
  2. Future.value()
  3. _.then() (Future完成的瞬间有then里的内容会马上执行)

例子:

scss 复制代码
  String getName() {
    print("getName");
    return "bob";
  }

  print("main 1");
  //立即执行 👇
  
  Future.sync(() => print("sync 1")); // 符合 Future.sync()
  //不会放到Event Queue里,会立即执行
  Future.value(getName()); // 符合 Future.value()
  
  //这个delayed并不是立即执行。这里打印顺序delayed>then>then2>Microtask,想说明_.then()的内容先于Microtask执行
  Future.delayed(Duration(seconds: 1), () => print('delayed'))
  .then((value) {
    scheduleMicrotask(() => print('Microtask'));
    print('then');
  })
  .then((value) => print('then2')); 
  
  print("main 2");
  //立即执行 👆
  
  // 最终打印
  // main 1
  // sync 1
  // getName
  // main 2
  // delayed
  // then
  // then2
  // Microtask
  

Event Queue

  1. Future()
  2. Future.delayed()
    1. 即使是0也会和直接执行有区别因为是被加到了event Queue里
    2. 时间代表至少要等time后加入到event Queue然后等待执行
    3. 谁先被加入谁就先执行

例子:

scss 复制代码
  //一个盒子 符合 Future()
  Future<String> getFuture() {
    return Future(() => "alice");
  }
  //一个延迟1s的盒子 符合 Future.delayed()
  ////1.即使是0也会和直接执行有区别因为是被加到了event Queue里 2.时间代表至少要等time后加入到event Queue然后等待执行 3.谁先被加入谁就先执行
  Future<String> getFuturrDelayed() {
    return Future.delayed(Duration(seconds: 0), () => "alice Delayed");
  }
  
  void _incrementCounter() {
    //then代表打开了这个盒子后
    //catchError 打开后发现问题
    getFuturrDelayed().then((value) => print(value));
    getFuture().then((value) => print(value)); 
    print("hi");
  }
  
  // 最终打印
  // hi
  // alice
  // alice Delayed
  
  void _incrementCounter() async {
    //then代表打开了这个盒子后
    //catchError 打开后发现问题
    var name = await getFuture();
    print("hi");
  }
  
  // 最终打印
  // alice
  // hi

await 代表先等待当前Future执行完毕后再继续执行下面的内容

Microtask Queue

  1. scheduleMicrotask()

  2. Future.microtask()

  3. _completed.then() (已经完成了的Future有then里的内容会优先执行)

  4. Future.error()

    scss 复制代码
     Future.error(Exception("something went error")) //  抛出异常
    .then((value) => print('$value xxx')) // 非异常情况下的打印
    .catchError((error) => print(error)) // 捕获异常
    .whenComplete(() => print("Complete")); // 结束时 

例子:

scss 复制代码
  //microtask 👇

  // 符合Future.error()和_completed.then()
  Future.error(Exception("something went error"))
    .then((value) => print('$value xxx'))
    .catchError((error) => print(error))
    .whenComplete(() => print("Complete"));

  scheduleMicrotask(() => print("microtask1")); // 符合 scheduleMicrotask()
  Future.microtask(() => print("microtask2")); // 符合 Future.microtask()
  Future.value("123").then((value) => print(
      "microtask3")); //因为Future.value是立即完成的,符合_completed.then(),所以被加入到了microtask
  //microtask 👆
  
  // 最终打印
  //   something went error
  //   Complete
  //   microtask1
  //   microtask2
  //   microtask3
相关推荐
空中海20 小时前
7.1 Flutter 性能模型
flutter
weixin_4434785120 小时前
Flutter学习之第三方组件:视频播放器控件
学习·flutter·音视频
空中海1 天前
11 Flutter 进阶与原理解析
flutter
于慨1 天前
项目flutter运行环境汇总
flutter
空中海1 天前
10 Flutter 测试与发布
flutter
空中海1 天前
12 Flutter 实战项目与最佳实践
flutter
里欧跑得慢1 天前
Flutter 测试全攻略:从单元测试到集成测试的完整实践
前端·css·flutter·web
键盘鼓手苏苏2 天前
Flutter 三方库 pip 的鸿蒙化适配指南 - 实现标准化的画中画(Picture-in-Picture)模式、支持视频悬浮窗与多任务并行交互
flutter·pip·harmonyos
左手厨刀右手茼蒿2 天前
Flutter 组件 sheety_localization 的适配 鸿蒙Harmony 实战 - 驾驭在线协作式多语言管理、实现鸿蒙端动态词条下发与全球化敏捷发布方案
flutter·harmonyos·鸿蒙·openharmony·sheety_localization