first<T> static method

Future<T?> first<T>(
  1. Stream<T> stream
)

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;
}