有两页:第1页和第2页。
page1将List<Future>
传递给page2,page2执行这些期货。
下面是所有的源代码:
class _Page1 extends StatelessWidget {
const _Page1({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('page 1'),
),
body: ElevatedButton(
child: Text('push page 2'),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => _Page2(
requests: [_load1(), _load2()],
),
),
);
},
),
);
}
Future<void> _load1() {
return Future.delayed(Duration(seconds: 1), () {
log('load1 finish');
});
}
Future<void> _load2() {
return Future.delayed(Duration(seconds: 2), () {
log('load2 finish');
});
}
}
class _Page2 extends StatelessWidget {
const _Page2({Key? key, required this.requests}) : super(key: key);
final List<Future> requests;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('page 2'),
),
body: ElevatedButton(
child: Text('future wait'),
onPressed: () {
Future.wait(requests).then((value) {
log('all finish');
});
},
),
);
}
}
第一次点击page2按钮,记录:load1 finish
、load2 finish
、all finish
。
但是第一次之后,它只有log all finish
。
为什么?每次点击page2按钮时,如何将其更改为日志load1 finish
,load2 finish
,all finish
?
2条答案
按热度按时间njthzxwz1#
_Page2中的列表
requests
是一个future的列表,而不是一个函数,这意味着它只返回一次性的结果。所以当你说Future.wait(requests)时,你是在告诉它只监听已经完成的返回结果,而不是要求它执行函数。如果你想在点击'future wait'按钮后执行函数,你必须将列表转换为函数。
所以现在你从page1传递对象如下:
所以现在你在执行
request
列表中的函数后调用future wait来执行它的函数,如下所示:u4dcyp6a2#
为什么?
因为它们完成了。它们已经完成了。如果你想再次运行它们,你必须创建新的
Future
。