首页 > 解决方案 > Flutter:如何对多个流进行排队

问题描述

我有像下面提到的代码一样的流,这里想合并流,并想在需要时一一调用。

main() {
  Stream<String> stream = new Stream.fromFuture(getData());

  stream.listen((data) {
    print("DataReceived: "+data);
  }, onDone: () {
    print("Task Done");
  });
  
}

Future<String> getData() async {
  await Future.delayed(Duration(seconds: 5)); //Mock delay 
  print("Fetched Data");
  return "This a test data";
}

onDone将在 5 秒后调用。

标签: flutterdart

解决方案


对于它,StreamQueue可用于组合多个流

添加依赖:

async: ^2.4.1

使用流队列:

void main() async {
  Stream<String> stream1 = new Stream.fromFuture(getData(2));
  Stream<String> stream2 = new Stream.fromFuture(getData(4));
  Stream<String> stream3 = new Stream.fromFuture(getData(6));
  var streams = StreamGroup.merge([stream1, stream2, stream3]);

  var data = StreamQueue(streams);
  var first = await data.next;
  print(first);
  var second = await data.next;
  print(second);
  var third = await data.next;
  print(third);
  var third1 = await data.next;
  print(third1);
}

Future<String> getData(int duration) async {
  await Future.delayed(Duration(seconds: duration)); //Mock delay
  return "This a test data for duration $duration";
}

输出:

I/flutter ( 7950): This a test data for duration 2
I/flutter ( 7950): This a test data for duration 4
I/flutter ( 7950): This a test data for duration 6

data.next将为您提供 Queue 中的第一个流,在我们的例子中是 stream1,在这里我们可以获取未来的值并使用。stream.next如果队列中不存在任何内容,则给出队列中的下一个流& stream.next 被执行,那么它将引发异常。


推荐阅读