useLazySignal<T> function

Signal<T> useLazySignal<T>({
  1. SignalOptions<T>? options,
  2. List<Object?> keys = const <Object>[],
})

Creates a new Signal that starts uninitialized and subscribes to it.

A lazy signal is a signal that doesn't have an initial value on creation. Reading its .value before setting it will throw a LazySignalInitializationError.

Parameters

  • keys: A list of objects to watch. If any key changes, the signal is re-created.
  • options: Optional configuration options for standard signals (e.g. name, autoDispose).

Example

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:signals_hooks/signals_hooks.dart';

class LateSetupWidget extends HookWidget {
  const LateSetupWidget({super.key});

  @override
  Widget build(BuildContext context) {
    // Starts uninitialized safely
    final dataSignal = useLazySignal<String>();

    useEffect(() {
      Future.delayed(const Duration(seconds: 1), () {
        dataSignal.value = 'Initialized Data';
      });
      return null;
    }, []);

    return Text(dataSignal.value.isEmpty ? 'Uninitialized' : dataSignal.value);
  }
}

Implementation

Signal<T> useLazySignal<T>({
  SignalOptions<T>? options,
  List<Object?> keys = const <Object>[],
}) {
  final state = useState(0);
  final s = useMemoized(
    () => _LazySignalHookInstance<T>(
      options: options,
      onChanged: () => state.value++,
    ),
    keys,
  );
  if (s.isInitialized) {
    useExistingSignal(s, keys: keys);
  }
  return s;
}