Обновление StreamBuilder только в конце потока во Flutter - PullRequest
1 голос
/ 22 мая 2019

У меня есть этот поток, который должен обрабатывать большую рабочую нагрузку, разделенную на фреймы:

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 Ответ

2 голосов
/ 23 мая 2019

StreamBuilder будет строить свои компоненты, используя snapshot, сопровождаемый ConnectionState.done, что в вашем случае является последним значением (49), когда ваша функция _test() завершает выполнение, потому что их присваиваютпоследовательно не позволит завершить более ранние операции.

Одним из решений будет добавление Future.delayed().Который позволит каждой итерации передаваться полностью перед переходом к следующему значению.Поэтому _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;
    }
  }
...