LogoSignals.dart
Copy Markdown
rodydavis/signals.dart 999999

StreamSignalMixin

A mixin that implements the standard Stream interface for a ReadonlySignal.

A mixin that implements the standard Stream interface for a ReadonlySignal.

This mixin allows you to treat a read-only or writable signal as a standard asynchronous Stream, where updates to the signal's value are pushed as stream events. This provides out-of-the-box compatibility with the entire asynchronous Dart SDK, such as stream transformers, await for loops, and Flutter's StreamBuilder.

Example Usage#

import 'package:signals/signals.dart';

class MyStreamSignal extends Signal<int> with StreamSignalMixin<int> {
  MyStreamSignal(super.internalValue);
}

void main() async {
  final counter = MyStreamSignal(0);

  // Standard stream subscription
  final subscription = counter.listen((val) {
    print('Stream emitted: $val');
  }); // Prints: "Stream emitted: 0" (if listened immediately)

  counter.value = 1; // Prints: "Stream emitted: 1"
  counter.value = 2; // Prints: "Stream emitted: 2"

  await subscription.cancel();
}

Flutter StreamBuilder Example#

import 'package:flutter/material.dart';
import 'package:signals/signals_flutter.dart';

class CounterSignal extends Signal<int> with StreamSignalMixin<int> {
  CounterSignal(int value) : super(value);
}

final counter = CounterSignal(0);

Widget build(BuildContext context) {
  return StreamBuilder<int>(
    stream: counter,
    builder: (context, snapshot) {
      return Text('Count: ${snapshot.data}');
    },
  );
}
Since StreamSignalMixin creates an internal broadcast StreamController, multiple listeners can subscribe simultaneously. All subscriptions are closed and resources are released automatically when the signal is disposed.

Methods#

View Methods
Future any(bool Function(T element) test)
Stream asBroadcastStream({void Function(StreamSubscription subscription)? onListen, void Function(StreamSubscription subscription)? onCancel})
Stream asyncExpand(Stream? Function(T event) convert)
Stream asyncMap(FutureOr Function(T event) convert)
Stream cast()
Future contains(Object? needle)
Stream distinct([bool Function(T previous, T next)? equals])
Future drain([E? futureValue])
Future elementAt(int index)
Future every(bool Function(T element) test)
Stream expand(Iterable Function(T element) convert)
Future first
Future firstWhere(bool Function(T element) test, {T Function()? orElse})
Future fold(S initialValue, S Function(S previous, T element) combine)
Future forEach(void Function(T element) action)
Stream handleError(Function onError, {bool Function(dynamic error)? test})
bool isBroadcast
Future isEmpty
Future join([String separator = ""])
Future last
Future lastWhere(bool Function(T element) test, {T Function()? orElse})
Future length
StreamSubscription listen(void Function(T event)? onData, {Function? onError, void Function()? onDone, bool? cancelOnError})
Stream map(S Function(T event) convert)
Future pipe(StreamConsumer streamConsumer)
Future reduce(T Function(T previous, T element) combine)
Future single
Future singleWhere(bool Function(T element) test, {T Function()? orElse})
Stream skip(int count)
Stream skipWhile(bool Function(T element) test)
Stream take(int count)
Stream takeWhile(bool Function(T element) test)
Stream timeout(Duration timeLimit, {void Function(EventSink sink)? onTimeout})
Future<List> toList()
Future<Set> toSet()
Stream transform(StreamTransformer<T, S> streamTransformer)
Stream where(bool Function(T event) test)