Skip to content

Commit 10b9fc1

Browse files
committed
Fix hot reloads
1 parent 0a01285 commit 10b9fc1

File tree

1 file changed

+23
-10
lines changed

1 file changed

+23
-10
lines changed

lib/src/computed_flutter.dart

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,28 @@ import 'package:computed/computed.dart';
22
import 'package:flutter/widgets.dart';
33
import 'value_listenable_extension.dart';
44

5+
class _Token {}
6+
57
mixin _ComputedFlutterElementMixin on ComponentElement {
6-
final _forceRebuild = ValueNotifier<int>(0);
7-
var _firstFrame = true;
8-
ComputedSubscription<void>? _sub;
8+
final _forceRebuild = ValueNotifier(_Token());
9+
var _buildToken = _Token(); // Hack to keep Computed from undoing the DAG
10+
var _dirty = false;
11+
var _ignoreListener = true;
12+
ComputedSubscription<_Token>? _sub;
913
Widget? _result;
1014
Object? _error;
1115
StackTrace? _trace;
1216
bool? _lastWasError;
1317

1418
@override
1519
Widget build() {
20+
if (_dirty) {
21+
_ignoreListener = true;
22+
_forceRebuild.value = _Token();
23+
_dirty = false;
24+
}
1625
_sub ??= Computed(() {
17-
_forceRebuild.use; // So that we can force rebuilds
26+
_forceRebuild.react((p0) {}); // So that we can force rebuilds
1827
try {
1928
_result = super.build();
2029
_lastWasError = false;
@@ -23,11 +32,14 @@ mixin _ComputedFlutterElementMixin on ComponentElement {
2332
_error = e;
2433
_trace = s;
2534
}
26-
}, memoized: false)
27-
.listen((_) {
28-
if (!_firstFrame) super.markNeedsBuild();
29-
_firstFrame = false;
30-
}, null);
35+
return _buildToken;
36+
}).listen((_) {
37+
_buildToken = _Token();
38+
if (!_ignoreListener) super.markNeedsBuild();
39+
_ignoreListener = false;
40+
}, (_) {
41+
assert(false);
42+
});
3143
if (_lastWasError == true) {
3244
Error.throwWithStackTrace(_error!, _trace!);
3345
} else {
@@ -44,7 +56,8 @@ mixin _ComputedFlutterElementMixin on ComponentElement {
4456

4557
@override
4658
void markNeedsBuild() {
47-
_forceRebuild.value++;
59+
_dirty = true;
60+
super.markNeedsBuild();
4861
}
4962
}
5063

0 commit comments

Comments
 (0)