StreamProvider<State> constructor Null safety

StreamProvider<State>(
  1. Create<Stream<State>, StreamProviderRef<State>> _create,
  2. {String? name,
  3. List<ProviderOrFamily>? dependencies,
  4. Family<dynamic, dynamic, ProviderBase>? from,
  5. Object? argument}
)

Creates a stream and expose its latest event.

StreamProvider is identical in behavior/usage to FutureProvider, modulo the fact that the value created is a Stream instead of a Future.

It can be used to express a value asynchronously loaded that can change over time, such as an editable Message coming from a web socket:

final messageProvider = StreamProvider.autoDispose<String>((ref) async* {
  // Open the connection
  final channel = IOWebSocketChannel.connect('ws://echo.websocket.org');

  // Close the connection when the stream is destroyed
  ref.onDispose(() => channel.sink.close());

  // Parse the value received and emit a Message instance
  await for (final value in channel.stream) {
    yield value.toString();
  }
});

Which the UI can then listen:

Widget build(BuildContext context, WidgetRef ref) {
  AsyncValue<String> message = ref.watch(messageProvider);

  return message.when(
    loading: () => const CircularProgressIndicator(),
    error: (err, stack) => Text('Error: $err'),
    data: (message) {
      return Text(message);
    },
  );
}

Note: When listening to web sockets, firebase, or anything that consumes resources, it is important to use StreamProvider.autoDispose instead of simply StreamProvider.

This ensures that the resources are released when no-longer needed as, by default, a StreamProvider is almost never destroyed.

See also:

Implementation

StreamProvider(
  this._create, {
  String? name,
  this.dependencies,
  Family? from,
  Object? argument,
}) : super(name: name, from: from, argument: argument);