User interface StreamBuilder仅在颤振中的流结束时更新
我有这样一个流,它应该处理细分为帧的繁重工作负载:User interface StreamBuilder仅在颤振中的流结束时更新,user-interface,dart,flutter,stream,User Interface,Dart,Flutter,Stream,我有这样一个流,它应该处理细分为帧的繁重工作负载: Stream<int> _test() async* { for(int i = 0; i < 50; i++){ ///Heavy workload simulation for(int x = 0; x < 100000; x++){ double _r = Random().nextDouble(); } print(i); yield i; } } Stream\u test(
Stream<int> _test() async* {
for(int i = 0; i < 50; i++){
///Heavy workload simulation
for(int x = 0; x < 100000; x++){
double _r = Random().nextDouble();
}
print(i);
yield i;
}
}
Stream\u test()异步*{
对于(int i=0;i<50;i++){
///重负荷模拟
对于(int x=0;x<100000;x++){
double _r=Random().nextDouble();
}
印刷品(一);
产量一;
}
}
然后,我将使用StreamBuilder显示一个简单的指示器:
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
children: <Widget>[
StreamBuilder<int>(
stream: _test(),
initialData: 0,
builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
return Text(
'${snapshot.data}',
);
},
),
RaisedButton(onPressed: () {_test();})
],
),
),
);
@覆盖
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子:列(
儿童:[
StreamBuilder(
流:_test(),
初始数据:0,
生成器:(BuildContext上下文,异步快照){
返回文本(
“${snapshot.data}”,
);
},
),
RaisedButton(按下时:({u test();})
],
),
),
);
}
但是,当我执行代码时,I
(从0到49)的所有值都会以一点延迟打印出来,因此\u test
流不是瞬时的。但是UI只在49时更新,所以当流结束时
我做错了吗?将使用快照
以及ConnectionState.done
,构建其组件,在您的情况下,这是\u test()
函数完成执行时的最后一个值(49),因为连续分配它们将不允许较早的操作完成
一种解决方案是添加Future.delayed()
。这将允许每个迭代在移动到下一个值之前完全流化。因此应将\u test()
修改为:
Stream<int> _test() async* {
for(int i = 0; i < 50; i++){
///Heavy workload simulation
for(int x = 0; x < 100000; x++){
double _r = Random().nextDouble();
}
print(i);
// Delay duration is arbitrarily chosen
await Future.delayed(Duration(milliseconds:10), () {
});
yield i;
}
}
Stream\u test()异步*{
对于(int i=0;i<50;i++){
///重负荷模拟
对于(int x=0;x<100000;x++){
double _r=Random().nextDouble();
}
印刷品(一);
//延迟持续时间是任意选择的
等待未来。延迟(持续时间(毫秒:10),(){
});
产量一;
}
}