setState() 在封闭函数返回之前不会执行

Hai*_*sen 2 dart flutter

所以我在颤振中尝试这段代码:

void main() => runApp(MyApp());

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

class _MyAppState extends State<MyApp> {
  int _i = 1;
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: MaterialButton(
            child: Text('You Pressed Me $_i'),
            onPressed: () {
              setState(() {
                _i++;
                print('inside i = $_i');
              });
              sleep(Duration(seconds: 10));
              _i++;
              print('outside i = $_i');
            }
          ),
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

预期行为(运行并按下按钮一次后):按钮显示文本"You Pressed Me 2"

然后变量_i在不影响视觉效果的情况下增加到 3。

实际行为setState()被执行,然后_i再次增加,没有视觉变化发生,即屏幕上的文本不更新,当onPressed()返回时,setState()导致小部件重建和屏幕更新,这就是出现的内容10 秒后在屏幕上显示:“你按了我 3”

文档中有关于setState() 的引用:

提供的回调会立即同步调用。它不能返回未来(回调不能是异步的),因为那时状态实际上是何时被设置的就不清楚了。

我知道调用是同步的(所以它是阻塞的,根据这个答案)所以它应该首先返回(这已经发生了)然后更新屏幕(或安排在未来的某个时间)然后将控制权返回给以下行(后两件事不会发生)。

我什至在没有睡眠的情况下尝试过,但结果相同。

那么我错过了什么或误解了什么?

Moh*_*hid 5

事件循环

  • 有一种叫做事件循环的东西

  • 事件循环按顺序处理事件

你有两个事件

事件 A => 点击 => 由用户

    0.onPressed: () {
        1.setState(() {
            3. i++
            4. Mark as widget dirty
            5. Add to the global dirty widgets list
        });
        6.i++
    });
Run Code Online (Sandbox Code Playgroud)

事件 B => Vsync 信号 => 由操作系统提供

    7. check dirty widgets list
    8. repaint
Run Code Online (Sandbox Code Playgroud)

更多的

参考:

  1. setState 方法 - 状态类 - 小部件库 - Dart API

  2. markNeedsBuild 方法 - 元素类 - 小部件库 - Dart API

  3. scheduleBuildFor 方法 - BuildOwner 类 - 小部件库 - Dart API

  4. drawFrame 方法 - WidgetsBinding 类 - 小部件库 - Dart API

  5. handleDrawFrame 方法 - SchedulerBinding 类 - 调度程序库 - Dart API

  6. buildScope 方法 - BuildOwner 类 - 小部件库 - Dart API

  7. dart 引擎循环 - Google 搜索

  8. Dart 编程 - 循环 - Tutorialspoint

  9. 优化 - Dart 2 中的最佳渲染循环是什么?- 堆栈溢出

  10. 了解 Flutter 渲染引擎_flutter_帮酷编程问答

  11. 技术概览 - Flutter

  12. Flutter - Dart API 文档

  13. flutter/spinning_square.dart at master · flutter/flutter

14 . 飞镖引擎 - Google 搜索

  1. 调度程序库 - Dart API

  2. flutter/binding.dart at master · flutter/flutter

  3. 调度程序库 - Dart API

  4. 帧调度抖动 - Google 搜索

  5. scheduleFrame 方法 - SchedulerBinding 类 - 调度程序库 - Dart API

  6. 调度程序库 - Dart API

  7. 软件包/flutter/lib/scheduler.dart - external/github.com/flutter/flutter - Google 的 Git

  8. flutter/spinning_square.dart at master · flutter/flutter

  9. 飞镖引擎 - Google 搜索

  10. 穿线| 飞镖包

  11. 隔离颤振 - Google 搜索

在此处输入图片说明


归档时间:

查看次数:

1047 次

最近记录:

4 年,8 月 前