Revert "Remove duplicate code in Element.rebuild() and BuildOwner.buildScope() (#71940)" (#72120)
This reverts commit c8f07aad563d9460eac0074be0a24a38158239af.
diff --git a/packages/flutter/lib/src/gestures/pointer_router.dart b/packages/flutter/lib/src/gestures/pointer_router.dart
index a59d07d..daf09bf 100644
--- a/packages/flutter/lib/src/gestures/pointer_router.dart
+++ b/packages/flutter/lib/src/gestures/pointer_router.dart
@@ -75,7 +75,6 @@
///
/// This is valid in debug builds only. In release builds, this will throw an
/// [UnsupportedError].
- @visibleForTesting
int get debugGlobalRouteCount {
int? count;
assert(() {
diff --git a/packages/flutter/lib/src/widgets/framework.dart b/packages/flutter/lib/src/widgets/framework.dart
index 73855e2..d2d4ed2 100644
--- a/packages/flutter/lib/src/widgets/framework.dart
+++ b/packages/flutter/lib/src/widgets/framework.dart
@@ -2651,26 +2651,6 @@
/// Only valid when asserts are enabled.
bool get debugBuilding => _debugBuilding;
bool _debugBuilding = false;
-
- /// The element currently being built, or null if no element is actively
- /// being built.
- ///
- /// This is valid in debug builds only. In release builds, this will throw an
- /// [UnsupportedError].
- @visibleForTesting
- Element? get debugCurrentBuildTarget {
- Element? result;
- bool isSupportedOperation = false;
- assert(() {
- result = _debugCurrentBuildTarget;
- isSupportedOperation = true;
- return true;
- }());
- if (isSupportedOperation) {
- return result;
- }
- throw UnsupportedError('debugCurrentBuildTarget is not supported in release builds');
- }
Element? _debugCurrentBuildTarget;
/// Establishes a scope in which calls to [State.setState] are forbidden, and
@@ -2696,25 +2676,6 @@
assert(_debugStateLockLevel >= 0);
}
- void _runWithCurrentBuildTarget(Element element, VoidCallback callback) {
- assert(_debugStateLocked);
- Element? debugPreviousBuildTarget;
- assert(() {
- debugPreviousBuildTarget = _debugCurrentBuildTarget;
- _debugCurrentBuildTarget = element;
- return true;
- }());
- try {
- callback();
- } finally {
- assert(() {
- assert(_debugCurrentBuildTarget == element);
- _debugCurrentBuildTarget = debugPreviousBuildTarget;
- return true;
- }());
- }
- }
-
/// Establishes a scope for updating the widget tree, and calls the given
/// `callback`, if any. Then, builds all the elements that were marked as
/// dirty using [scheduleBuildFor], in depth order.
@@ -2757,22 +2718,26 @@
try {
_scheduledFlushDirtyElements = true;
if (callback != null) {
- _runWithCurrentBuildTarget(context, () {
+ assert(_debugStateLocked);
+ Element? debugPreviousBuildTarget;
+ assert(() {
+ context._debugSetAllowIgnoredCallsToMarkNeedsBuild(true);
+ debugPreviousBuildTarget = _debugCurrentBuildTarget;
+ _debugCurrentBuildTarget = context;
+ return true;
+ }());
+ _dirtyElementsNeedsResorting = false;
+ try {
+ callback();
+ } finally {
assert(() {
- context._debugSetAllowIgnoredCallsToMarkNeedsBuild(true);
+ context._debugSetAllowIgnoredCallsToMarkNeedsBuild(false);
+ assert(_debugCurrentBuildTarget == context);
+ _debugCurrentBuildTarget = debugPreviousBuildTarget;
+ _debugElementWasRebuilt(context);
return true;
}());
- _dirtyElementsNeedsResorting = false;
- try {
- callback();
- } finally {
- assert(() {
- context._debugSetAllowIgnoredCallsToMarkNeedsBuild(false);
- _debugElementWasRebuilt(context);
- return true;
- }());
- }
- });
+ }
}
_dirtyElements.sort(Element._sort);
_dirtyElementsNeedsResorting = false;
@@ -4404,7 +4369,19 @@
return true;
}());
assert(_lifecycleState == _ElementLifecycle.active);
- owner!._runWithCurrentBuildTarget(this, performRebuild);
+ assert(owner!._debugStateLocked);
+ Element? debugPreviousBuildTarget;
+ assert(() {
+ debugPreviousBuildTarget = owner!._debugCurrentBuildTarget;
+ owner!._debugCurrentBuildTarget = this;
+ return true;
+ }());
+ performRebuild();
+ assert(() {
+ assert(owner!._debugCurrentBuildTarget == this);
+ owner!._debugCurrentBuildTarget = debugPreviousBuildTarget;
+ return true;
+ }());
assert(!_dirty);
}
@@ -5609,7 +5586,6 @@
}
@override
- @mustCallSuper
void performRebuild() {
assert(() {
_debugDoingBuild = true;
diff --git a/packages/flutter/test/widgets/framework_test.dart b/packages/flutter/test/widgets/framework_test.dart
index b213f94..7dc9e7e 100644
--- a/packages/flutter/test/widgets/framework_test.dart
+++ b/packages/flutter/test/widgets/framework_test.dart
@@ -1494,44 +1494,6 @@
expect(GestureBinding.instance!.pointerRouter.debugGlobalRouteCount, pointerRouterCount);
expect(RawKeyboard.instance.keyEventHandler, same(rawKeyEventHandler));
});
-
- testWidgets('Errors in build', (WidgetTester tester) async {
- final ErrorWidgetBuilder oldErrorBuilder = ErrorWidget.builder;
- ErrorWidget.builder = (FlutterErrorDetails detail) => throw AssertionError();
- try {
- final FlutterExceptionHandler? oldErrorHandler = FlutterError.onError;
- FlutterError.onError = (FlutterErrorDetails detail) {};
- try {
- int buildCount = 0;
- void handleBuild() => buildCount++;
- expect(tester.binding.buildOwner!.debugCurrentBuildTarget, isNull);
- await tester.pumpWidget(_WidgetThatCanThrowInBuild(onBuild: handleBuild));
- expect(buildCount, 1);
- await tester.pumpWidget(_WidgetThatCanThrowInBuild(onBuild: handleBuild, shouldThrow: true));
- tester.takeException();
- expect(buildCount, 2);
- expect(tester.binding.buildOwner!.debugCurrentBuildTarget, isNull);
- } finally {
- FlutterError.onError = oldErrorHandler;
- }
- } finally {
- ErrorWidget.builder = oldErrorBuilder;
- }
- });
-}
-
-class _WidgetThatCanThrowInBuild extends StatelessWidget {
- const _WidgetThatCanThrowInBuild({required this.onBuild, this.shouldThrow = false});
-
- final VoidCallback onBuild;
- final bool shouldThrow;
-
- @override
- Widget build(BuildContext context) {
- onBuild();
- assert(!shouldThrow);
- return Container();
- }
}
class _FakeFocusManager implements FocusManager {