Как бороться с плотными бесконечными потоками? - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь написать во Флаттере полностью реактивный пример hello-world, в частности, простой счетчик.Здесь у меня есть нуль-поток от кнопки «+1», который срабатывает при нажатии кнопки:

class ReactiveButton extends StatelessWidget {
  final _controller = StreamController();
  Stream<void> pressedEvent;
  final text;

  ReactiveButton({this.text = ""}) {
    pressedEvent = _controller.stream;
  }

  @override
  Widget build(BuildContext context) {
    return RaisedButton(
      onPressed: () => _controller.sink.add(null),
      child: Text(text),
    );
  }
}

Я хочу преобразовать этот поток в последовательность натуральных чисел для подачи в RxText,Поэтому я использую метод zipWith из rxdart с плотным потоком натуральных чисел, отбрасывая нулевое значение.Теперь проблема в том, что использование потока натуральных чисел, созданного узким циклом while (true), приводит к бесконечному циклу, потому что (предположительно) поток никогда не возвращает управление между yield s:

Stream<int> naturals() async* {
  int count = 0;
  while (true) {
    yield count++;
  }
}

В качестве альтернативы,Я могу использовать конструктор Stream.periodic с периодом, близким к нулю.Тем не менее, это приводит к тому, что мое приложение постепенно становится вялым (предположительно, из-за того, что потоки бесконечно бессмысленно считаются).

Итак, мне нужен ленивый поток, который выдает значения только при запросе (немедленно).Это на самом деле звучит как Iterable, но для Iterable у меня нет метода, чтобы сжать его потоком.Я думал о реализации функции, которая принимает список потоков / итераций и возвращает поток списков, работая более или менее как обычная молния.Это кажется довольно сложным, и я не уверен, что смогу написать готовую реализацию.

Вопрос в том, какие у меня варианты?Есть ли готовое решение для этого?Должен ли я вообще попытаться стать полностью реактивным с Флаттером?

...