Skip to content

Commit 5e3388f

Browse files
authored
Computed.untrackedValue is not up to date (#172)
1 parent a652ca2 commit 5e3388f

8 files changed

Lines changed: 54 additions & 5 deletions

File tree

packages/flutter_solidart/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## 2.7.3
2+
3+
### Changes from solidart
4+
5+
- **FIX**: Return up-to-date value from `Computed.untrackedValue` after dependency changes.
6+
17
## 2.7.2
28

39
### Changes from solidart

packages/flutter_solidart/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: flutter_solidart
22
description: A simple State Management solution for Flutter applications inspired by SolidJS
3-
version: 2.7.2
3+
version: 2.7.3
44
repository: https://github.com/nank1ro/solidart
55
documentation: https://solidart.mariuti.com
66
topics:
@@ -18,7 +18,7 @@ dependencies:
1818
flutter:
1919
sdk: flutter
2020
meta: ^1.11.0
21-
solidart: ^2.8.4
21+
solidart: ^2.8.5
2222

2323
dev_dependencies:
2424
disco: ^1.0.0

packages/solidart/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.8.5
2+
3+
- **FIX**: Return up-to-date value from `Computed.untrackedValue` after dependency changes.
4+
15
## 2.8.4
26

37
- **FIX**: Prevent `LateInitializationError` when accessing `Computed.untrackedValue` before first `value` access. `hasValue` now triggers lazy computation, and `untrackedValue` asserts with a clear message if accessed before computation.

packages/solidart/lib/src/core/computed.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,10 @@ class Computed<T> extends ReadSignal<T> {
190190
'Computed($name) has not been initialized yet. '
191191
'Access "value" or "hasValue" first to trigger computation.',
192192
);
193+
// Re-evaluate if stale, without registering as a dependency.
194+
if (!_disposed) {
195+
untracked(() => value);
196+
}
193197
return _untrackedValue;
194198
}
195199

packages/solidart/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: solidart
22
description: A simple State Management solution for Dart applications inspired by SolidJS
3-
version: 2.8.4
3+
version: 2.8.5
44
repository: https://github.com/nank1ro/solidart
55
documentation: https://solidart.mariuti.com
66
topics:

packages/solidart/test/solidart_test.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,12 +552,41 @@ void main() {
552552
expect(doubled.untrackedValue, 10);
553553
});
554554

555+
test('untrackedValue returns up-to-date value after dependency changes',
556+
() {
557+
final counter = Signal(5);
558+
final doubled = Computed(() => counter.value * 2);
559+
560+
doubled.hasValue;
561+
expect(doubled.untrackedValue, 10);
562+
563+
counter.value = 20;
564+
expect(doubled.untrackedValue, 40);
565+
});
566+
555567
test('untrackedValue asserts if accessed before computation', () {
556568
final counter = Signal(5);
557569
final doubled = Computed(() => counter.value * 2);
558570
expect(() => doubled.untrackedValue, throwsA(isA<AssertionError>()));
559571
});
560572

573+
test('untrackedValue does not register as a dependency', () {
574+
final counter = Signal(5);
575+
final doubled = Computed(() => counter.value * 2);
576+
doubled.hasValue;
577+
578+
final cb = MockCallbackFunction();
579+
final unobserve = Effect(() {
580+
doubled.untrackedValue;
581+
cb();
582+
});
583+
addTearDown(unobserve);
584+
585+
counter.value = 20;
586+
587+
verify(cb()).called(1); // only the initial Effect run, no re-fire
588+
});
589+
561590
test('Computed contains previous value', () async {
562591
final signal = Signal(0);
563592
final derived = Computed(() => signal.value * 2);

packages/solidart_hooks/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## 3.1.3
2+
3+
### Changes from solidart
4+
5+
- **FIX**: Return up-to-date value from `Computed.untrackedValue` after dependency changes.
6+
17
## 3.1.2
28

39
### Changes from solidart

packages/solidart_hooks/pubspec.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: solidart_hooks
22
description: Flutter Hooks bindings for Solidart, suitable for ephemeral state and for writing less boilerplate.
3-
version: 3.1.2
3+
version: 3.1.3
44
repository: https://github.com/nank1ro/solidart
55
documentation: https://solidart.mariuti.com
66
topics:
@@ -18,7 +18,7 @@ dependencies:
1818
flutter:
1919
sdk: flutter
2020
flutter_hooks: ^0.21.3+1
21-
flutter_solidart: ^2.7.2
21+
flutter_solidart: ^2.7.3
2222

2323
dev_dependencies:
2424
flutter_test:

0 commit comments

Comments
 (0)