如何处理紧密的无限流?

时间:2019-03-28 06:21:24

标签: dart flutter reactive-programming

我正在尝试用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做出完全反应吗?

0 个答案:

没有答案