我有这个流,应该可以处理按帧细分的繁重工作量:
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;
}
}
然后使用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();})
],
),
),
);
}
但是当我执行代码时,i
的所有值(从0到49)都会打印一点点延迟,因此_test
流不是瞬时的。但是用户界面仅在49更新,因此在流结束时。
我做错什么了吗?
答案 0 :(得分:2)
StreamBuilder
将使用带有snapshot
的{{1}}来构建其组件,在您的情况下,它是ConnectionState.done
函数完成执行时的最后一个值(49),因为连续分配它们将无法完成较早的操作。
一个解决方案是添加_test()
。这将允许在移至下一个值之前将每个迭代完全流式传输。因此,Future.delayed()
应该修改为:
_test()