diff --git a/packages/katana_scoped/lib/value/cache.dart b/packages/katana_scoped/lib/value/cache.dart index 1bd96ab0f..7a65d6c90 100644 --- a/packages/katana_scoped/lib/value/cache.dart +++ b/packages/katana_scoped/lib/value/cache.dart @@ -104,7 +104,7 @@ class _CacheValueState extends ScopedValueState> { _value = value.callback(); final ref = value.ref; if (ref is ListenableRef) { - ref.addListener(_handledOnUpdateRef); + ref.addListener(_handledOnUpdateByRef); } } @@ -116,7 +116,7 @@ class _CacheValueState extends ScopedValueState> { } } - void _handledOnUpdateRef() { + void _handledOnUpdateByRef() { _value = value.callback(); setState(() {}); } @@ -126,7 +126,7 @@ class _CacheValueState extends ScopedValueState> { super.dispose(); final ref = value.ref; if (ref is ListenableRef) { - ref.removeListener(_handledOnUpdateRef); + ref.removeListener(_handledOnUpdateByRef); } } diff --git a/packages/katana_scoped/lib/value/query.dart b/packages/katana_scoped/lib/value/query.dart index 8467fa918..99b45a65b 100644 --- a/packages/katana_scoped/lib/value/query.dart +++ b/packages/katana_scoped/lib/value/query.dart @@ -36,6 +36,8 @@ extension RefQueryExtensions on Ref { return getScopedValue>( (ref) => _QueryValue( callback: query.call(ref), + ref: ref, + listen: query.listen, autoDisposeWhenUnreferenced: query.autoDisposeWhenUnreferenced, ), listen: query.listen, @@ -85,10 +87,14 @@ extension RefHasAppQueryExtensions on RefHasApp { class _QueryValue extends ScopedValue { const _QueryValue({ required this.callback, + required this.ref, + this.listen = false, this.autoDisposeWhenUnreferenced = false, }); final T Function() callback; + final bool listen; + final Ref ref; final bool autoDisposeWhenUnreferenced; @override @@ -111,12 +117,23 @@ class _QueryValueState extends ScopedValueState> { if (val is Listenable) { val.addListener(_handledOnUpdate); } + if (!value.listen) { + final ref = value.ref; + if (ref is ListenableRef) { + ref.addListener(_handledOnUpdateByRef); + } + } } void _handledOnUpdate() { setState(() {}); } + void _handledOnUpdateByRef() { + _value = value.callback.call(); + setState(() {}); + } + @override void dispose() { super.dispose(); @@ -127,6 +144,10 @@ class _QueryValueState extends ScopedValueState> { val.dispose(); } } + final ref = value.ref; + if (ref is ListenableRef) { + ref.removeListener(_handledOnUpdateByRef); + } } @override