// 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/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { testWidgets('repaint boundary with constraint changes', (WidgetTester tester) async { // Regression test for as https://github.com/flutter/flutter/issues/39151. await tester.pumpWidget(const RelayoutBoundariesCrash()); tester.state<RelayoutBoundariesCrashState>(find.byType(RelayoutBoundariesCrash))._toggleMode(); await tester.pump(); }); } class RelayoutBoundariesCrash extends StatefulWidget { const RelayoutBoundariesCrash({Key? key}) : super(key: key); @override RelayoutBoundariesCrashState createState() => RelayoutBoundariesCrashState(); } class RelayoutBoundariesCrashState extends State<RelayoutBoundariesCrash> { bool _mode = true; void _toggleMode() { setState(() { _mode = !_mode; }); } @override Widget build(BuildContext context) { return Center( child: SizedBox( // when _mode is true, constraints are tight, otherwise constraints are loose width: !_mode ? 100.0 : null, height: !_mode ? 100.0 : null, child: LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { // Make the outer SizedBoxes relayout without making the Placeholders relayout. final double dimension = !_mode ? 10.0 : 20.0; return Column( children: <Widget>[ SizedBox( width: dimension, height: dimension, child: const Placeholder(), ), SizedBox( width: dimension, height: dimension, child: const Placeholder(), ), ], ); }, ), ), ); } }