// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets('Tracks picture layers accurately when painting is interleaved with a pushLayer', (WidgetTester tester) async { // Creates a RenderObject that will paint into multiple picture layers. // Asserts that both layers get a handle, and that all layers get correctly // released. final GlobalKey key = GlobalKey(); await tester.pumpWidget(RepaintBoundary( child: CustomPaint( key: key, painter: SimplePainter(), foregroundPainter: SimplePainter(), child: const RepaintBoundary(child: Placeholder()), ), )); final List<Layer> layers = tester.binding.renderView.debugLayer!.depthFirstIterateChildren(); final RenderObject renderObject = key.currentContext!.findRenderObject()!; for (final Layer layer in layers) { expect(layer.debugDisposed, false); } await tester.pumpWidget(const SizedBox()); for (final Layer layer in layers) { expect(layer.debugDisposed, true); } expect(renderObject.debugDisposed, true); }); } class SimplePainter extends CustomPainter { @override void paint(Canvas canvas, Size size) { canvas.drawPaint(Paint()); } @override bool shouldRepaint(SimplePainter oldDelegate) => true; }