diff --git a/packages/flutter/lib/src/rendering/layer.dart b/packages/flutter/lib/src/rendering/layer.dart index 711303dc8e0..7c617b43cf3 100644 --- a/packages/flutter/lib/src/rendering/layer.dart +++ b/packages/flutter/lib/src/rendering/layer.dart @@ -1764,11 +1764,16 @@ class OpacityLayer extends OffsetLayer { @override void addToScene(ui.SceneBuilder builder) { assert(alpha != null); - bool enabled = firstChild != null; // don't add this layer if there's no child + + // Don't add this layer if there's no child. + bool enabled = firstChild != null; if (!enabled) { + // Ensure the engineLayer is disposed. + engineLayer = null; // TODO(dnfield): Remove this if/when we can fix https://github.com/flutter/flutter/issues/90004 return; } + assert(() { enabled = enabled && !debugDisableOpacityLayers; return true; diff --git a/packages/flutter/test/rendering/layers_test.dart b/packages/flutter/test/rendering/layers_test.dart index 8d4e2dcede0..1d9aa4a816c 100644 --- a/packages/flutter/test/rendering/layers_test.dart +++ b/packages/flutter/test/rendering/layers_test.dart @@ -637,6 +637,21 @@ void main() { expect(builder.addedPicture, true); expect(layer.engineLayer, isA()); }); + + test('OpacityLayer dispose its engineLayer if there are no children', () { + final OpacityLayer layer = OpacityLayer(alpha: 128); + final FakeSceneBuilder builder = FakeSceneBuilder(); + layer.addToScene(builder); + expect(layer.engineLayer, null); + + layer.append(PictureLayer(Rect.largest)..picture = FakePicture()); + layer.addToScene(builder); + expect(layer.engineLayer, isA()); + + layer.removeAllChildren(); + layer.addToScene(builder); + expect(layer.engineLayer, null); + }); } class FakeEngineLayer extends Fake implements EngineLayer {