Created
September 12, 2025 04:09
-
-
Save dickermoshe/c09f67e7015d3ac9ccb8d1ffe9ad1c94 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /// 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