David PHAM-VAN

Add Flexible and Spacer Widgets

@@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
2 * Deprecate the document argument in Printing.sharePdf() 2 * Deprecate the document argument in Printing.sharePdf()
3 * Add default value to alpha in PdfColor variants 3 * Add default value to alpha in PdfColor variants
4 * Fix Table Widget 4 * Fix Table Widget
  5 +* Add Flexible and Spacer Widgets
5 6
6 # 1.3.9 7 # 1.3.9
7 * Fix Transform Widget alignment 8 * Fix Transform Widget alignment
@@ -94,7 +94,7 @@ class Flex extends MultiChildWidget { @@ -94,7 +94,7 @@ class Flex extends MultiChildWidget {
94 double maxFlexFractionSoFar = 0; 94 double maxFlexFractionSoFar = 0;
95 95
96 for (Widget child in children) { 96 for (Widget child in children) {
97 - final int flex = child is Expanded ? child.flex : 0; 97 + final int flex = child is Flexible ? child.flex : 0;
98 totalFlex += flex; 98 totalFlex += flex;
99 if (flex > 0) { 99 if (flex > 0) {
100 final double flexFraction = childSize(child, extent) / flex; 100 final double flexFraction = childSize(child, extent) / flex;
@@ -116,7 +116,7 @@ class Flex extends MultiChildWidget { @@ -116,7 +116,7 @@ class Flex extends MultiChildWidget {
116 double inflexibleSpace = 0; 116 double inflexibleSpace = 0;
117 double maxCrossSize = 0; 117 double maxCrossSize = 0;
118 for (Widget child in children) { 118 for (Widget child in children) {
119 - final int flex = child is Expanded ? child.flex : 0; 119 + final int flex = child is Flexible ? child.flex : 0;
120 totalFlex += flex; 120 totalFlex += flex;
121 double mainSize; 121 double mainSize;
122 double crossSize; 122 double crossSize;
@@ -143,7 +143,7 @@ class Flex extends MultiChildWidget { @@ -143,7 +143,7 @@ class Flex extends MultiChildWidget {
143 143
144 // Size remaining (flexible) items, find the maximum cross size. 144 // Size remaining (flexible) items, find the maximum cross size.
145 for (Widget child in children) { 145 for (Widget child in children) {
146 - final int flex = child is Expanded ? child.flex : 0; 146 + final int flex = child is Flexible ? child.flex : 0;
147 if (flex > 0) { 147 if (flex > 0) {
148 maxCrossSize = 148 maxCrossSize =
149 math.max(maxCrossSize, childSize(child, spacePerFlex * flex)); 149 math.max(maxCrossSize, childSize(child, spacePerFlex * flex));
@@ -219,8 +219,8 @@ class Flex extends MultiChildWidget { @@ -219,8 +219,8 @@ class Flex extends MultiChildWidget {
219 double allocatedSize = 0; // Sum of the sizes of the non-flexible children. 219 double allocatedSize = 0; // Sum of the sizes of the non-flexible children.
220 220
221 for (Widget child in children) { 221 for (Widget child in children) {
222 - final int flex = child is Expanded ? child.flex : 0;  
223 - final FlexFit fit = child is Expanded ? child.fit : FlexFit.loose; 222 + final int flex = child is Flexible ? child.flex : 0;
  223 + final FlexFit fit = child is Flexible ? child.fit : FlexFit.loose;
224 if (flex > 0) { 224 if (flex > 0) {
225 assert(() { 225 assert(() {
226 final String dimension = 226 final String dimension =
@@ -277,8 +277,8 @@ class Flex extends MultiChildWidget { @@ -277,8 +277,8 @@ class Flex extends MultiChildWidget {
277 canFlex && totalFlex > 0 ? (freeSpace / totalFlex) : double.nan; 277 canFlex && totalFlex > 0 ? (freeSpace / totalFlex) : double.nan;
278 278
279 for (Widget child in children) { 279 for (Widget child in children) {
280 - final int flex = child is Expanded ? child.flex : 0;  
281 - final FlexFit fit = child is Expanded ? child.fit : FlexFit.loose; 280 + final int flex = child is Flexible ? child.flex : 0;
  281 + final FlexFit fit = child is Flexible ? child.fit : FlexFit.loose;
282 if (flex > 0) { 282 if (flex > 0) {
283 final double maxChildExtent = canFlex 283 final double maxChildExtent = canFlex
284 ? (child == lastFlexChild 284 ? (child == lastFlexChild
@@ -497,15 +497,18 @@ class Column extends Flex { @@ -497,15 +497,18 @@ class Column extends Flex {
497 ); 497 );
498 } 498 }
499 499
500 -class Expanded extends SingleChildWidget {  
501 - Expanded({ 500 +/// A widget that controls how a child of a [Row], [Column], or [Flex] flexes.
  501 +class Flexible extends SingleChildWidget {
  502 + Flexible({
502 this.flex = 1, 503 this.flex = 1,
503 - this.fit = FlexFit.tight, 504 + this.fit = FlexFit.loose,
504 @required Widget child, 505 @required Widget child,
505 }) : super(child: child); 506 }) : super(child: child);
506 507
  508 + /// The flex factor to use for this child
507 final int flex; 509 final int flex;
508 510
  511 + /// How a flexible child is inscribed into the available space.
509 final FlexFit fit; 512 final FlexFit fit;
510 513
511 @override 514 @override
@@ -515,6 +518,34 @@ class Expanded extends SingleChildWidget { @@ -515,6 +518,34 @@ class Expanded extends SingleChildWidget {
515 } 518 }
516 } 519 }
517 520
  521 +class Expanded extends Flexible {
  522 + Expanded({
  523 + int flex = 1,
  524 + FlexFit fit = FlexFit.tight,
  525 + @required Widget child,
  526 + }) : super(child: child, flex: flex, fit: fit);
  527 +}
  528 +
  529 +/// Spacer creates an adjustable, empty spacer that can be used to tune the
  530 +/// spacing between widgets in a [Flex] container, like [Row] or [Column].
  531 +class Spacer extends StatelessWidget {
  532 + Spacer({this.flex = 1})
  533 + : assert(flex != null),
  534 + assert(flex > 0),
  535 + super();
  536 +
  537 + /// The flex factor to use in determining how much space to take up.
  538 + final int flex;
  539 +
  540 + @override
  541 + Widget build(Context context) {
  542 + return Expanded(
  543 + flex: flex,
  544 + child: SizedBox.shrink(),
  545 + );
  546 + }
  547 +}
  548 +
518 class ListView extends Flex { 549 class ListView extends Flex {
519 ListView( 550 ListView(
520 {Axis direction = Axis.vertical, 551 {Axis direction = Axis.vertical,