我正在尝试用Flutter编写一个完全反应性的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
中。因此,我将rxdart中的zipWith
方法与大量自然数一起使用,并丢弃了空值。现在的问题是,使用紧密的while (true)
循环创建的自然数流会导致无限循环,因为(大概)该流永远不会在yield
s之间返回控制权:
Stream<int> naturals() async* {
int count = 0;
while (true) {
yield count++;
}
}
或者,我可以使用周期接近零的Stream.periodic
构造函数。但是,这导致我的应用程序逐渐变得迟钝(大概是由于无限期地计数流是徒劳的)。
所以我需要的是一个仅在被询问时立即产生值的惰性流。实际上,这听起来像是Iterable
,但是对于Iterable
来说,我没有一种用流压缩它的方法。我考虑过实现一个功能,该功能接受流/可迭代对象的列表并返回列表流,其工作方式与常规拉链差不多。不过,这似乎相当复杂,而且我不确定是否可以编写可用于生产环境的实现。
问题是:我有什么选择?是否有一个现成的解决方案?我应该完全尝试对Flutter做出完全反应吗?