是否可以屈服于Dart的外部范围?

时间:2019-06-28 21:48:30

标签: flutter dart

是否可能以某种方式yield进入外部范围? 是否有更惯用的方法达到相同的预期结果?

Stream<T> fetch() async* {
  bool sentLiveValue = false;

  Future<T> cached = cache.fetchValue();
  cached.then((value) {
    if (!sentLiveValue)
      yield value; // Here, I want to yield to the outer scope.
  });

  await for (T value in liveValueSource.fetch()) {
    yield value;
    sentLiveValue = true;
    cache.update(value);
  }
}

如果您想了解上下文,那么我正在实现一个数据体系结构,该体系结构具有可以fetch数据的类。 上面的简化代码应返回一个流,该流首先包含一个缓存的值,然后包含来自实时源的值。

请注意,如果高速缓存比实时数据源慢(如果高速缓存尚不包含值,则可能出现这种情况),应首先使用实时数据。因此,await缓存值不是一种选择。

1 个答案:

答案 0 :(得分:1)

一种解决方案是使用StreamController,但要注意:制作自己的流是hazardous-您应处理监听,暂停,恢复和取消操作。

部分实现是:

Stream<T> fetch<T>() {
  var sentLiveValue = false;
  var controller = StreamController<T>(
    onListen: () {},
    onPause: () {},
    onResume: () {},
    onCancel: () {},
  );

  cache.fetchValue().then((v) {
    if (!sentLiveValue) {
      controller.add(v);
    }
  });

  liveValueSource.fetch().listen(
    (t) {
      sentLiveValue = true;
      cache.update(t);
      controller.add(t);
    },
    onDone: () => controller.close(),
    onError: (e, st) => controller.addError(e, st),
  );

  return controller.stream;
}