Я пытаюсь написать во Флаттере полностью реактивный пример 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
у меня нет метода, чтобы сжать его потоком.Я думал о реализации функции, которая принимает список потоков / итераций и возвращает поток списков, работая более или менее как обычная молния.Это кажется довольно сложным, и я не уверен, что смогу написать готовую реализацию.
Вопрос в том, какие у меня варианты?Есть ли готовое решение для этого?Должен ли я вообще попытаться стать полностью реактивным с Флаттером?