// Copyright 2015 The Chromium 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_web_test/flutter_web_test.dart'; import 'package:flutter_web/rendering.dart'; import 'package:flutter_web/widgets.dart'; void main() { testWidgets('LayoutBuilder parent size', (WidgetTester tester) async { Size layoutBuilderSize; final Key childKey = UniqueKey(); final Key parentKey = UniqueKey(); await tester.pumpWidget(Center( child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 100.0, maxHeight: 200.0), child: LayoutBuilder( key: parentKey, builder: (BuildContext context, BoxConstraints constraints) { layoutBuilderSize = constraints.biggest; return SizedBox( key: childKey, width: layoutBuilderSize.width / 2.0, height: layoutBuilderSize.height / 2.0); })))); expect(layoutBuilderSize, const Size(100.0, 200.0)); final RenderBox parentBox = tester.renderObject(find.byKey(parentKey)); expect(parentBox.size, equals(const Size(50.0, 100.0))); final RenderBox childBox = tester.renderObject(find.byKey(childKey)); expect(childBox.size, equals(const Size(50.0, 100.0))); }); testWidgets('LayoutBuilder stateful child', (WidgetTester tester) async { Size layoutBuilderSize; StateSetter setState; final Key childKey = UniqueKey(); final Key parentKey = UniqueKey(); double childWidth = 10.0; double childHeight = 20.0; await tester.pumpWidget(Center( child: LayoutBuilder( key: parentKey, builder: (BuildContext context, BoxConstraints constraints) { layoutBuilderSize = constraints.biggest; return StatefulBuilder( builder: (BuildContext context, StateSetter setter) { setState = setter; return SizedBox( key: childKey, width: childWidth, height: childHeight); }); }))); expect(layoutBuilderSize, equals(const Size(800.0, 600.0))); RenderBox parentBox = tester.renderObject(find.byKey(parentKey)); expect(parentBox.size, equals(const Size(10.0, 20.0))); RenderBox childBox = tester.renderObject(find.byKey(childKey)); expect(childBox.size, equals(const Size(10.0, 20.0))); setState(() { childWidth = 100.0; childHeight = 200.0; }); await tester.pump(); parentBox = tester.renderObject(find.byKey(parentKey)); expect(parentBox.size, equals(const Size(100.0, 200.0))); childBox = tester.renderObject(find.byKey(childKey)); expect(childBox.size, equals(const Size(100.0, 200.0))); }); testWidgets('LayoutBuilder stateful parent', (WidgetTester tester) async { Size layoutBuilderSize; StateSetter setState; final Key childKey = UniqueKey(); double childWidth = 10.0; double childHeight = 20.0; await tester.pumpWidget(Center(child: StatefulBuilder(builder: (BuildContext context, StateSetter setter) { setState = setter; return SizedBox( width: childWidth, height: childHeight, child: LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { layoutBuilderSize = constraints.biggest; return SizedBox( key: childKey, width: layoutBuilderSize.width, height: layoutBuilderSize.height); })); }))); expect(layoutBuilderSize, equals(const Size(10.0, 20.0))); RenderBox box = tester.renderObject(find.byKey(childKey)); expect(box.size, equals(const Size(10.0, 20.0))); setState(() { childWidth = 100.0; childHeight = 200.0; }); await tester.pump(); box = tester.renderObject(find.byKey(childKey)); expect(box.size, equals(const Size(100.0, 200.0))); }); testWidgets( 'LayoutBuilder and Inherited -- do not rebuild when not using inherited', (WidgetTester tester) async { int built = 0; final Widget target = LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { built += 1; return Container(); }); expect(built, 0); await tester.pumpWidget(MediaQuery( data: const MediaQueryData(size: Size(400.0, 300.0)), child: target)); expect(built, 1); await tester.pumpWidget(MediaQuery( data: const MediaQueryData(size: Size(300.0, 400.0)), child: target)); expect(built, 1); }); testWidgets('LayoutBuilder and Inherited -- do rebuild when using inherited', (WidgetTester tester) async { int built = 0; final Widget target = LayoutBuilder( builder: (BuildContext context, BoxConstraints constraints) { built += 1; MediaQuery.of(context); return Container(); }); expect(built, 0); await tester.pumpWidget(MediaQuery( data: const MediaQueryData(size: Size(400.0, 300.0)), child: target)); expect(built, 1); await tester.pumpWidget(MediaQuery( data: const MediaQueryData(size: Size(300.0, 400.0)), child: target)); expect(built, 2); }); }