Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 7887ca5

Browse files
authored
Revert "Keep dirty manipulations private to Element base class (#109401)" (#109481)
Landing on red to green the build.
1 parent dce82f7 commit 7887ca5

File tree

6 files changed

+38
-95
lines changed

6 files changed

+38
-95
lines changed

packages/flutter/lib/src/cupertino/text_selection_toolbar.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1016,6 +1016,9 @@ class _NullElement extends Element {
10161016

10171017
@override
10181018
bool get debugDoingBuild => throw UnimplementedError();
1019+
1020+
@override
1021+
void performRebuild() { }
10191022
}
10201023

10211024
class _NullWidget extends Widget {

packages/flutter/lib/src/widgets/framework.dart

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4507,10 +4507,6 @@ abstract class Element extends DiagnosticableTree implements BuildContext {
45074507
}
45084508

45094509
/// Returns true if the element has been marked as needing rebuilding.
4510-
///
4511-
/// The flag is true when the element is first created and after
4512-
/// [markNeedsBuild] has been called. The flag is reset to false in the
4513-
/// [performRebuild] implementation.
45144510
bool get dirty => _dirty;
45154511
bool _dirty = true;
45164512

@@ -4584,14 +4580,10 @@ abstract class Element extends DiagnosticableTree implements BuildContext {
45844580
/// Called by the [BuildOwner] when [BuildOwner.scheduleBuildFor] has been
45854581
/// called to mark this element dirty, by [mount] when the element is first
45864582
/// built, and by [update] when the widget has changed.
4587-
///
4588-
/// The method will only rebuild if [dirty] is true. To rebuild irregardless
4589-
/// of the [dirty] flag, set `force` to true. Forcing a rebuild is convenient
4590-
/// from [update], during which [dirty] is false.
45914583
@pragma('vm:prefer-inline')
4592-
void rebuild({bool force = false}) {
4584+
void rebuild() {
45934585
assert(_lifecycleState != _ElementLifecycle.initial);
4594-
if (_lifecycleState != _ElementLifecycle.active || (!_dirty && !force)) {
4586+
if (_lifecycleState != _ElementLifecycle.active || !_dirty) {
45954587
return;
45964588
}
45974589
assert(() {
@@ -4626,13 +4618,8 @@ abstract class Element extends DiagnosticableTree implements BuildContext {
46264618
/// Cause the widget to update itself.
46274619
///
46284620
/// Called by [rebuild] after the appropriate checks have been made.
4629-
///
4630-
/// The base implementation only clears the [dirty] flag.
46314621
@protected
4632-
@mustCallSuper
4633-
void performRebuild() {
4634-
_dirty = false;
4635-
}
4622+
void performRebuild();
46364623
}
46374624

46384625
class _ElementDiagnosticableTreeNode extends DiagnosticableTreeNode {
@@ -4914,7 +4901,7 @@ abstract class ComponentElement extends Element {
49144901
} finally {
49154902
// We delay marking the element as clean until after calling build() so
49164903
// that attempts to markNeedsBuild() during build() will be ignored.
4917-
super.performRebuild(); // clears the "dirty" flag
4904+
_dirty = false;
49184905
}
49194906
try {
49204907
_child = updateChild(_child, built, slot);
@@ -4968,7 +4955,8 @@ class StatelessElement extends ComponentElement {
49684955
void update(StatelessWidget newWidget) {
49694956
super.update(newWidget);
49704957
assert(widget == newWidget);
4971-
rebuild(force: true);
4958+
_dirty = true;
4959+
rebuild();
49724960
}
49734961
}
49744962

@@ -5065,6 +5053,10 @@ class StatefulElement extends ComponentElement {
50655053
super.update(newWidget);
50665054
assert(widget == newWidget);
50675055
final StatefulWidget oldWidget = state._widget!;
5056+
// We mark ourselves as dirty before calling didUpdateWidget to
5057+
// let authors call setState from within didUpdateWidget without triggering
5058+
// asserts.
5059+
_dirty = true;
50685060
state._widget = widget as StatefulWidget;
50695061
final Object? debugCheckForReturnedFuture = state.didUpdateWidget(oldWidget) as dynamic;
50705062
assert(() {
@@ -5080,7 +5072,7 @@ class StatefulElement extends ComponentElement {
50805072
}
50815073
return true;
50825074
}());
5083-
rebuild(force: true);
5075+
rebuild();
50845076
}
50855077

50865078
@override
@@ -5225,7 +5217,8 @@ abstract class ProxyElement extends ComponentElement {
52255217
super.update(newWidget);
52265218
assert(widget == newWidget);
52275219
updated(oldWidget);
5228-
rebuild(force: true);
5220+
_dirty = true;
5221+
rebuild();
52295222
}
52305223

52315224
/// Called during build when the [widget] has changed.
@@ -5753,7 +5746,7 @@ abstract class RenderObjectElement extends Element {
57535746
}());
57545747
assert(_slot == newSlot);
57555748
attachRenderObject(newSlot);
5756-
super.performRebuild(); // clears the "dirty" flag
5749+
_dirty = false;
57575750
}
57585751

57595752
@override
@@ -5775,7 +5768,7 @@ abstract class RenderObjectElement extends Element {
57755768
}
57765769

57775770
@override
5778-
void performRebuild() { // ignore: must_call_super, _performRebuild calls super.
5771+
void performRebuild() {
57795772
_performRebuild(); // calls widget.updateRenderObject()
57805773
}
57815774

@@ -5790,7 +5783,7 @@ abstract class RenderObjectElement extends Element {
57905783
_debugDoingBuild = false;
57915784
return true;
57925785
}());
5793-
super.performRebuild(); // clears the "dirty" flag
5786+
_dirty = false;
57945787
}
57955788

57965789
/// Updates the children of this element to use new widgets.
@@ -6546,6 +6539,9 @@ class _NullElement extends Element {
65466539

65476540
@override
65486541
bool get debugDoingBuild => throw UnimplementedError();
6542+
6543+
@override
6544+
void performRebuild() => throw UnimplementedError();
65496545
}
65506546

65516547
class _NullWidget extends Widget {

packages/flutter/test/cupertino/colors_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,9 @@ class _NullElement extends Element {
591591

592592
@override
593593
bool get debugDoingBuild => throw UnimplementedError();
594+
595+
@override
596+
void performRebuild() { }
594597
}
595598

596599
class _NullWidget extends Widget {

packages/flutter/test/foundation/diagnostics_json_test.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,11 @@ void main() {
220220
class _TestElement extends Element {
221221
_TestElement() : super(const Placeholder());
222222

223+
@override
224+
void performRebuild() {
225+
// Intentionally left empty.
226+
}
227+
223228
@override
224229
bool get debugDoingBuild => throw UnimplementedError();
225230
}

packages/flutter/test/widgets/did_update_widget_test.dart

Lines changed: 0 additions & 70 deletions
This file was deleted.

packages/flutter/test/widgets/framework_test.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1861,6 +1861,9 @@ class DirtyElementWithCustomBuildOwner extends Element {
18611861

18621862
final BuildOwner _owner;
18631863

1864+
@override
1865+
void performRebuild() {}
1866+
18641867
@override
18651868
BuildOwner get owner => _owner;
18661869

@@ -1965,9 +1968,9 @@ class StatefulElementSpy extends StatefulElement {
19651968
_Stateful get _statefulWidget => widget as _Stateful;
19661969

19671970
@override
1968-
void rebuild({bool force = false}) {
1971+
void rebuild() {
19691972
_statefulWidget.onElementRebuild?.call(this);
1970-
super.rebuild(force: force);
1973+
super.rebuild();
19711974
}
19721975
}
19731976

@@ -2112,6 +2115,9 @@ class _EmptyElement extends Element {
21122115

21132116
@override
21142117
bool get debugDoingBuild => false;
2118+
2119+
@override
2120+
void performRebuild() {}
21152121
}
21162122

21172123
class _TestLeaderLayerWidget extends SingleChildRenderObjectWidget {

0 commit comments

Comments
 (0)