writableComputed<T> function

WritableComputed<T> writableComputed<T>(
  1. BuildContext? context, {
  2. required T get(
    1. T? cached
    ),
  3. required void set(
    1. T value
    ),
  4. String? debugLabel,
  5. Object? debugOwner,
  6. String? debugScope,
  7. String? debugNote,
})

Factory method for creating a writable computed signal.

Example:

import 'dart:math' as math;

final count = signal<double>(null, 0);
final squared = writableComputed<double>(null,
  get: (_) => count() * count(),
  set: (value) => count.set(math.sqrt(value)),
);

count.set(2);
print(count()); // Print 2.0
print(squared()); // Print 4.0

squared.set(16);
print(count()); // Print 4.0
print(squared()); // Print 16.0

Implementation

WritableComputed<T> writableComputed<T>(
  BuildContext? context, {
  required T Function(T? cached) get,
  required void Function(T value) set,
  String? debugLabel,
  Object? debugOwner,
  String? debugScope,
  String? debugNote,
}) {
  if (context == null) {
    final computed = _OrefWritableComputed(get, set);
    final handle = devtools.bindComputed(
      computed,
      debugLabel: debugLabel,
      debugOwner: debugOwner,
      debugScope: debugScope,
      debugNote: debugNote,
    );
    computed.attachDevTools(handle);
    return computed;
  }

  final c = useMemoized(context, () => _OrefWritableComputed(get, set));
  final handle = devtools.bindComputed(
    c,
    context: context,
    debugLabel: debugLabel,
    debugOwner: debugOwner,
    debugScope: debugScope,
    debugNote: debugNote,
  );
  c.attachDevTools(handle);
  if (handle.isNew) {
    registerElementDisposer(context, handle.dispose);
  }
  assert(() {
    c.fn = get;
    c.setter = set;
    c.flags &= 16;
    return true;
  }());

  return c;
}