first method
输出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;
}
}