Commit bbf98d9c authored by Ian Hickson's avatar Ian Hickson Committed by GitHub

SizedBox.expand (#6791)

parent fcd47f84
...@@ -808,11 +808,20 @@ class CustomMultiChildLayout extends MultiChildRenderObjectWidget { ...@@ -808,11 +808,20 @@ class CustomMultiChildLayout extends MultiChildRenderObjectWidget {
/// ///
/// If not given a child, this widget will size itself to the given width and /// If not given a child, this widget will size itself to the given width and
/// height, treating nulls as zero. /// height, treating nulls as zero.
///
/// The [new SizedBox.expand] constructor can be used to make a [SizedBox] that
/// sizes itself to fit the parent. It is equivalent to setting [width] and
/// [height] to [double.INFINITY].
class SizedBox extends SingleChildRenderObjectWidget { class SizedBox extends SingleChildRenderObjectWidget {
/// Creates a box of a specific size. /// Creates a box of a specific size.
const SizedBox({ Key key, this.width, this.height, Widget child }) const SizedBox({ Key key, this.width, this.height, Widget child })
: super(key: key, child: child); : super(key: key, child: child);
const SizedBox.expand({ Key key, Widget child })
: width = double.INFINITY,
height = double.INFINITY,
super(key: key, child: child);
/// If non-null, requires the child to have exactly this width. /// If non-null, requires the child to have exactly this width.
final double width; final double width;
...@@ -833,13 +842,22 @@ class SizedBox extends SingleChildRenderObjectWidget { ...@@ -833,13 +842,22 @@ class SizedBox extends SingleChildRenderObjectWidget {
renderObject.additionalConstraints = _additionalConstraints; renderObject.additionalConstraints = _additionalConstraints;
} }
@override
String toStringShort() {
String type = (width == double.INFINITY && height == double.INFINITY) ?
'$runtimeType.expand' : '$runtimeType';
return key == null ? '$type' : '$type-$key';
}
@override @override
void debugFillDescription(List<String> description) { void debugFillDescription(List<String> description) {
super.debugFillDescription(description); super.debugFillDescription(description);
if (width != null) if (width != double.INFINITY || height != double.INFINITY) {
description.add('width: $width'); if (width != null)
if (height != null) description.add('width: $width');
description.add('height: $height'); if (height != null)
description.add('height: $height');
}
} }
} }
......
// Copyright 2016 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/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('SizedBox - no child', (WidgetTester tester) async {
GlobalKey patient = new GlobalKey();
await tester.pumpWidget(
new Center(
child: new SizedBox(
key: patient,
)
)
);
expect(patient.currentContext.size, equals(const Size(0.0, 0.0)));
await tester.pumpWidget(
new Center(
child: new SizedBox(
key: patient,
height: 0.0,
)
)
);
expect(patient.currentContext.size, equals(const Size(0.0, 0.0)));
await tester.pumpWidget(
new Center(
child: new SizedBox(
key: patient,
width: 0.0,
height: 0.0,
)
)
);
expect(patient.currentContext.size, equals(const Size(0.0, 0.0)));
await tester.pumpWidget(
new Center(
child: new SizedBox(
key: patient,
width: 100.0,
height: 100.0,
)
)
);
expect(patient.currentContext.size, equals(const Size(100.0, 100.0)));
await tester.pumpWidget(
new Center(
child: new SizedBox(
key: patient,
width: 1000.0,
height: 1000.0,
)
)
);
expect(patient.currentContext.size, equals(const Size(800.0, 600.0)));
await tester.pumpWidget(
new Center(
child: new SizedBox.expand(
key: patient,
)
)
);
expect(patient.currentContext.size, equals(const Size(800.0, 600.0)));
});
testWidgets('SizedBox - container child', (WidgetTester tester) async {
GlobalKey patient = new GlobalKey();
await tester.pumpWidget(
new Center(
child: new SizedBox(
key: patient,
child: new Container(),
)
)
);
expect(patient.currentContext.size, equals(const Size(800.0, 600.0)));
await tester.pumpWidget(
new Center(
child: new SizedBox(
key: patient,
height: 0.0,
child: new Container(),
)
)
);
expect(patient.currentContext.size, equals(const Size(800.0, 0.0)));
await tester.pumpWidget(
new Center(
child: new SizedBox(
key: patient,
width: 0.0,
height: 0.0,
child: new Container(),
)
)
);
expect(patient.currentContext.size, equals(const Size(0.0, 0.0)));
await tester.pumpWidget(
new Center(
child: new SizedBox(
key: patient,
width: 100.0,
height: 100.0,
child: new Container(),
)
)
);
expect(patient.currentContext.size, equals(const Size(100.0, 100.0)));
await tester.pumpWidget(
new Center(
child: new SizedBox(
key: patient,
width: 1000.0,
height: 1000.0,
child: new Container(),
)
)
);
expect(patient.currentContext.size, equals(const Size(800.0, 600.0)));
await tester.pumpWidget(
new Center(
child: new SizedBox.expand(
key: patient,
child: new Container(),
)
)
);
expect(patient.currentContext.size, equals(const Size(800.0, 600.0)));
});
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment