【发布时间】:2020-09-24 00:04:18
【问题描述】:
他们两个有什么区别(sleep vs Future.delayed)?在这两种情况下,幕后发生了什么?
我不明白以下示例中的不同结果。
Future.delayed: 做我期望它做的事情:
- setState 重建小部件并将矩形着色为黑色
- 然后等待 10 秒
import 'package:flutter/material.dart';
import 'dart:io';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Color appColor = Colors.green;
changeColors() async {
setState(() {
appColor = Color(0xff000000);
});
await Future.delayed(Duration(seconds: 10));
print('after 10 seconds');
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: SafeArea(
child: Center(
child: Column(
children: [
Container(height: 100, width: 100, color: appColor),
FlatButton(
onPressed: () => changeColors(),
child: Text('click me'),
),
],
),
),
),
),
);
}
}
睡眠:没有做我期望它做的事情:
- 一旦我将 appColor 更改为黑色,setState 就不会重建小部件树。为什么不呢?
- 等待 10 秒
- 然后不知从何而来,小部件树正在重建,矩形的颜色变成黑色:为什么?
import 'package:flutter/material.dart';
import 'dart:io';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Color appColor = Colors.green;
changeColors() {
setState(() {
appColor = Color(0xff000000);
});
sleep(Duration(seconds:10));
print('after 10 seconds');
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: SafeArea(
child: Center(
child: Column(
children: [
Container(height: 100, width: 100, color: appColor),
FlatButton(
onPressed: () => changeColors(),
child: Text('click me'),
),
],
),
),
),
),
);
}
}
【问题讨论】:
-
嗯...太奇怪了。我刚刚在 diff 计算机上尝试了我的原始示例,突然两个示例的行为方式相同(在查看窗口时)。唯一的区别在于控制台,因为 sleep 会引发一些错误。这怎么可能?有什么线索吗?