first method

Future<T> first([
  1. bool cancelSubscription = false
])

输出Future, cancelSubscription决定是否取消订阅

由于stream.first会自动结束流的订阅, 但是又想继续流的话, 就使用这个方法获取Future

Implementation

Future<T> first([bool cancelSubscription = false]) async {
  if (cancelSubscription) {
    return stream.first;
  } else {
    final completer = Completer<T>();
    final subscription = stream.listen((data) {
      if (_subject.isClosed) {
        completer
            .completeError(StateError('IO [$_semantics] 已被释放, 不能获取first值'));
      } else {
        completer.complete(data);
      }
    });
    final result = await completer.future.whenComplete(subscription.cancel);
    return result;
  }
}