repeatLatest method

Stream<T> repeatLatest()

该 Stream 每次被listen时都会emit 最近的值

Implementation

Stream<T> repeatLatest() {
  var done = false;
  T? latest;
  var currentListeners = <MultiStreamController<T>>{};
  listen(
    (event) {
      latest = event;
      for (var listener in [...currentListeners]) {
        listener.addSync(event);
      }
    },
    onError: (Object error, StackTrace stack) {
      for (var listener in [...currentListeners]) {
        listener.addErrorSync(error, stack);
      }
    },
    onDone: () {
      done = true;
      latest = null;
      final listens = List.from(currentListeners);
      for (var element in listens) {
        element.closeSync();
      }
      currentListeners.clear();
    },
  );
  return Stream.multi((controller) {
    if (done) {
      controller.close();
      return;
    }
    currentListeners.add(controller);
    var latestValue = latest;
    if (latestValue != null) controller.add(latestValue);
    controller.onCancel = () {
      currentListeners.remove(controller);
    };
  });
}