Сделать поток в StreamBuilder только один раз - PullRequest
0 голосов
/ 29 июня 2019

У меня есть циклы тяжелой функции X раз.Если я помещу этот поток в StreamBuilder, поток будет работать снова и снова навсегда, но мне нужно, чтобы он запускался только один раз (выполните X циклов) и остановился.

Чтобы решить эту проблему для будущих функций, я использовал AsyncMemoizer, но не могу использовать его для потоковых функций.

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

Как предложил Реми Русселе, StreamBuilder должен использоваться в дереве виджетов, где состояние хорошо управляется.Я вызывал setState((){}) в потоке, что заставляло пользовательский интерфейс обновляться каждый раз, заставляя StreamBuilder перестраивать, перезапуская поток.

0 голосов
/ 29 июня 2019

Если вы уверены, что ваш виджет не должен быть перестроен, попробуйте что-то вроде этого кода ниже. _widget будет создан один раз в initState, затем в методе сборки будет возвращен «кэшированный» виджет.

class MyStreamWidget extends StatefulWidget {
  @override
  _MyStreamWidgetState createState() => _MyStreamWidgetState();
}

class _MyStreamWidgetState extends State<MyStreamWidget> {
  StreamBuilder _widget;
  // TODO your stream
  var myStream;

  @override
  void initState() {
    super.initState();
    _widget = StreamBuilder(
      stream: myStream,
        builder: (context, snapshot) {
          // TODO create widget
          return Container();
        })
  }

  @override
  Widget build(BuildContext context) {
    return _widget;
  }
}
...