所以我在颤振中尝试这段代码:
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() 的引用:
提供的回调会立即同步调用。它不能返回未来(回调不能是异步的),因为那时状态实际上是何时被设置的就不清楚了。
我知道调用是同步的(所以它是阻塞的,根据这个答案)所以它应该首先返回(这已经发生了)然后更新屏幕(或安排在未来的某个时间)然后将控制权返回给以下行(后两件事不会发生)。
我什至在没有睡眠的情况下尝试过,但结果相同。
那么我错过了什么或误解了什么?
有一种叫做事件循环的东西
事件循环按顺序处理事件
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)
7. check dirty widgets list
8. repaint
Run Code Online (Sandbox Code Playgroud)
这是 Flutter in Focus 系列的 YouTube 视频
或者在这里阅读
14 . 飞镖引擎 - Google 搜索
归档时间: |
|
查看次数: |
1047 次 |
最近记录: |