Skip to content

Instantly share code, notes, and snippets.

@dickermoshe
Created September 12, 2025 04:09
Show Gist options
  • Select an option

  • Save dickermoshe/c09f67e7015d3ac9ccb8d1ffe9ad1c94 to your computer and use it in GitHub Desktop.

Select an option

Save dickermoshe/c09f67e7015d3ac9ccb8d1ffe9ad1c94 to your computer and use it in GitHub Desktop.
/// Shamelessly copied from flutter_signals
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:solidart/solidart.dart';
/// Bind an existing signal to the hook widget
T useExistingSignal<T extends ReadSignal>(T value) {
final target = useMemoized(() => value, []);
return use(_SignalHook('useExistingSignal', target));
}
/// Create a new signal
Signal<T> useSignal<T>(T value) {
final target = useMemoized(() => Signal(value), []);
return use(_SignalHook('useSignal', target));
}
/// Create a new computed signal
Computed<T> useComputed<T>(T Function() cb) {
final instance = useRef(cb);
instance.value = cb;
final target = useMemoized(() => Computed<T>(() => instance.value()), []);
return use(_SignalHook('useComputed', target));
}
/// Create a signal effect
void useSignalEffect(dynamic Function() cb) {
final instance = useRef(cb);
instance.value = cb;
useEffect(() => Effect(instance.value).dispose, []);
return;
}
class _SignalHook<T, S extends ReadSignal<T>> extends Hook<S> {
const _SignalHook(this.type, this.initialData);
final String type;
final S initialData;
@override
_SignalHookState<T, S> createState() => _SignalHookState();
}
class _SignalHookState<T, S extends ReadSignal<T>>
extends HookState<S, _SignalHook<T, S>> {
late final _instance = hook.initialData;
Effect? _cleanup;
@override
void initHook() {
_cleanup = Effect(() {
_instance.value;
setState(() {});
});
super.initHook();
}
@override
void dispose() {
_cleanup?.dispose();
}
@override
S build(BuildContext context) => _instance;
@override
Object? get debugValue => _instance.value;
@override
String get debugLabel => '${hook.type}<$T>';
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment