Skip to content

Commit b4a99e9

Browse files
authored
fix: resource resolution (#160)
1 parent ca5109d commit b4a99e9

6 files changed

Lines changed: 20 additions & 17 deletions

File tree

packages/flutter_solidart/lib/src/widgets/signal_builder.dart

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,11 @@ class _SignalBuilderElement extends StatelessElement {
9090
try {
9191
final built = super.build();
9292
if (SolidartConfig.assertSignalBuilderWithoutDependencies) {
93-
assert(
94-
node.deps != null,
95-
'''
96-
SignalBuilder must detect at least one Signal/Computed/Resource during build.
97-
You can disable this check by setting `SolidartConfig.assertSignalBuilderWithoutDependencies = false` before `runApp()`'
98-
''',
99-
);
93+
assert(node.deps != null, '''
94+
SignalBuilder must detect at least one Signal, Computed, or Resource during the build.
95+
This may mean your reactive values were disposed.
96+
You can disable this check by setting `SolidartConfig.assertSignalBuilderWithoutDependencies = false` before `runApp()`'
97+
''');
10098
}
10199
// ignore: invalid_use_of_internal_member
102100
effect.setDependencies(node);

packages/flutter_solidart/test/flutter_solidart_test.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -916,8 +916,12 @@ void main() {
916916
tester.takeException(),
917917
isAssertionError.having(
918918
(error) => error.message,
919-
'SignalBuilder must detect at least one Signal/Computed during build.',
920-
contains('SignalBuilder must detect at least one Signal/Computed'),
919+
'''
920+
SignalBuilder must detect at least one Signal, Computed, or Resource during the build.
921+
''',
922+
contains(
923+
'''SignalBuilder must detect at least one Signal, Computed, or Resource during the build.''',
924+
),
921925
),
922926
);
923927
});

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.3
2+
3+
- **FIX**: Handle race conditions in Resource that caused multiple calls to `resolve`.
4+
15
## 2.8.2
26

37
- **REFACTOR**: Improve the Solidart DevTools extension by giving any signal an id and omit overriding the same signal by name.

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,7 @@ extension MayDisposeDependencies on alien.ReactiveNode {
2727
}
2828

2929
typedef ReactionErrorHandler =
30-
void Function(
31-
Object error,
32-
ReactionInterface reaction,
33-
);
30+
void Function(Object error, ReactionInterface reaction);
3431

3532
class ReactiveName {
3633
ReactiveName._internal();
@@ -166,6 +163,7 @@ class ReactiveSystem extends alien.ReactiveSystem {
166163
void run(alien.ReactiveNode effect, int flags) {
167164
if ((flags & 16 /* Dirty */ ) != 0 ||
168165
((flags & 32 /* Pending */ ) != 0 &&
166+
effect.deps != null &&
169167
checkDirty(effect.deps!, effect))) {
170168
final prevSub = setCurrentSub(effect);
171169
startTracking(effect);

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ class Resource<T> extends Signal<ResourceState<T>> {
132132
comparator: identical,
133133
) {
134134
// resolve the resource immediately if not lazy
135-
if (!lazy) _resolve();
135+
if (!lazy) _resolveIfNeeded();
136136
}
137137

138138
/// {@macro resource}
@@ -171,7 +171,7 @@ class Resource<T> extends Signal<ResourceState<T>> {
171171
comparator: identical,
172172
) {
173173
// resolve the resource immediately if not lazy
174-
if (!lazy) _resolve();
174+
if (!lazy) _resolveIfNeeded();
175175
}
176176

177177
/// Indicates whether the resource should be computed lazily, defaults to true
@@ -302,7 +302,6 @@ class Resource<T> extends Signal<ResourceState<T>> {
302302
"""The resource has been already resolved, you can't resolve it more than once. Use `refresh()` instead if you want to refresh the value.""",
303303
);
304304
_resolved = true;
305-
306305
if (fetcher != null) {
307306
// start fetching
308307
await _fetch();

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.2
3+
version: 2.8.3
44
repository: https://github.com/nank1ro/solidart
55
documentation: https://solidart.mariuti.com
66
topics:

0 commit comments

Comments
 (0)