Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
User interface StreamBuilder仅在颤振中的流结束时更新_User Interface_Dart_Flutter_Stream - Fatal编程技术网

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),(){
});
产量一;
}
}