1

我想从具有特定延迟的 dart 列表中发出流中的值。

因此,从 [1,2,3],这是一个常规列表,我想像1...2...3在单独的事件中一样发出值。

我尝试过这样的事情

List<int> myList = [1,2,3];
Subject _current = BehaviorSubject<int>();
Stream<int> get current$ => _current.stream.delay(Duration(seconds:1));

myList.forEach(current.add);

但是我得到...123了相反的结果,所以这将整个流延迟了 1 秒,而不是列表中的每个值。

有任何想法吗?谢谢

4

5 回答 5

1

使用rxdart 0.25.0 的一种解决方案:

final Stream<int> stream = 
    Rx.range(1, 3)
      .asyncExpand((event) => 
        event == 1
        ? Stream.value(event) // return first value immediately
        : Rx.timer(event, Duration(seconds: 1))
    );
于 2021-01-06T06:32:00.227 回答
1

intervalrxdart包中使用

Stream.fromIterable(List<int>.generate(100, (i) => i))
        .interval(Duration(milliseconds: 10))
        .listen((v) {
      print(v);
});
于 2021-02-05T20:25:21.757 回答
0

rxdart _

包提供了一个延迟转换器或方法

new Observable.fromIterable([1, 2, 3, 4])
  .delay(new Duration(seconds: 1))
  .listen(print); // [after one second delay] prints 1, 2, 3, 4 immediately

还有其他像debounce

于 2019-01-03T15:22:25.190 回答
0

我设法让它工作

Observable.range(myList)
  .concatMap((i) =>
    new Observable.timer(i, new Duration(seconds: 1))
  .listen(print);

来自rxdart文档本身。感谢 Günter 的好建议。

于 2019-01-03T15:39:25.790 回答
0

如果您想避免使用 rxdart,可以使用简单的转换函数,例如:

Stream<T> streamDelayer<T>(Stream<T> inputStream, Duration delay) async* {
  await for (final val in inputStream) {
    yield val;
    await Future.delayed(delay);
  }
}

void main() {
  var s = Stream.fromIterable([1, 2, 3]);
  streamDelayer(s, Duration(seconds: 1)).forEach(print);
}
于 2022-02-22T20:51:36.073 回答