@@ -2,19 +2,28 @@ import 'package:computed/computed.dart';
22import 'package:flutter/widgets.dart' ;
33import 'value_listenable_extension.dart' ;
44
5+ class _Token {}
6+
57mixin _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