[flutter] remove elevation checker (#86837)
diff --git a/packages/flutter/lib/src/rendering/binding.dart b/packages/flutter/lib/src/rendering/binding.dart
index 5c21c88..f627960 100644
--- a/packages/flutter/lib/src/rendering/binding.dart
+++ b/packages/flutter/lib/src/rendering/binding.dart
@@ -100,17 +100,6 @@
return Future<void>.value();
},
);
- registerBoolServiceExtension(
- name: 'debugCheckElevationsEnabled',
- getter: () async => debugCheckElevationsEnabled,
- setter: (bool value) {
- if (debugCheckElevationsEnabled == value) {
- return Future<void>.value();
- }
- debugCheckElevationsEnabled = value;
- return _forceRepaint();
- },
- );
registerServiceExtension(
name: 'debugDumpLayerTree',
callback: (Map<String, String> parameters) async {
diff --git a/packages/flutter/lib/src/rendering/debug.dart b/packages/flutter/lib/src/rendering/debug.dart
index 20ea11f..8a23f8c 100644
--- a/packages/flutter/lib/src/rendering/debug.dart
+++ b/packages/flutter/lib/src/rendering/debug.dart
@@ -47,49 +47,6 @@
/// Overlay a rotating set of colors when repainting text in checked mode.
bool debugRepaintTextRainbowEnabled = false;
-/// Causes [PhysicalModelLayer]s to paint a red rectangle around themselves if
-/// they are overlapping and painted out of order with regard to their elevation.
-///
-/// Android and iOS will show the last painted layer on top, whereas Fuchsia
-/// will show the layer with the highest elevation on top.
-///
-/// For example, a rectangular elevation at 3.0 that is painted before an
-/// overlapping rectangular elevation at 2.0 would render this way on Android
-/// and iOS (with fake shadows):
-/// ```
-/// ┌───────────────────┐
-/// │ │
-/// │ 3.0 │
-/// │ ┌───────────────────┐
-/// │ │ │
-/// └────────────│ │
-/// │ 2.0 │
-/// │ │
-/// └───────────────────┘
-/// ```
-///
-/// But this way on Fuchsia (with real shadows):
-/// ```
-/// ┌───────────────────┐
-/// │ │
-/// │ 3.0 │
-/// │ │────────────┐
-/// │ │ │
-/// └───────────────────┘ │
-/// │ 2.0 │
-/// │ │
-/// └───────────────────┘
-/// ```
-///
-/// This check helps developers that want a consistent look and feel detect
-/// where this inconsistency would occur.
-///
-/// This check assumes that elevations on [PhysicalModelLayer] objects have
-/// been set to non-null values before the scene is built. If this assumption
-/// is violated, the check will throw exceptions. (The scene building would
-/// also fail in that case, however.)
-bool debugCheckElevationsEnabled = false;
-
/// The current color to overlay when repainting a layer.
///
/// This is used by painting debug code that implements
diff --git a/packages/flutter/lib/src/rendering/layer.dart b/packages/flutter/lib/src/rendering/layer.dart
index f4881ca..4ad3f18 100644
--- a/packages/flutter/lib/src/rendering/layer.dart
+++ b/packages/flutter/lib/src/rendering/layer.dart
@@ -937,13 +937,6 @@
// both to render the whole layer tree (e.g. a normal application frame) and
// to render a subtree (e.g. `OffsetLayer.toImage`).
ui.Scene buildScene(ui.SceneBuilder builder) {
- List<PictureLayer>? temporaryLayers;
- assert(() {
- if (debugCheckElevationsEnabled) {
- temporaryLayers = _debugCheckElevations();
- }
- return true;
- }());
updateSubtreeNeedsAddToScene();
addToScene(builder);
// Clearing the flag _after_ calling `addToScene`, not _before_. This is
@@ -951,17 +944,6 @@
// mark this layer as dirty.
_needsAddToScene = false;
final ui.Scene scene = builder.build();
- assert(() {
- // We should remove any layers that got added to highlight the incorrect
- // PhysicalModelLayers. If we don't, we'll end up adding duplicate layers
- // or continuing to render stale outlines.
- if (temporaryLayers != null) {
- for (final PictureLayer temporaryLayer in temporaryLayers!) {
- temporaryLayer.remove();
- }
- }
- return true;
- }());
return scene;
}
@@ -985,102 +967,6 @@
return child == equals;
}
- PictureLayer _highlightConflictingLayer(PhysicalModelLayer child) {
- final ui.PictureRecorder recorder = ui.PictureRecorder();
- final Canvas canvas = Canvas(recorder);
- canvas.drawPath(
- child.clipPath!,
- Paint()
- ..color = const Color(0xFFAA0000)
- ..style = PaintingStyle.stroke
- // The elevation may be 0 or otherwise too small to notice.
- // Adding 10 to it makes it more visually obvious.
- ..strokeWidth = child.elevation! + 10.0,
- );
- final PictureLayer pictureLayer = PictureLayer(child.clipPath!.getBounds())
- ..picture = recorder.endRecording()
- ..debugCreator = child;
- child.append(pictureLayer);
- return pictureLayer;
- }
-
- List<PictureLayer> _processConflictingPhysicalLayers(PhysicalModelLayer predecessor, PhysicalModelLayer child) {
- FlutterError.reportError(FlutterErrorDetails(
- exception: FlutterError(
- 'Painting order is out of order with respect to elevation.\n'
- 'See https://api.flutter.dev/flutter/rendering/debugCheckElevationsEnabled.html '
- 'for more details.',
- ),
- library: 'rendering library',
- context: ErrorDescription('during compositing'),
- informationCollector: () {
- return <DiagnosticsNode>[
- child.toDiagnosticsNode(name: 'Attempted to composite layer', style: DiagnosticsTreeStyle.errorProperty),
- predecessor.toDiagnosticsNode(name: 'after layer', style: DiagnosticsTreeStyle.errorProperty),
- ErrorDescription('which occupies the same area at a higher elevation.'),
- ];
- },
- ));
- return <PictureLayer>[
- _highlightConflictingLayer(predecessor),
- _highlightConflictingLayer(child),
- ];
- }
-
- /// Checks that no [PhysicalModelLayer] would paint after another overlapping
- /// [PhysicalModelLayer] that has a higher elevation.
- ///
- /// Returns a list of [PictureLayer] objects it added to the tree to highlight
- /// bad nodes. These layers should be removed from the tree after building the
- /// [Scene].
- List<PictureLayer> _debugCheckElevations() {
- final List<PhysicalModelLayer> physicalModelLayers = depthFirstIterateChildren().whereType<PhysicalModelLayer>().toList();
- final List<PictureLayer> addedLayers = <PictureLayer>[];
-
- for (int i = 0; i < physicalModelLayers.length; i++) {
- final PhysicalModelLayer physicalModelLayer = physicalModelLayers[i];
- assert(
- physicalModelLayer.lastChild?.debugCreator != physicalModelLayer,
- 'debugCheckElevations has either already visited this layer or failed '
- 'to remove the added picture from it.',
- );
- double accumulatedElevation = physicalModelLayer.elevation!;
- Layer? ancestor = physicalModelLayer.parent;
- while (ancestor != null) {
- if (ancestor is PhysicalModelLayer) {
- accumulatedElevation += ancestor.elevation!;
- }
- ancestor = ancestor.parent;
- }
- for (int j = 0; j <= i; j++) {
- final PhysicalModelLayer predecessor = physicalModelLayers[j];
- double predecessorAccumulatedElevation = predecessor.elevation!;
- ancestor = predecessor.parent;
- while (ancestor != null) {
- if (ancestor == predecessor) {
- continue;
- }
- if (ancestor is PhysicalModelLayer) {
- predecessorAccumulatedElevation += ancestor.elevation!;
- }
- ancestor = ancestor.parent;
- }
- if (predecessorAccumulatedElevation <= accumulatedElevation) {
- continue;
- }
- final Path intersection = Path.combine(
- PathOperation.intersect,
- predecessor._debugTransformedClipPath,
- physicalModelLayer._debugTransformedClipPath,
- );
- if (intersection != null && intersection.computeMetrics().any((ui.PathMetric metric) => metric.length > 0)) {
- addedLayers.addAll(_processConflictingPhysicalLayers(predecessor, physicalModelLayer));
- }
- }
- }
- return addedLayers;
- }
-
@override
void dispose() {
removeAllChildren();
@@ -2122,16 +2008,6 @@
}
}
- Path get _debugTransformedClipPath {
- ContainerLayer? ancestor = parent;
- final Matrix4 matrix = Matrix4.identity();
- while (ancestor != null && ancestor.parent != null) {
- ancestor.applyTransform(this, matrix);
- ancestor = ancestor.parent;
- }
- return clipPath!.transform(matrix.storage);
- }
-
/// {@macro flutter.material.Material.clipBehavior}
Clip get clipBehavior => _clipBehavior;
Clip _clipBehavior;
diff --git a/packages/flutter/test/foundation/service_extensions_test.dart b/packages/flutter/test/foundation/service_extensions_test.dart
index e9f5e6c..e2f592b 100644
--- a/packages/flutter/test/foundation/service_extensions_test.dart
+++ b/packages/flutter/test/foundation/service_extensions_test.dart
@@ -167,7 +167,7 @@
const int disabledExtensions = kIsWeb ? 2 : 0;
// If you add a service extension... TEST IT! :-)
// ...then increment this number.
- expect(binding.extensions.length, 31 + widgetInspectorExtensionCount - disabledExtensions);
+ expect(binding.extensions.length, 30 + widgetInspectorExtensionCount - disabledExtensions);
expect(console, isEmpty);
debugPrint = debugPrintThrottled;
@@ -198,34 +198,6 @@
expect(binding.frameScheduled, isFalse);
});
- test('Service extensions - debugCheckElevationsEnabled', () async {
- expect(binding.frameScheduled, isFalse);
- expect(debugCheckElevationsEnabled, false);
-
- bool lastValue = false;
- Future<void> _updateAndCheck(bool newValue) async {
- Map<String, dynamic>? result;
- binding.testExtension(
- 'debugCheckElevationsEnabled',
- <String, String>{'enabled': '$newValue'},
- ).then((Map<String, dynamic> answer) => result = answer);
- await binding.flushMicrotasks();
- expect(binding.frameScheduled, lastValue != newValue);
- await binding.doFrame();
- await binding.flushMicrotasks();
- expect(result, <String, String>{'enabled': '$newValue'});
- expect(debugCheckElevationsEnabled, newValue);
- lastValue = newValue;
- }
-
- await _updateAndCheck(false);
- await _updateAndCheck(true);
- await _updateAndCheck(true);
- await _updateAndCheck(false);
- await _updateAndCheck(false);
- expect(binding.frameScheduled, isFalse);
- });
-
test('Service extensions - debugDumpApp', () async {
final Map<String, dynamic> result = await binding.testExtension('debugDumpApp', <String, String>{});
diff --git a/packages/flutter/test/rendering/layers_test.dart b/packages/flutter/test/rendering/layers_test.dart
index 68e3070..ff47a58 100644
--- a/packages/flutter/test/rendering/layers_test.dart
+++ b/packages/flutter/test/rendering/layers_test.dart
@@ -418,172 +418,6 @@
});
});
- group('PhysicalModelLayer checks elevations', () {
- /// Adds the layers to a container where A paints before B.
- ///
- /// Expects there to be `expectedErrorCount` errors. Checking elevations is
- /// enabled by default.
- void _testConflicts(
- PhysicalModelLayer layerA,
- PhysicalModelLayer layerB, {
- required int expectedErrorCount,
- bool enableCheck = true,
- }) {
- assert(expectedErrorCount != null);
- assert(enableCheck || expectedErrorCount == 0, 'Cannot disable check and expect non-zero error count.');
- final OffsetLayer container = OffsetLayer();
- container.append(layerA);
- container.append(layerB);
- debugCheckElevationsEnabled = enableCheck;
- debugDisableShadows = false;
- int errors = 0;
- if (enableCheck) {
- FlutterError.onError = (FlutterErrorDetails details) {
- errors++;
- };
- }
- container.buildScene(SceneBuilder());
- expect(errors, expectedErrorCount);
- debugCheckElevationsEnabled = false;
- }
-
- // Tests:
- //
- // ───────────── (LayerA, paints first)
- // │ ───────────── (LayerB, paints second)
- // │ │
- // ───────────────────────────
- test('Overlapping layers at wrong elevation', () {
- final PhysicalModelLayer layerA = PhysicalModelLayer(
- clipPath: Path()..addRect(const Rect.fromLTWH(0, 0, 20, 20)),
- elevation: 3.0,
- color: const Color(0x00000000),
- shadowColor: const Color(0x00000000),
- );
- final PhysicalModelLayer layerB =PhysicalModelLayer(
- clipPath: Path()..addRect(const Rect.fromLTWH(10, 10, 20, 20)),
- elevation: 2.0,
- color: const Color(0x00000000),
- shadowColor: const Color(0x00000000),
- );
- _testConflicts(layerA, layerB, expectedErrorCount: 1);
- }, skip: isBrowser); // https://github.com/flutter/flutter/issues/44572
-
- // Tests:
- //
- // ───────────── (LayerA, paints first)
- // │ ───────────── (LayerB, paints second)
- // │ │
- // ───────────────────────────
- //
- // Causes no error if check is disabled.
- test('Overlapping layers at wrong elevation, check disabled', () {
- final PhysicalModelLayer layerA = PhysicalModelLayer(
- clipPath: Path()..addRect(const Rect.fromLTWH(0, 0, 20, 20)),
- elevation: 3.0,
- color: const Color(0x00000000),
- shadowColor: const Color(0x00000000),
- );
- final PhysicalModelLayer layerB =PhysicalModelLayer(
- clipPath: Path()..addRect(const Rect.fromLTWH(10, 10, 20, 20)),
- elevation: 2.0,
- color: const Color(0x00000000),
- shadowColor: const Color(0x00000000),
- );
- _testConflicts(layerA, layerB, expectedErrorCount: 0, enableCheck: false);
- });
-
- // Tests:
- //
- // ────────── (LayerA, paints first)
- // │ ─────────── (LayerB, paints second)
- // │ │
- // ────────────────────────────
- test('Non-overlapping layers at wrong elevation', () {
- final PhysicalModelLayer layerA = PhysicalModelLayer(
- clipPath: Path()..addRect(const Rect.fromLTWH(0, 0, 20, 20)),
- elevation: 3.0,
- color: const Color(0x00000000),
- shadowColor: const Color(0x00000000),
- );
- final PhysicalModelLayer layerB =PhysicalModelLayer(
- clipPath: Path()..addRect(const Rect.fromLTWH(20, 20, 20, 20)),
- elevation: 2.0,
- color: const Color(0x00000000),
- shadowColor: const Color(0x00000000),
- );
- _testConflicts(layerA, layerB, expectedErrorCount: 0);
- }, skip: isBrowser); // https://github.com/flutter/flutter/issues/44572
-
- // Tests:
- //
- // ─────── (Child of A, paints second)
- // │
- // ─────────── (LayerA, paints first)
- // │ ──────────── (LayerB, paints third)
- // │ │
- // ────────────────────────────
- test('Non-overlapping layers at wrong elevation, child at lower elevation', () {
- final PhysicalModelLayer layerA = PhysicalModelLayer(
- clipPath: Path()..addRect(const Rect.fromLTWH(0, 0, 20, 20)),
- elevation: 3.0,
- color: const Color(0x00000000),
- shadowColor: const Color(0x00000000),
- );
-
- layerA.append(PhysicalModelLayer(
- clipPath: Path()..addRect(const Rect.fromLTWH(2, 2, 10, 10)),
- elevation: 1.0,
- color: const Color(0x00000000),
- shadowColor: const Color(0x00000000),
- ));
-
- final PhysicalModelLayer layerB =PhysicalModelLayer(
- clipPath: Path()..addRect(const Rect.fromLTWH(20, 20, 20, 20)),
- elevation: 2.0,
- color: const Color(0x00000000),
- shadowColor: const Color(0x00000000),
- );
- _testConflicts(layerA, layerB, expectedErrorCount: 0);
- }, skip: isBrowser); // https://github.com/flutter/flutter/issues/44572
-
- // Tests:
- //
- // ─────────── (Child of A, paints second, overflows)
- // │ ──────────── (LayerB, paints third)
- // ─────────── │ (LayerA, paints first)
- // │ │
- // │ │
- // ────────────────────────────
- //
- // Which fails because the overflowing child overlaps something that paints
- // after it at a lower elevation.
- test('Child overflows parent and overlaps another physical layer', () {
- final PhysicalModelLayer layerA = PhysicalModelLayer(
- clipPath: Path()..addRect(const Rect.fromLTWH(0, 0, 20, 20)),
- elevation: 3.0,
- color: const Color(0x00000000),
- shadowColor: const Color(0x00000000),
- );
-
- layerA.append(PhysicalModelLayer(
- clipPath: Path()..addRect(const Rect.fromLTWH(15, 15, 25, 25)),
- elevation: 2.0,
- color: const Color(0x00000000),
- shadowColor: const Color(0x00000000),
- ));
-
- final PhysicalModelLayer layerB =PhysicalModelLayer(
- clipPath: Path()..addRect(const Rect.fromLTWH(20, 20, 20, 20)),
- elevation: 4.0,
- color: const Color(0x00000000),
- shadowColor: const Color(0x00000000),
- );
-
- _testConflicts(layerA, layerB, expectedErrorCount: 1);
- }, skip: isBrowser); // https://github.com/flutter/flutter/issues/44572
- });
-
test('ContainerLayer.toImage can render interior layer', () {
final OffsetLayer parent = OffsetLayer();
final OffsetLayer child = OffsetLayer();
diff --git a/packages/flutter/test/widgets/physical_model_test.dart b/packages/flutter/test/widgets/physical_model_test.dart
index 16f99c6..be374d4 100644
--- a/packages/flutter/test/widgets/physical_model_test.dart
+++ b/packages/flutter/test/widgets/physical_model_test.dart
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-import 'dart:math' as math show pi;
-
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart';
@@ -100,420 +98,4 @@
matchesGoldenFile('physical_model_overflow.png'),
);
});
-
- group('PhysicalModelLayer checks elevation', () {
- Future<void> _testStackChildren(
- WidgetTester tester,
- List<Widget> children, {
- required int expectedErrorCount,
- bool enableCheck = true,
- }) async {
- assert(expectedErrorCount != null);
- if (enableCheck) {
- debugCheckElevationsEnabled = true;
- } else {
- assert(expectedErrorCount == 0, 'Cannot expect errors if check is disabled.');
- }
- debugDisableShadows = false;
- int count = 0;
- final void Function(FlutterErrorDetails)? oldOnError = FlutterError.onError;
- FlutterError.onError = (FlutterErrorDetails details) {
- count++;
- };
- await tester.pumpWidget(Directionality(
- textDirection: TextDirection.ltr,
- child: Stack(
- children: children,
- ),
- ),
- );
- FlutterError.onError = oldOnError;
- expect(count, expectedErrorCount);
- if (enableCheck) {
- debugCheckElevationsEnabled = false;
- }
- debugDisableShadows = true;
- }
-
- // Tests:
- //
- // ─────────── (red rect, paints second, child)
- // │
- // ─────────── (green rect, paints first)
- // │
- // ────────────────────────────
- testWidgets('entirely overlapping, direct child', (WidgetTester tester) async {
- const List<Widget> children = <Widget>[
- SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 1.0,
- color: Colors.green,
- child: Material(
- elevation: 2.0,
- color: Colors.red,
- ),
- ),
- ),
- ];
-
- await _testStackChildren(tester, children, expectedErrorCount: 0);
- expect(find.byType(Material), findsNWidgets(2));
- });
-
-
- // Tests:
- //
- // ─────────────── (green rect, paints second)
- // ─────────── │ (blue rect, paints first)
- // │ │
- // │ │
- // ────────────────────────────
- testWidgets('entirely overlapping, correct painting order', (WidgetTester tester) async {
- const List<Widget> children = <Widget>[
- SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 1.0,
- color: Colors.green,
- ),
- ),
- SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 2.0,
- color: Colors.blue,
- ),
- ),
- ];
-
- await _testStackChildren(tester, children, expectedErrorCount: 0);
- expect(find.byType(Material), findsNWidgets(2));
- });
-
-
- // Tests:
- //
- // ─────────────── (green rect, paints first)
- // │ ─────────── (blue rect, paints second)
- // │ │
- // │ │
- // ────────────────────────────
- testWidgets('entirely overlapping, wrong painting order', (WidgetTester tester) async {
- const List<Widget> children = <Widget>[
- SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 2.0,
- color: Colors.green,
- ),
- ),
- SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 1.0,
- color: Colors.blue,
- ),
- ),
- ];
-
- await _testStackChildren(tester, children, expectedErrorCount: 1);
- expect(find.byType(Material), findsNWidgets(2));
- });
-
-
- // Tests:
- //
- // ─────────────── (brown rect, paints first)
- // │ ─────────── (red circle, paints second)
- // │ │
- // │ │
- // ────────────────────────────
- testWidgets('not non-rect not overlapping, wrong painting order', (WidgetTester tester) async {
- // These would be overlapping if we only took the rectangular bounds of the circle.
- final List<Widget> children = <Widget>[
- Positioned.fromRect(
- rect: const Rect.fromLTWH(150, 150, 150, 150),
- child: const SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 3.0,
- color: Colors.brown,
- ),
- ),
- ),
- Positioned.fromRect(
- rect: const Rect.fromLTWH(20, 20, 140, 150),
- child: const SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 2.0,
- color: Colors.red,
- shape: CircleBorder(),
- ),
- ),
- ),
- ];
-
- await _testStackChildren(tester, children, expectedErrorCount: 0);
- expect(find.byType(Material), findsNWidgets(2));
- }, skip: isBrowser); // https://github.com/flutter/flutter/issues/52855
-
- // Tests:
- //
- // ─────────────── (brown rect, paints first)
- // │ ─────────── (red circle, paints second)
- // │ │
- // │ │
- // ────────────────────────────
- testWidgets('not non-rect entirely overlapping, wrong painting order', (WidgetTester tester) async {
- final List<Widget> children = <Widget>[
- Positioned.fromRect(
- rect: const Rect.fromLTWH(20, 20, 140, 150),
- child: const SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 3.0,
- color: Colors.brown,
- ),
- ),
- ),
- Positioned.fromRect(
- rect: const Rect.fromLTWH(50, 50, 100, 100),
- child: const SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 2.0,
- color: Colors.red,
- shape: CircleBorder(),
- ),
- ),
- ),
- ];
-
- await _testStackChildren(tester, children, expectedErrorCount: 1);
- expect(find.byType(Material), findsNWidgets(2));
- });
-
- // Tests:
- //
- // ─────────────── (brown rect, paints first)
- // │ ──────────── (red circle, paints second)
- // │ │
- // │ │
- // ────────────────────────────
- testWidgets('non-rect partially overlapping, wrong painting order', (WidgetTester tester) async {
- final List<Widget> children = <Widget>[
- Positioned.fromRect(
- rect: const Rect.fromLTWH(150, 150, 150, 150),
- child: const SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 3.0,
- color: Colors.brown,
- ),
- ),
- ),
- Positioned.fromRect(
- rect: const Rect.fromLTWH(30, 20, 150, 150),
- child: const SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 2.0,
- color: Colors.red,
- shape: CircleBorder(),
- ),
- ),
- ),
- ];
-
- await _testStackChildren(tester, children, expectedErrorCount: 1);
- expect(find.byType(Material), findsNWidgets(2));
- });
-
- // Tests:
- //
- // ─────────────── (green rect, paints second, overlaps red rect)
- // │
- // │
- // ────────────────────────── (brown and red rects, overlapping but same elevation, paint first and third)
- // │ │
- // ────────────────────────────
- //
- // Fails because the green rect overlaps the
- testWidgets('child partially overlapping, wrong painting order', (WidgetTester tester) async {
- final List<Widget> children = <Widget>[
- Positioned.fromRect(
- rect: const Rect.fromLTWH(150, 150, 150, 150),
- child: const SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 1.0,
- color: Colors.brown,
- child: Padding(
- padding: EdgeInsets.all(30.0),
- child: Material(
- elevation: 2.0,
- color: Colors.green,
- ),
- ),
- ),
- ),
- ),
- Positioned.fromRect(
- rect: const Rect.fromLTWH(30, 20, 180, 180),
- child: const SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 1.0,
- color: Colors.red,
- ),
- ),
- ),
- ];
-
- await _testStackChildren(tester, children, expectedErrorCount: 1);
- expect(find.byType(Material), findsNWidgets(3));
- });
-
- // Tests:
- //
- // ─────────────── (brown rect, paints first)
- // │ ──────────── (red circle, paints second)
- // │ │
- // │ │
- // ────────────────────────────
- testWidgets('non-rect partially overlapping, wrong painting order, check disabled', (WidgetTester tester) async {
- final List<Widget> children = <Widget>[
- Positioned.fromRect(
- rect: const Rect.fromLTWH(150, 150, 150, 150),
- child: const SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 3.0,
- color: Colors.brown,
- ),
- ),
- ),
- Positioned.fromRect(
- rect: const Rect.fromLTWH(30, 20, 150, 150),
- child: const SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 2.0,
- color: Colors.red,
- shape: CircleBorder(),
- ),
- ),
- ),
- ];
-
- await _testStackChildren(
- tester,
- children,
- expectedErrorCount: 0,
- enableCheck: false,
- );
- expect(find.byType(Material), findsNWidgets(2));
- });
-
- // Tests:
- //
- // ──────────── (brown rect, paints first, rotated but doesn't overlap)
- // │ ──────────── (red circle, paints second)
- // │ │
- // │ │
- // ────────────────────────────
- testWidgets('with a RenderTransform, non-overlapping', (WidgetTester tester) async {
-
- final List<Widget> children = <Widget>[
- Positioned.fromRect(
- rect: const Rect.fromLTWH(140, 100, 140, 150),
- child: SizedBox(
- width: 300,
- height: 300,
- child: Transform.rotate(
- angle: math.pi / 180 * 15,
- child: const Material(
- elevation: 3.0,
- color: Colors.brown,
- ),
- ),
- ),
- ),
- Positioned.fromRect(
- rect: const Rect.fromLTWH(50, 50, 100, 100),
- child: const SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 2.0,
- color: Colors.red,
- shape: CircleBorder(),
- ),
- ),
- ),
- ];
-
- await _testStackChildren(tester, children, expectedErrorCount: 0);
- expect(find.byType(Material), findsNWidgets(2));
- }, skip: isBrowser); // https://github.com/flutter/flutter/issues/52855
-
- // Tests:
- //
- // ────────────── (brown rect, paints first, rotated so it overlaps)
- // │ ──────────── (red circle, paints second)
- // │ │
- // │ │
- // ────────────────────────────
- // This would be fine without the rotation.
- testWidgets('with a RenderTransform, overlapping', (WidgetTester tester) async {
- final List<Widget> children = <Widget>[
- Positioned.fromRect(
- rect: const Rect.fromLTWH(140, 100, 140, 150),
- child: SizedBox(
- width: 300,
- height: 300,
- child: Transform.rotate(
- angle: math.pi / 180 * 8,
- child: const Material(
- elevation: 3.0,
- color: Colors.brown,
- ),
- ),
- ),
- ),
- Positioned.fromRect(
- rect: const Rect.fromLTWH(50, 50, 100, 100),
- child: const SizedBox(
- width: 300,
- height: 300,
- child: Material(
- elevation: 2.0,
- color: Colors.red,
- shape: CircleBorder(),
- ),
- ),
- ),
- ];
-
- await _testStackChildren(tester, children, expectedErrorCount: 1);
- expect(find.byType(Material), findsNWidgets(2));
- });
- });
}
diff --git a/packages/flutter_tools/lib/src/base/command_help.dart b/packages/flutter_tools/lib/src/base/command_help.dart
index dae8862..49c5cfb 100644
--- a/packages/flutter_tools/lib/src/base/command_help.dart
+++ b/packages/flutter_tools/lib/src/base/command_help.dart
@@ -167,12 +167,6 @@
'debugDumpApp',
);
- late final CommandHelpOption z = _makeOption(
- 'z',
- 'Toggle elevation checker.',
- 'debugCheckElevationsEnabled',
- );
-
// When updating the list above, see the notes above the list regarding order
// and tests.
diff --git a/packages/flutter_tools/lib/src/resident_runner.dart b/packages/flutter_tools/lib/src/resident_runner.dart
index 29f7d4d..0672e7a 100644
--- a/packages/flutter_tools/lib/src/resident_runner.dart
+++ b/packages/flutter_tools/lib/src/resident_runner.dart
@@ -738,22 +738,6 @@
return true;
}
- /// Toggle the "elevation check" debugging feature.
- Future<bool> debugToggleDebugCheckElevationsEnabled() async {
- if (!supportsServiceProtocol) {
- return false;
- }
- for (final FlutterDevice device in flutterDevices) {
- final List<FlutterView> views = await device.vmService.getFlutterViews();
- for (final FlutterView view in views) {
- await device.vmService.flutterToggleDebugCheckElevationsEnabled(
- isolateId: view.uiIsolate.id,
- );
- }
- }
- return true;
- }
-
/// Toggle the performance overlay.
///
/// This is not supported in web mode.
@@ -1426,7 +1410,6 @@
commandHelp.I.print();
commandHelp.o.print();
commandHelp.b.print();
- commandHelp.z.print();
} else {
commandHelp.S.print();
commandHelp.U.print();
@@ -1659,9 +1642,6 @@
case 'w':
case 'W':
return residentRunner.debugDumpApp();
- case 'z':
- case 'Z':
- return residentRunner.debugToggleDebugCheckElevationsEnabled();
}
return false;
}
diff --git a/packages/flutter_tools/lib/src/vmservice.dart b/packages/flutter_tools/lib/src/vmservice.dart
index a07d934..e9e363d 100644
--- a/packages/flutter_tools/lib/src/vmservice.dart
+++ b/packages/flutter_tools/lib/src/vmservice.dart
@@ -613,10 +613,6 @@
@required String isolateId,
}) => _flutterToggle('debugPaint', isolateId: isolateId);
- Future<Map<String, dynamic>> flutterToggleDebugCheckElevationsEnabled({
- @required String isolateId,
- }) => _flutterToggle('debugCheckElevationsEnabled', isolateId: isolateId);
-
Future<Map<String, dynamic>> flutterTogglePerformanceOverlayOverride({
@required String isolateId,
}) => _flutterToggle('showPerformanceOverlay', isolateId: isolateId);
diff --git a/packages/flutter_tools/test/general.shard/base/command_help_test.dart b/packages/flutter_tools/test/general.shard/base/command_help_test.dart
index 3251646..3fbf80a 100644
--- a/packages/flutter_tools/test/general.shard/base/command_help_test.dart
+++ b/packages/flutter_tools/test/general.shard/base/command_help_test.dart
@@ -72,7 +72,6 @@
expect(commandHelp.s.toString().length, lessThanOrEqualTo(expectedWidth));
expect(commandHelp.t.toString().length, lessThanOrEqualTo(expectedWidth));
expect(commandHelp.w.toString().length, lessThanOrEqualTo(expectedWidth));
- expect(commandHelp.z.toString().length, lessThanOrEqualTo(expectedWidth));
}
void main() {
@@ -123,7 +122,6 @@
expect(commandHelp.s.toString(), startsWith('\x1B[1ms\x1B[22m'));
expect(commandHelp.t.toString(), startsWith('\x1B[1mt\x1B[22m'));
expect(commandHelp.w.toString(), startsWith('\x1B[1mw\x1B[22m'));
- expect(commandHelp.z.toString(), startsWith('\x1B[1mz\x1B[22m'));
});
testWithoutContext('commands that should have a grey bolden parenthetical text', () {
@@ -144,7 +142,6 @@
expect(commandHelp.p.toString(), endsWith('\x1B[90m(debugPaintSizeEnabled)\x1B[39m\x1B[22m'));
expect(commandHelp.t.toString(), endsWith('\x1B[90m(debugDumpRenderTree)\x1B[39m\x1B[22m'));
expect(commandHelp.w.toString(), endsWith('\x1B[90m(debugDumpApp)\x1B[39m\x1B[22m'));
- expect(commandHelp.z.toString(), endsWith('\x1B[90m(debugCheckElevationsEnabled)\x1B[39m\x1B[22m'));
});
testWithoutContext('should not create a help text longer than maxLineWidth without ansi support', () {
@@ -208,7 +205,6 @@
expect(commandHelp.t.toString(), equals('\x1B[1mt\x1B[22m Dump rendering tree to the console. \x1B[90m(debugDumpRenderTree)\x1B[39m\x1B[22m'));
expect(commandHelp.v.toString(), equals('\x1B[1mv\x1B[22m Open Flutter DevTools.'));
expect(commandHelp.w.toString(), equals('\x1B[1mw\x1B[22m Dump widget hierarchy to the console. \x1B[90m(debugDumpApp)\x1B[39m\x1B[22m'));
- expect(commandHelp.z.toString(), equals('\x1B[1mz\x1B[22m Toggle elevation checker. \x1B[90m(debugCheckElevationsEnabled)\x1B[39m\x1B[22m'));
});
testWithoutContext('should create the correct help text without ansi support', () {
@@ -240,7 +236,6 @@
expect(commandHelp.t.toString(), equals('t Dump rendering tree to the console. (debugDumpRenderTree)'));
expect(commandHelp.v.toString(), equals('v Open Flutter DevTools.'));
expect(commandHelp.w.toString(), equals('w Dump widget hierarchy to the console. (debugDumpApp)'));
- expect(commandHelp.z.toString(), equals('z Toggle elevation checker. (debugCheckElevationsEnabled)'));
});
});
});
diff --git a/packages/flutter_tools/test/general.shard/resident_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_runner_test.dart
index 99b044e..832c3ba 100644
--- a/packages/flutter_tools/test/general.shard/resident_runner_test.dart
+++ b/packages/flutter_tools/test/general.shard/resident_runner_test.dart
@@ -1239,7 +1239,6 @@
commandHelp.I,
commandHelp.o,
commandHelp.b,
- commandHelp.z,
commandHelp.P,
commandHelp.a,
commandHelp.M,
diff --git a/packages/flutter_tools/test/integration.shard/overall_experience_test.dart b/packages/flutter_tools/test/integration.shard/overall_experience_test.dart
index aff2e13..3f0778f 100644
--- a/packages/flutter_tools/test/integration.shard/overall_experience_test.dart
+++ b/packages/flutter_tools/test/integration.shard/overall_experience_test.dart
@@ -600,7 +600,6 @@
'I Toggle oversized image inversion. (debugInvertOversizedImages)',
'o Simulate different operating systems. (defaultTargetPlatform)',
'b Toggle platform brightness (dark and light mode). (debugBrightnessOverride)',
- 'z Toggle elevation checker. (debugCheckElevationsEnabled)',
'P Toggle performance overlay. (WidgetsApp.showPerformanceOverlay)',
'a Toggle timeline events for all widget build methods. (debugProfileWidgetBuilds)',
'M Write SkSL shaders to a unique file in the project directory.',