StreamBuilder仅在Flutter中的流末端更新

时间:2019-05-22 17:33:34

标签: 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;
  }
}

然后使用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更新,因此在流结束时。

我做错什么了吗?

1 个答案:

答案 0 :(得分:2)

StreamBuilder将使用带有snapshot的{​​{1}}来构建其组件,在您的情况下,它是ConnectionState.done函数完成执行时的最后一个值(49),因为连续分配它们将无法完成较早的操作。

一个解决方案是添加_test()。这将允许在移至下一个值之前将每个迭代完全流式传输。因此,Future.delayed()应该修改为:

_test()