flutter - 睡眠(持续时间)与 Future.delayed(持续时间)
问题描述
他们两个有什么区别(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'),
),
],
),
),
),
),
);
}
}
sleep:没有做我期望它做的事情:
- 一旦我将 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'),
),
],
),
),
),
),
);
}
}
解决方案
sleep
在 Dart 隔离中暂停执行指定的时间。在那段时间里什么都不会发生。
Future.delayed
安排在未来某个时间发生的操作。它是异步的,同时可以进行其他操作。
推荐阅读
- android - 设置播放器后,Android ExoPlayer 控件不起作用
- arrays - 有没有办法阻止人们在在线表格中输入另一种语言?
- python - 带有错误信息的 Euler 项目问题
- python - 在 Python 中调用函数时如何插入换行符
- wix - WIX 单包安装程序 - 每台机器快捷方式
- hadoop - 具有 HA 的现有名称服务的 Cloudera Nameservice 代理设置
- ansible - 连接字符串以在 jinja2 中创建变量
- c - 系统调用挂钩示例参数不正确
- sql - Regex Postgresql:递归删除字符串的最后一部分
- docker - nvidia-docker 在本地找不到 nvidia-smi:latest