first<T> static method
Returns the first element, or null if not element at all. Unlike Stream.first, it won't throw StateError.
Implementation
static Future<T?> first<T>(Stream<T> stream) {
final c = Completer<T?>();
late final StreamSubscription<T> sub;
sub = stream.listen(
(data) async {
if (c.isCompleted) return;
c.complete(data);
InvokeUtil.invokeSafely(sub.cancel);
},
onError: (e, st) async {
if (!c.isCompleted) c.completeError(e, st);
InvokeUtil.invokeSafely(sub.cancel);
},
onDone: () {
if (!c.isCompleted) c.complete(null);
// no cancel needed here; onDone means it’s already finished
},
cancelOnError: true,
);
return c.future;
}