From 06a540af3ef3a8c20e73f9a47e590f38f20ee470 Mon Sep 17 00:00:00 2001 From: datafoya Date: Fri, 26 Jul 2019 14:46:06 -0700 Subject: [PATCH 01/18] stashing current work --- .../codelabs/Flex with the Expanded widget.md | 119 +++++ src/docs/codelabs/extended-flex-widget.md | 426 ++++++++++++++++++ 2 files changed, 545 insertions(+) create mode 100644 src/docs/codelabs/Flex with the Expanded widget.md create mode 100644 src/docs/codelabs/extended-flex-widget.md diff --git a/src/docs/codelabs/Flex with the Expanded widget.md b/src/docs/codelabs/Flex with the Expanded widget.md new file mode 100644 index 0000000000..a56f284e1f --- /dev/null +++ b/src/docs/codelabs/Flex with the Expanded widget.md @@ -0,0 +1,119 @@ +title: "Flex with the Expanded widget" +description: "A codelab that uses DartPad2 to teach Flutter layout concepts." +toc: true +--- + +Flutter, eh?? What's the point? Well, Flutter is Google's portable UI toolkit for building beautiful and natively compiled applications. These applications, whether they're for mobile, web, or desktop apps, are built from a single codebase. But why does all that matter? Who cares?! Uh, developers care. And, if you plan to develop an app, you should, too. You're a developer. + +### Introduction + +This document briefly covers technical issues that you may face when sizing widgets. It also covers how to fix those issues by explaining how to use the Expanded widget. + +This document doesn't cover how to develop Flutter apps or explain how to code in Dart. It assumes you have a functioning knowledge of object-oriented programming. + +{{site.alert.note}} Dart is the coding language that Flutter developers use to create apps. Dart is also object oriented and widget based. For example, *images*, *icons*, and *text* are widgets. *Columns*, *rows*, and *grids* also are widgets. In a sense, you could say widgets compile the ins and outs of Flutter. +{{site.alert.end}} + +### Sizing widgets can be tricky + +When a group of widgets are too large for a row, a striped pattern appears along the affected edge. Now, run the code and then check the output. + + + + +After running the code, you see one of three images appear in Demo1. At the image's right edge, you also see a black, rectangular box with vertical text reading "RIGHT OVERFLOWED BY 522 PIXELS." You might ask, "Where's the striped pattern?" Well, if you haven't checked the output already, once again, check it. The output tells you that the black, rectangular box is the striped pattern. Moreover, the output tells you how to fix the problem: use an Expanded widget. + +### The Expanded widget + +In a row, space is divided among children. Children can be considered inflexible until they're wrapped in an Expanded widget. An Expanded widget stretches a child to fill extra space, thus making the child flexible. When children are laid out in a row, inflexible children are spaced first. The remaining space is then divided among the flexible children. In Demo2, wrap each of the three children beginning with "Image.network" in an expanded widget. To wrap a child in an expanded widget, follow these steps: + +1. Specify the child that's being expanded by entering `child:` before it (for example, `child: Image.network`) +2. Create a new line above the child +3. On the newly created line, enter `Expanded(` +4. Create a new line below the child +5. On the newly created line, enter `),` + +After you wrap each child in an Expanded widget, run the code. + + + +You now see all three images clearly and without any affected edges. But now you might ask, "Wait, doesn't the Expanded widget only fill extra space?" Here's one way to think about the Expanded widget. When you wrap a child in an Expanded widget, you make the child flexible. The child is going to fit in the space that's available. + +{{site.alert.tip}} If you have trouble wrapping each of the images in an Expanded widget, you can click **Hint** and then display the solution. From there, you can replace your code with the solution code. +{{site.alert.end}} + +### Flex + +The Expanded widget is a flex factor that works with available space. But what if you want one of your children to appear twice as large as its siblings? To do that, use the Expanded widget's flex property. Run the code for an example. + + + +In your code, you see that the middle child is not only wrapped in an Expanded widget, but also has a flex property of 2. `flex` is an integer that determines how much space a flex factor will occupy. You see in Demo3 that the middle image now appears twice as large as the other images. However, the image isn't twice as large; it's occupying twice as much space. Because the Expanded widget is a flex factor, you can determine how much space it'll occupy by adding a flex property. + +Flutter, eh?? What's the point? Well, Flutter is Google's portable UI toolkit for building beautiful and natively compiled applications. These applications, whether they're for mobile, web, or desktop apps, are built from a single codebase. But why does all that matter? Who cares?! Uh, developers care. And, if you plan to develop an app, you should, too. You're a developer. + +### Introduction + +This document briefly covers technical issues that you may face when sizing widgets. It also covers how to fix those issues through an interactive codelab involving the Expanded widget. + +This document doesn't cover how to develop Flutter apps or explain how to code in Dart. It assumes you have a functioning knowledge of object-oriented programming. + +{{site.alert.note}} + Dart is the coding language that Flutter developers use to create apps. Dart is also object oriented and widget based. For example, *images*, *icons*, and *text* are widgets. *Columns*, *rows*, and *grids* also are widgets. In a sense, you could say widgets compile the ins and outs of Flutter. +{{site.alert.end}} + +### Sizing widgets can be tricky + +When a group of widgets are too large for a row, a striped pattern appears along the affected edge. Now, run the code and then check the output. + +{% comment %} +https://gist.github.com/datafoya/e857a9b4e8584dfb06e9105fb3d49569 +{% comment %} + + + + +After running the code, you see one of three images appear in Demo1. At the image's right edge, you also see a black, rectangular box with vertical text reading "RIGHT OVERFLOWED BY 522 PIXELS." You might ask, "Where's the striped pattern?" Well, if you haven't checked the output already, once again, check it. The output tells you that the black, rectangular box is the striped pattern. Moreover, the output tells you how to fix the problem: use an Expanded widget. + +### The Expanded widget + +In a row, space is divided among children. Children can be considered inflexible until they're wrapped in an Expanded widget. An Expanded widget stretches a child to fill extra space, thus making the child flexible. When children are laid out in a row, inflexible children are spaced first. The remaining space is then divided among the flexible children. In Demo2, wrap each of the three children beginning with "Image.network" in an expanded widget. To wrap a child in an expanded widget, follow these steps: + +1. Specify the child that's being expanded by entering `child:` before it (for example, `child: Image.network`) +2. Create a new line above the child +3. On the newly created line, enter `Expanded(` +4. Create a new line below the child +5. On the newly created line, enter `),` + +After you wrap each child in an Expanded widget, run the code. + +{% comment %} +https://gist.github.com/datafoya/e857a9b4e8584dfb06e9105fb3d49569 +{% endcomment %} + + + +You now see all three images clearly and without any affected edges. But now you might ask, "Wait, doesn't the Expanded widget only fill extra space?" Here's one way to think about the Expanded widget. When you wrap a child in an Expanded widget, you make the child flexible. The child is going to fit in the space that's available. In this example, you made all three children flexible, so they can fit in the row. + +{{site.alert.tip}} + If you have trouble wrapping each of the images in an Expanded widget, + you can click **Hint** and then display the solution. From there, + you can replace your code with the solution code. +{{site.alert.end}} + +### Flex + +The Expanded widget is a flex factor that functions within available space. But what if you want one of your children to appear twice as large as its siblings? To do that, use the Expanded widget's flex property. Run the code for an example. + +{% comment %} +https://gist.github.com/datafoya/b94c33c08f3031b5ef9181e215c2006a +{% endcomment %} + + + +In your code, you see that the middle child is not only wrapped in an Expanded widget, but also has a flex property of 2. `flex` is an integer that determines how much available space a flex factor will occupy. You see in Demo3 that the middle image now appears twice as large as the other images. + + {{site.alert.tip}} + Flex factors are set to 1 by default. In this example, the flex factor is set to 2. But you can increase or decresase how much space a flex factor will occuppy. Flex factors can't be set in decimals. +{{site.alert.end}} + diff --git a/src/docs/codelabs/extended-flex-widget.md b/src/docs/codelabs/extended-flex-widget.md new file mode 100644 index 0000000000..69b49d7be3 --- /dev/null +++ b/src/docs/codelabs/extended-flex-widget.md @@ -0,0 +1,426 @@ +--- +title: "Working title" +description: "A codelab that uses DartPad2 to teach Flutter layout concepts." +toc: true +--- +{{site.alert.secondary}} +

Introduction

+ * To learn about Flutter and its core layout concepts. + * To gain experience writing code in Dart. + * To understand how Flutter builds its UI. +{{site.alert.end}} + +#### Requirements +{:.no_toc} +* An understanding of [Flutter](https://www.flutter.dev) +* An understanding of [Dart](https://www.dart.dev) or some exposure to object-oriented programming + +#### System requirements +{:.no_toc} +* A PC (Microsoft, Mac, or Linux) with Google Chrome installed + +{{site.alert.important}} + This codelab features embedded code examples that are based on an experimental code editor. The code editor is being developed and tested with Google Chrome. Some of the features in this codelab may not function on other browsers. +{{site.alert.end}} + +## Widget class + +Widgets are immutable objects that build specific parts of a UI. + +As you progress through this codelab, you learn that everything in Fluter is a widget: from the UI to the code. + +#### Code example +{:.no_toc} + +Check out **Dart**. The code contains various widgets that complete specific tasks. + +* `MyWidget` displays a silver box. +* `BlueBox` displays a blue square. +* `BuildContext` enables parent-child relationships between widgets. +* `Container` enables widget customization. +* `Row` is a class and parent widget to `BlueBox`. +* `BlueBox` is a child widget to `Row`. +* `StatelessWidget` indicates that the UI is built from fixed data. + +More information on parent-child relationships between widgets is available at [Layouts in Flutter](https://flutter.dev/docs/development/ui/layout). + +1. Run the code. + +{% comment %} + Gist: https://gist.github.com/579d215abcbea78d192fcdeeb6cccde1 +{% endcomment %} + +
+ +The code displays three blue squares in a grey, rectangular box. + +## Row and Column classes + +`Row` and `Column` are classes that house widgets. When `Row` and `Column` house widgets, the widgets become children, thus `Row` and `Column` become parents. + +When `Row` or `Column` houses children, the children are laid out. `Row` lays out its children horizontally, and `Column` lays out its children vertically. + +{{site.alert.note}} + In Flutter, left-to-right and right-to-left languages are supported. +{{site.alert.end}} + +#### Code example: Row +{:.no_toc} + +Check out **Dart**. In the code, `Row` houses three children, all `BlueBox` widgets. + +1. Run the code. + +{% comment %} + Gist: https://gist.github.com/26c8fb02c58c4120917b073ec6253953 +{% endcomment %} + +
+ +The code displays three blue squares horizontally. + +#### Code example: Column +{:.no_toc} + +Check out **Dart**. `Column` houses three children, all `BlueBox` widgets. + +1. Run the code. + +{% comment %} + Gist: https://gist.github.com/db96dc75c3283227bc849ba31d213783 +{% endcomment %} + +
+ +The code displays three blue squares vertically. + +## mainAxisSize property + +`Row` and `Column` rest on their main axes. `Row`'s main axis horizontal, and `Column`'s main axis is vertical. + +`mainAxisSize` is a property that determines how much space a `Row` and `Column` can occupy on their main axes. + +`mainAxisSize` has two `MainAxisSize` enums: + +* `MainAxisSize.max` +
+Increases the amount of space `Row` and `Column` can occupy on their main axes. +* `MainAxisSize.min` +
+Decreases the amount of space `Row` and `Column` can occupy on their main axes. + +#### Code example +{:.no_toc} + +Check out **Dart**. `Row` houses three `BlueBox` widgets. Notice how `mainAxisSize` is set to `MainAxisSize.max`. + +1. Run the code. + +{% comment %} + Gist: https://gist.github.com/def3c5c3c68459b5bb4bdfed58f5d024 +{% endcomment %} + +
+ +The code displays three blue sqaures. But notice how the grey, rectangular box has extra space. + +When `mainAxisSize` is set to `MainAxisSize.max`, `Row` or `Column` occupies all of the space on its main axis. As a result, `Row` or `Column`'s main axis may have extra space. But, when `mainAxisSize` is set to `MainAxisSize.min`, `Row` or `Column` occupies the same amount of space that its children occupy. + +In this code example, `Row` occupies more than the space that its children occupy. Try resetting `mainAxisSize` to `MainAxisSize.min`. + +1. In the code, replace `MainAxisSize.max` with `MainAxisSize.min`. +2. Run the code. + +The code displays three blue squares. And notice how the grey, rectangular box doesn't have extra space. + +## mainAxisAlignment property + +When `mainAxisSize` is set to `MainAxisSize.max`, `Row` or `Column`'s main axis may have extra space. + +`mainAxisAlignment` is a property that determines how `Row` and `Column` can position their children horizontally in that extra space. + +`mainAxisAlignment` has six `MainAxisAlignment` enums: + +* `MainAxisAligment.start`
+ Positions children near the beginning of the extra space. +* `MainAxisAligment.end`
+ Positions children near the end of the extra space. +* `MainAxisAligment.center`
+ Positions children at the center of the extra space. +* `MainAxisAligment.spaceBetween`
+ Divides the extra space evenly between children. +* `MainAxisAligment.spaceEvenly`
+ Divides the extra space evenly between children, but also creates an even amount of space before and after the first and last child. +* `MainAxisAligment.spaceAround`
+ Similar to `MainAxisAlignment.spaceEvenly`, but reduces 50% of the extra space before the first child and after the last child. + +#### Code example +{:.no_toc} + +Check out **Dart**. `Row` houses three `BlueBox` widgets. Notice how `mainAxisAlignment` is set to `MainAxisAlignment.start`. + +1. Run the code. + +{% comment %} + Gist: https://gist.github.com/cb8abed13f90a6a0c7a0ada6f15a09c9 +{% endcomment %} + +
+The code displays three blue squares horizontally. But, before moving to the next section, try resetting `mainAxisAlignment` to one of the other `MainAxisAlignment` enums. + +## crossAxisAlignment property + +Similar to `mainAxisAlignment`, `crossAxisAlignment` is a property that determines how `Row` and `Column` can position their children in extra space. However, `crossAxisAlignment` determines how `Row` and `Column` can position their children vertically. + +`crossAxisAlignment` has five `CrossAxisAlignment` enums: + +* `CrossAxisAlignment.start`
+ Positions children at the top of `Row` and `Column`’s vertical space. +* `CrossAxisAlignment.end`
+ Positions children at the bottom of `Row` and `Column`’s vertical space. +* `CrossAxisAlignment.center`
+ Positions children at the middle of `Row` and `Column`’s vertical space. +* `CrossAxisAlignment.stretch`
+ Stretches children to fill all of `Row` and `Column`’s vertical space. +* `CrossAxisAlignment.baseline`
+ Aligns children inside of `Row` and `Column` by their baselines. + +#### Code example +{:.no_toc} + +Check out **Dart**. `Row` houses two `BlueBox` widgets and one `BiggerBlueBox` widget. Notice how `crossAxisAlignment` is set to `CrossAxisAlignment.center`. + +1. Run the code. + +{% comment %} + Gist: https://gist.github.com/70a6eb88f13019eec349a57bc4fd5fe0 +{% endcomment %} + +
+The code displays two blue squares and one blue rectangle vertically. But, before moving to the next section, try resetting `crossAxisAlignment` to one of the other `CrossAxisAlignment` enums. + +{{site.alert.tip}} + When you reset `crossAxisAlignment` to `CrossAxisAlignment.baseline`, the code displays an error message. `crossAxisAlignment: CrossAxisAlignment.baseline` requires `textBaseline`, a property that aligns `Text` classes, not by their overall bounds, but by their baselines. `CrossAxisalignment.baseline` is covered in [Text](#text). +{{site.alert.end}} + +## Flexible class + +`crossAxisAlignment` and `mainAxisAlignment` are properties that determine how `Row` and `Column` can position their children in extra space. In the previous code examples, `Row` and `Column` house children of fixed sizes. Children of fixed sizes are considered "inflexible" because `Row` and `Column` determine their sizes. `Flexible` is a class that wraps around a widget and then makes the widget its child. When `Flexible` classes make widgets their children, the children are considered "flexible" because they determine their own sizes. + +When `Row` or `Column` lays out its children, `Row` or `Column` lays out its inflexible children first. If `Row` or `Column`'s main axis has extra space, `Row` or `Column` divides that extra space among its flexible children. `Flexible` determines how that extra space is divided among `Row` or `Column`'s flexible children. + +`Flexible` has two properties that help determine how extra space is divided among flexible children. + +* `flex` +
+ Compares flexible children against one another and then determines how much of the extra space each flexible child receieves. +* `fit` +
+ Determines whether a flexible child receives all of the extra space. + +#### Code example (flex property) +{:.no_toc} + +Check out **Dart**. In the code, `Row` contains one `BlueBox` widget and two `Flexible` classes. Notice how both `Flexible` classes wrap around `BlueBox` widgets and make the `BlueBox` widgets their children. Also notice how both `Flexible` classes contain `flex` properties with different `flex` values. + +1. Run the code. + + +
+The code displays three blue squares, but notice how two of the squares are displayed at different sizes. + +In a `Row` or `Column`, when `Flexible` classes wrap around widgets, the `Flexible` classes assign the widgets `flex` properties with `flex` values. The `flex` properties then compare themselves against one another according to their `flex` values divided by the total number of `flex` values. + +In this code example, one flexible `BlueBox` widget contains a `flex` property of 1, and the other flexible `BlueBox` widget contains a `flex` property of 2. The total number `flex` values is 3, so one flexible `BlueBox` widget receieves one third of the extra space while the other flexible `BlueBox` widget receives two-thirds of the extra space. + +#### Code example (fit property) +{:.no_toc} + +`fit` has two `fit` values: + +* `FlexFit.loose` +
+ Enables flexible children to occupy as much of or as little of the extra space. +* `FlexFit.tight` +
+ Forces flexible children to occupy all of the extra space. + +Check out **Dart**. In the code, `Row` contains three `Flexible` classes. Notice that all three `Flexible` classes wrap around `BlueBox` widgets. Also notice that all three `BlueBox` widgets have `flex` properties with different `flex` values. + +1. Run the code. + + +
+The code displays three blue squares, but notice how the silver box contains extra space. + +In this code example, the `Flexible` classes contain `fit` properties set to `FlexFit.loose`. + +. Notice how the silver box contains extra space. `Flexible` classes contain `flex` and `fit` properties, and `fit` properties determine whether `Flexible` classes receieve all of the extra space according to their `flex` values. Notice the display message that suggests resetting the `fit` properties to `FlexFit.tight`. + +1. In the code, replace `FlexFit.loose` with `FlexFit.tight` for each of the three `fit` properties. +2. Run the code. + +The code displays three blue squares, and now the silver box doesn't contain extra space. + +## Expanded class + +Similar to the `Flexible` class, `Expanded` is a class that wraps around a widget and then makes the widget its child. The difference is that the `Expanded` class doesn't require a `flex` or `fit` property. + +#### Code example +{:.no_toc} + +Check out **Dart**. In the code, `Row` contains three `BlueBox` widgets. + +1. Run the code. + + +
+ +The code displays three blue squares. Notice that the silver box contains extra space. Try wrapping the second `BlueBox` in an `Expanded` class, so the middle, blue square fills the extra space. + +1. + +## SizedBox class + +Similar to the `Expanded` and `Flexible` classes, `SizedBox` is a class that can wrap around a widget and then make the widget its child. The difference is that the `SizedBox` class doesn't require a child widget. + +#### Code example: SizedBox with a child +{:.no_toc} + +When `SizedBox` wraps around a widget, it makes the widget its child and then resizes the widget to an exact dimension. `SizedBox` resizes widgets with `width` and `height` properties. + +Check out **Dart**. In the code, `Row` contains two `BlueBox` widgets and one `SizedBox` class. Notice that `SizedBox` wraps around a `BlueBox` widget and contains a `width` property of 100. + +1. Run the code. + +{% comment %} + Gist: https://gist.github.com/datafoya/6582851e85b57180ff5321f814fabb81 +{% endcomment %} + +
+ +The code displays three blue squares. Notice how `SizedBox` increases the middle, blue square's width from 50 to 100. Try adding a `height` property to `SizedBox`. + +1. In the code, create a new line under `width: 100`. +2. On the new line, enter `height: 100`. +3. Run the code. + +The code displays three blue squares, and now the middle square has a width and height of 100. + +#### Code example: SizedBox without a child +{:.no_toc} + +`SizedBox` doesn't require a child widget. When `SizedBox` doesn't wrap around a widget, `SizedBox` creates space between widgets. + +Check out **Dart**. In the code, `Row` contains three `BlueBox` eidgets and one `SizedBox` class. Notice how the `SizedBox` separates the first and second `BlueBox` widgets. Also notice that `SizedBox` contains a `width` property of 100. + +1. Run the code. + +{% comment %} + Gist: https://gist.github.com/datafoya/19ead147ab5c7668d7d32e1cfed90097 +{% endcomment %} + +
+The code displays three blue squares, and `SizedBox` creates a gap between the first and middle squares. Try adding another `SizedBox` class to `Row`. + +1. In the code, create a new line between the second and third `BlueBox` widgets. +2. On the new line, enter `SizedBox()`. +2. Inside of the parentheses, enter `width: 25`. +3. Run the code. + +The code displays three blue squares, but now the squares have gaps between them, one with a width of 50 and another with a width of 25. + +## Spacer class + +Similar to `SizedBox`, `Spacer` is a class that creates space between widgets. The difference is that `Spacer` requires a `flex` property instead of `width` and `height` properties. + +#### Code example +{:.no_toc} + +Check out **Dart**. In the code, `Row` contains three `BlueBox` widgets and one `Spacer` class. Notice how `Spacer` separates the first and second `BlueBox` widgets. + +1. Run the code. + +{% comment %} + Gist: https://gist.github.com/datafoya/bfc367aefde35e02ea5283efdbf58e60 +{% endcomment %} + +
+The code displays three blue squares, and `Spacer` creates a gap between the first and middle squares. Notice how the gap takes up all of the extra space inside the silver box. Try adding another `Spacer` class to `Row`. + +1. In the code, create a new line between the second and third `BlueBox` widgets. +2. On the new line, enter `Spacer()`. +3. Inside of the parentheses, enter `flex: 2`. +4. Run the code. + +The code displays three blue squares, but now the squares have gaps between them. + +## Text class + +`Text` is a class that displays a single line of text. `Text` classes can display lines of text in different fonts, styles, and colors. + +#### Code example +{:.no_toc} + +Check out **Dart**. In the code, `Row` contains three `Text` classes. Also, notice that `Row` contains two properties: `crossAxisalignment` and `textBaseline`. + +1. Run the code. + +{% comment %} + Gist: https://gist.github.com/datafoya/0ff109090b99ef1873d9fad501b2bc86 +{% endcomment %} + +
+The code displays "Hey! Hey! Hey!" at three different font sizes and in Arial and black. Notice how "Hey! Hey! Hey!" is displayed at the center of the silver box. Try resetting `crossAxisAlignment` to `CrossAxisAlignment.baseline`. + +1. In the code, replace `CrossAxisAlignment.center` with `CrossAxisAlignment.baseline`. +2. Run the code. + +The code now displays all three `Text` classes on the same baseline. + +## Icon class + +Icon is a class that displays glyphs and symbols. + +#### Code example +{:.no_toc} + +Check out **Dart**. In the code, `Row` contains three `Icon` classes. + +1. Run the code. + +{% comment %} + Gist: https://gist.github.com/datafoya/01688fca8c13f85d93078054af2e858b +{% endcomment %} + +
+ +The code displays a yellow sun, a white cloud, and a snowflake. Try adding a color property to `Icons.ac_unit`. + +1. In the code, create a new line under `size:50`. +2. On the new line, enter `color: Colors.blue`. +3. Run the code. + +The code displays all three icons, but now the snowflake is blue. + +## Image class + +`Image` is a class that displays images. Unlike the widgets previously covered in this codelab, the `Image` class references data that's stored in another location. + +#### Code example +{:.no_toc} + +Check out **Dart**. In the code, `Row` contains three `Expanded` classes. Notice how the `Expanded` classes wrap around the `Image` classes. Also notice how the `Image` classes reference their images, which are stored on GitGub.com. + +1. Run the code. + + +
+ +The code displays three images. + +## Test yourself +### Part 1 +### Part 2 +### Part 3 +## Conclusion From 32b4d6567dba65df0929f8d82295292bc46cd542 Mon Sep 17 00:00:00 2001 From: datafoya Date: Thu, 1 Aug 2019 10:14:45 -0700 Subject: [PATCH 02/18] adding new codelab --- .../codelabs/Flex with the Expanded widget.md | 119 ----- src/docs/codelabs/extended-flex-widget.md | 430 ++++++++---------- 2 files changed, 184 insertions(+), 365 deletions(-) delete mode 100644 src/docs/codelabs/Flex with the Expanded widget.md diff --git a/src/docs/codelabs/Flex with the Expanded widget.md b/src/docs/codelabs/Flex with the Expanded widget.md deleted file mode 100644 index a56f284e1f..0000000000 --- a/src/docs/codelabs/Flex with the Expanded widget.md +++ /dev/null @@ -1,119 +0,0 @@ -title: "Flex with the Expanded widget" -description: "A codelab that uses DartPad2 to teach Flutter layout concepts." -toc: true ---- - -Flutter, eh?? What's the point? Well, Flutter is Google's portable UI toolkit for building beautiful and natively compiled applications. These applications, whether they're for mobile, web, or desktop apps, are built from a single codebase. But why does all that matter? Who cares?! Uh, developers care. And, if you plan to develop an app, you should, too. You're a developer. - -### Introduction - -This document briefly covers technical issues that you may face when sizing widgets. It also covers how to fix those issues by explaining how to use the Expanded widget. - -This document doesn't cover how to develop Flutter apps or explain how to code in Dart. It assumes you have a functioning knowledge of object-oriented programming. - -{{site.alert.note}} Dart is the coding language that Flutter developers use to create apps. Dart is also object oriented and widget based. For example, *images*, *icons*, and *text* are widgets. *Columns*, *rows*, and *grids* also are widgets. In a sense, you could say widgets compile the ins and outs of Flutter. -{{site.alert.end}} - -### Sizing widgets can be tricky - -When a group of widgets are too large for a row, a striped pattern appears along the affected edge. Now, run the code and then check the output. - - - - -After running the code, you see one of three images appear in Demo1. At the image's right edge, you also see a black, rectangular box with vertical text reading "RIGHT OVERFLOWED BY 522 PIXELS." You might ask, "Where's the striped pattern?" Well, if you haven't checked the output already, once again, check it. The output tells you that the black, rectangular box is the striped pattern. Moreover, the output tells you how to fix the problem: use an Expanded widget. - -### The Expanded widget - -In a row, space is divided among children. Children can be considered inflexible until they're wrapped in an Expanded widget. An Expanded widget stretches a child to fill extra space, thus making the child flexible. When children are laid out in a row, inflexible children are spaced first. The remaining space is then divided among the flexible children. In Demo2, wrap each of the three children beginning with "Image.network" in an expanded widget. To wrap a child in an expanded widget, follow these steps: - -1. Specify the child that's being expanded by entering `child:` before it (for example, `child: Image.network`) -2. Create a new line above the child -3. On the newly created line, enter `Expanded(` -4. Create a new line below the child -5. On the newly created line, enter `),` - -After you wrap each child in an Expanded widget, run the code. - - - -You now see all three images clearly and without any affected edges. But now you might ask, "Wait, doesn't the Expanded widget only fill extra space?" Here's one way to think about the Expanded widget. When you wrap a child in an Expanded widget, you make the child flexible. The child is going to fit in the space that's available. - -{{site.alert.tip}} If you have trouble wrapping each of the images in an Expanded widget, you can click **Hint** and then display the solution. From there, you can replace your code with the solution code. -{{site.alert.end}} - -### Flex - -The Expanded widget is a flex factor that works with available space. But what if you want one of your children to appear twice as large as its siblings? To do that, use the Expanded widget's flex property. Run the code for an example. - - - -In your code, you see that the middle child is not only wrapped in an Expanded widget, but also has a flex property of 2. `flex` is an integer that determines how much space a flex factor will occupy. You see in Demo3 that the middle image now appears twice as large as the other images. However, the image isn't twice as large; it's occupying twice as much space. Because the Expanded widget is a flex factor, you can determine how much space it'll occupy by adding a flex property. - -Flutter, eh?? What's the point? Well, Flutter is Google's portable UI toolkit for building beautiful and natively compiled applications. These applications, whether they're for mobile, web, or desktop apps, are built from a single codebase. But why does all that matter? Who cares?! Uh, developers care. And, if you plan to develop an app, you should, too. You're a developer. - -### Introduction - -This document briefly covers technical issues that you may face when sizing widgets. It also covers how to fix those issues through an interactive codelab involving the Expanded widget. - -This document doesn't cover how to develop Flutter apps or explain how to code in Dart. It assumes you have a functioning knowledge of object-oriented programming. - -{{site.alert.note}} - Dart is the coding language that Flutter developers use to create apps. Dart is also object oriented and widget based. For example, *images*, *icons*, and *text* are widgets. *Columns*, *rows*, and *grids* also are widgets. In a sense, you could say widgets compile the ins and outs of Flutter. -{{site.alert.end}} - -### Sizing widgets can be tricky - -When a group of widgets are too large for a row, a striped pattern appears along the affected edge. Now, run the code and then check the output. - -{% comment %} -https://gist.github.com/datafoya/e857a9b4e8584dfb06e9105fb3d49569 -{% comment %} - - - - -After running the code, you see one of three images appear in Demo1. At the image's right edge, you also see a black, rectangular box with vertical text reading "RIGHT OVERFLOWED BY 522 PIXELS." You might ask, "Where's the striped pattern?" Well, if you haven't checked the output already, once again, check it. The output tells you that the black, rectangular box is the striped pattern. Moreover, the output tells you how to fix the problem: use an Expanded widget. - -### The Expanded widget - -In a row, space is divided among children. Children can be considered inflexible until they're wrapped in an Expanded widget. An Expanded widget stretches a child to fill extra space, thus making the child flexible. When children are laid out in a row, inflexible children are spaced first. The remaining space is then divided among the flexible children. In Demo2, wrap each of the three children beginning with "Image.network" in an expanded widget. To wrap a child in an expanded widget, follow these steps: - -1. Specify the child that's being expanded by entering `child:` before it (for example, `child: Image.network`) -2. Create a new line above the child -3. On the newly created line, enter `Expanded(` -4. Create a new line below the child -5. On the newly created line, enter `),` - -After you wrap each child in an Expanded widget, run the code. - -{% comment %} -https://gist.github.com/datafoya/e857a9b4e8584dfb06e9105fb3d49569 -{% endcomment %} - - - -You now see all three images clearly and without any affected edges. But now you might ask, "Wait, doesn't the Expanded widget only fill extra space?" Here's one way to think about the Expanded widget. When you wrap a child in an Expanded widget, you make the child flexible. The child is going to fit in the space that's available. In this example, you made all three children flexible, so they can fit in the row. - -{{site.alert.tip}} - If you have trouble wrapping each of the images in an Expanded widget, - you can click **Hint** and then display the solution. From there, - you can replace your code with the solution code. -{{site.alert.end}} - -### Flex - -The Expanded widget is a flex factor that functions within available space. But what if you want one of your children to appear twice as large as its siblings? To do that, use the Expanded widget's flex property. Run the code for an example. - -{% comment %} -https://gist.github.com/datafoya/b94c33c08f3031b5ef9181e215c2006a -{% endcomment %} - - - -In your code, you see that the middle child is not only wrapped in an Expanded widget, but also has a flex property of 2. `flex` is an integer that determines how much available space a flex factor will occupy. You see in Demo3 that the middle image now appears twice as large as the other images. - - {{site.alert.tip}} - Flex factors are set to 1 by default. In this example, the flex factor is set to 2. But you can increase or decresase how much space a flex factor will occuppy. Flex factors can't be set in decimals. -{{site.alert.end}} - diff --git a/src/docs/codelabs/extended-flex-widget.md b/src/docs/codelabs/extended-flex-widget.md index 69b49d7be3..dadd41f583 100644 --- a/src/docs/codelabs/extended-flex-widget.md +++ b/src/docs/codelabs/extended-flex-widget.md @@ -1,106 +1,57 @@ --- -title: "Working title" -description: "A codelab that uses DartPad2 to teach Flutter layout concepts." +title: "Codelab: basic Flutter layout concepts" +description: "A codelab that teaches basic Flutter layout concepts through DartPad2 code examples." toc: true --- -{{site.alert.secondary}} -

Introduction

- * To learn about Flutter and its core layout concepts. - * To gain experience writing code in Dart. - * To understand how Flutter builds its UI. -{{site.alert.end}} - -#### Requirements -{:.no_toc} -* An understanding of [Flutter](https://www.flutter.dev) -* An understanding of [Dart](https://www.dart.dev) or some exposure to object-oriented programming - -#### System requirements -{:.no_toc} -* A PC (Microsoft, Mac, or Linux) with Google Chrome installed - {{site.alert.important}} - This codelab features embedded code examples that are based on an experimental code editor. The code editor is being developed and tested with Google Chrome. Some of the features in this codelab may not function on other browsers. + This codelab covers basic Flutter layout concepts using a code editor called DartPad2. An understanding of [Dart](https://www.dart.dev) or some exposure to object-oriented programming is recommended. {{site.alert.end}} - -## Widget class - -Widgets are immutable objects that build specific parts of a UI. - -As you progress through this codelab, you learn that everything in Fluter is a widget: from the UI to the code. - -#### Code example -{:.no_toc} - -Check out **Dart**. The code contains various widgets that complete specific tasks. - -* `MyWidget` displays a silver box. -* `BlueBox` displays a blue square. -* `BuildContext` enables parent-child relationships between widgets. -* `Container` enables widget customization. -* `Row` is a class and parent widget to `BlueBox`. -* `BlueBox` is a child widget to `Row`. -* `StatelessWidget` indicates that the UI is built from fixed data. - -More information on parent-child relationships between widgets is available at [Layouts in Flutter](https://flutter.dev/docs/development/ui/layout). - -1. Run the code. - -{% comment %} - Gist: https://gist.github.com/579d215abcbea78d192fcdeeb6cccde1 -{% endcomment %} - -
- -The code displays three blue squares in a grey, rectangular box. - -## Row and Column classes - -`Row` and `Column` are classes that house widgets. When `Row` and `Column` house widgets, the widgets become children, thus `Row` and `Column` become parents. - -When `Row` or `Column` houses children, the children are laid out. `Row` lays out its children horizontally, and `Column` lays out its children vertically. - +{{site.alert.important}} + Currently, DartPad2 is in the experimental stage and being tested with Google Chrome. A PC (Microsoft, Mac, or Linux) with Google Chrome installed is required for this codelab. If you encounter any difficulties while using DartPad2, please create a [DartPad issue](https://github.com/dart-lang/dart-pad/issues/new) and label the issue "platform-web." +{{site.alert.end}} {{site.alert.note}} - In Flutter, left-to-right and right-to-left languages are supported. + Flutter supports devices that maintain right-to-left language settings. {{site.alert.end}} - +## Introduction +In this codelab, you interact with and build Flutter layouts in a code editor called DartPad2. As you progress through this codelab, you learn that widgets build everything in flutter. A widget is an immutable object that describes a specific part of a UI. You also learn that, while widgets are simple in their functions, widgets can be complex in their structures. Widgets can be built around and inside of other widgets, and widgets can have interconnected and ordered relationships with one another. At the end of this codelab, you apply what you learn and build a simple interface using basic Fluter layout concepts. +## Row class and Column class +`Row` and `Column` are classes that contain widgets. When `Row` and `Column` contain widgets, the widgets become "children," and `Row` and `Column` become "parents." Moreover, when `Row` and `Column` contain widgets, `Row` and `Column` lay them out. `Row` lays out its widgets horizontally. `Column` lays out its widgets vertically. #### Code example: Row {:.no_toc} +{{site.alert.secondary}} +{:.no_toc} + *Check out Dart.* -Check out **Dart**. In the code, `Row` houses three children, all `BlueBox` widgets. + In the code, `Row` contains three children, all `BlueBox` widgets. -1. Run the code. + In this code example, the code displays three blue squares horizontally. + ***Run the code.*** +{{site.alert.end}} {% comment %} Gist: https://gist.github.com/26c8fb02c58c4120917b073ec6253953 {% endcomment %} -
- -The code displays three blue squares horizontally. #### Code example: Column {:.no_toc} +{{site.alert.secondary}} +{:.no_toc} + *Check out Dart.* -Check out **Dart**. `Column` houses three children, all `BlueBox` widgets. + In the code, `Column` contains three child widgets, all `BlueBox` widgets. -1. Run the code. + In this code example, the code displays three blue squares vertically. + ***Run the code.*** +{{site.alert.end}} {% comment %} Gist: https://gist.github.com/db96dc75c3283227bc849ba31d213783 {% endcomment %} -
- -The code displays three blue squares vertically. ## mainAxisSize property - -`Row` and `Column` rest on their main axes. `Row`'s main axis horizontal, and `Column`'s main axis is vertical. - -`mainAxisSize` is a property that determines how much space a `Row` and `Column` can occupy on their main axes. - -`mainAxisSize` has two `MainAxisSize` enums: +`Row` and `Column` occupy different main axes. `Row`\'s main axis is horizontal. `Column`\'s main axis is vertical. `mainAxisSize` is a property that determines how much space `Row` and `Column` can occupy on their main axes. `mainAxisSize` has two `MainAxisSize` enums: * `MainAxisSize.max`
@@ -109,316 +60,303 @@ Increases the amount of space `Row` and `Column` can occupy on their main axes.
Decreases the amount of space `Row` and `Column` can occupy on their main axes. -#### Code example +{{site.alert.tip}} + `MainAxisSize.max` is a default enum. When building Flutter layouts, `Row` and `Column` automatically occupy all of the space on their main axes. +{{site.alert.end}} + +#### Code example: MainAxisSize.max {:.no_toc} +{{site.alert.secondary}} +{:.no_toc} + *Check out Dart.* -Check out **Dart**. `Row` houses three `BlueBox` widgets. Notice how `mainAxisSize` is set to `MainAxisSize.max`. + `Row` contains three `BlueBox` widgets. Notice how `mainAxisSize` is set to `MainAxisSize.max`. -1. Run the code. + When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` occupy all of the space on their main axes. As a result, `Row` and `Column` may have extra space on their main axes. + In this code example, the code displays three blue squares, but notice how the grey, rectangular box has extra space. + + ***Run the code.*** +{{site.alert.end}} {% comment %} Gist: https://gist.github.com/def3c5c3c68459b5bb4bdfed58f5d024 {% endcomment %} -
-The code displays three blue sqaures. But notice how the grey, rectangular box has extra space. +#### Code example: MainAxisSize.min +{:.no_toc} +{{site.alert.secondary}} +{:.no_toc} + *Check out Dart.* -When `mainAxisSize` is set to `MainAxisSize.max`, `Row` or `Column` occupies all of the space on its main axis. As a result, `Row` or `Column`'s main axis may have extra space. But, when `mainAxisSize` is set to `MainAxisSize.min`, `Row` or `Column` occupies the same amount of space that its children occupy. + `Row` contains three `BlueBox` widgets. Notice how `mainAxisSize` is set to `MainAxisSize.min`. -In this code example, `Row` occupies more than the space that its children occupy. Try resetting `mainAxisSize` to `MainAxisSize.min`. + When `mainAxisSize` is set to `MainAxisSize.min`, `Row` and `Column` only occupy enough space on their main axes for their children. As a result, `Row` and `Column` don't have any extra space on their main axes. -1. In the code, replace `MainAxisSize.max` with `MainAxisSize.min`. -2. Run the code. + In this code example, the code displays three blue squares, but notice how the grey, rectangular box doesn't have extra space. -The code displays three blue squares. And notice how the grey, rectangular box doesn't have extra space. + ***Run the code.*** +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/def3c5c3c68459b5bb4bdfed58f5d024 +{% endcomment %} + ## mainAxisAlignment property - -When `mainAxisSize` is set to `MainAxisSize.max`, `Row` or `Column`'s main axis may have extra space. - -`mainAxisAlignment` is a property that determines how `Row` and `Column` can position their children horizontally in that extra space. - -`mainAxisAlignment` has six `MainAxisAlignment` enums: - -* `MainAxisAligment.start`
- Positions children near the beginning of the extra space. -* `MainAxisAligment.end`
- Positions children near the end of the extra space. -* `MainAxisAligment.center`
- Positions children at the center of the extra space. -* `MainAxisAligment.spaceBetween`
+When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` may have extra space on their main axes. `mainAxisAlignment` is a property that determines how `Row` and `Column` can position their children horizontally in extra space. `mainAxisAlignment` has six `MainAxisAlignment` enums: + +* `MainAxisAlignment.start`
+ Positions children near the beginning of the main axis. (Left for `Row`, top for `Column`) +* `MainAxisAlignment.end`
+ Positions children near the end of the main axis. (Right for `Row`, bottom for `Column`) +* `MainAxisAlignment.center`
+ Positions children at the middle of the main axis. +* `MainAxisAlignment.spaceBetween`
Divides the extra space evenly between children. -* `MainAxisAligment.spaceEvenly`
- Divides the extra space evenly between children, but also creates an even amount of space before and after the first and last child. -* `MainAxisAligment.spaceAround`
- Similar to `MainAxisAlignment.spaceEvenly`, but reduces 50% of the extra space before the first child and after the last child. +* `MainAxisAlignment.spaceEvenly`
+ Divides the extra space evenly between children and creates an even amount of space before the first child and after the last child. +* `MainAxisAlignment.spaceAround`
+ Similar to `MainAxisAlignment.spaceEvenly` but reduces half of the space before the first child and after the last child. -#### Code example +#### Code example: mainAxisAlignment property {:.no_toc} +{{site.alert.secondary}} + *Check out Dart.* -Check out **Dart**. `Row` houses three `BlueBox` widgets. Notice how `mainAxisAlignment` is set to `MainAxisAlignment.start`. + `Row` contains three `BlueBox` widgets. Notice how `mainAxisAlignment` is set to `MainAxisAlignment.start`. -1. Run the code. + In this code example, the code displays three blue squares on the left side of the grey, rectangular box. + ***Run the code.*** +{{site.alert.end}} {% comment %} Gist: https://gist.github.com/cb8abed13f90a6a0c7a0ada6f15a09c9 {% endcomment %} -
-The code displays three blue squares horizontally. But, before moving to the next section, try resetting `mainAxisAlignment` to one of the other `MainAxisAlignment` enums. +{{site.alert.tip}} + Before moving to the next section, try resetting `mainAxisAlignment` to one of the other `MainAxisAlignment` enums. +{{site.alert.end}} ## crossAxisAlignment property - -Similar to `mainAxisAlignment`, `crossAxisAlignment` is a property that determines how `Row` and `Column` can position their children in extra space. However, `crossAxisAlignment` determines how `Row` and `Column` can position their children vertically. - -`crossAxisAlignment` has five `CrossAxisAlignment` enums: +Similar to the `mainAxisAlignment` property, `crossAxisAlignment` is a property that determines how `Row` and `Column` can position their children in extra space. However, the `crossAxisAlignment` property determines how `Row` and `Column` can position their children vertically in extra space. As a result, most of the `crossAxisAlignment` property's enums only function inside of `Row`. The `crossAxisAlignment` property has five `CrossAxisAlignment` enums: * `CrossAxisAlignment.start`
- Positions children at the top of `Row` and `Column`’s vertical space. + Positions children near the top of the cross axis. (`Row`) * `CrossAxisAlignment.end`
- Positions children at the bottom of `Row` and `Column`’s vertical space. + Positions children near the bottom of the cross axis. (`Row`) * `CrossAxisAlignment.center`
- Positions children at the middle of `Row` and `Column`’s vertical space. + Positions children at the middle of the cross axis. (`Row`) * `CrossAxisAlignment.stretch`
- Stretches children to fill all of `Row` and `Column`’s vertical space. + Stretches children across the cross axis. (Top to bottom for `Row`, left to right for `Column`) * `CrossAxisAlignment.baseline`
- Aligns children inside of `Row` and `Column` by their baselines. + Aligns children according to their character baselines. (`Text` class) +{{site.alert.note}} + `CrossAxisAlignment.baseline` aligns `Text` classes along their character baselines, but requires the `textBaseline` property set to `TextBaseline.alphabetic`. In the following code example, if you reset `crossAxisAlignment` to `CrossAxisAlignment.baseline`, the code displays an error message. `CrossAxisAlignment.baseline` is covered in the [Text class](#text-class) section. +{{site.alert.end}} -#### Code example +#### Code example: crossAxisAlignment property {:.no_toc} +{{site.alert.secondary}} + *Check out Dart.* -Check out **Dart**. `Row` houses two `BlueBox` widgets and one `BiggerBlueBox` widget. Notice how `crossAxisAlignment` is set to `CrossAxisAlignment.center`. + `Row` contains two `BlueBox` widgets and one `BiggerBlueBox` widget. Notice how `crossAxisAlignment` is set to `CrossAxisAlignment.center`. -1. Run the code. + In this code example, the code displays two squares and one rectangle at the middle of the grey, rectangular box. +***Run the code.*** +{{site.alert.end}} {% comment %} Gist: https://gist.github.com/70a6eb88f13019eec349a57bc4fd5fe0 {% endcomment %} -
-The code displays two blue squares and one blue rectangle vertically. But, before moving to the next section, try resetting `crossAxisAlignment` to one of the other `CrossAxisAlignment` enums. - {{site.alert.tip}} - When you reset `crossAxisAlignment` to `CrossAxisAlignment.baseline`, the code displays an error message. `crossAxisAlignment: CrossAxisAlignment.baseline` requires `textBaseline`, a property that aligns `Text` classes, not by their overall bounds, but by their baselines. `CrossAxisalignment.baseline` is covered in [Text](#text). + Before moving to the next section, try resetting `crossAxisAlignment` to one of the other `CrossAxisAlignment` enums. {{site.alert.end}} - ## Flexible class -`crossAxisAlignment` and `mainAxisAlignment` are properties that determine how `Row` and `Column` can position their children in extra space. In the previous code examples, `Row` and `Column` house children of fixed sizes. Children of fixed sizes are considered "inflexible" because `Row` and `Column` determine their sizes. `Flexible` is a class that wraps around a widget and then makes the widget its child. When `Flexible` classes make widgets their children, the children are considered "flexible" because they determine their own sizes. - -When `Row` or `Column` lays out its children, `Row` or `Column` lays out its inflexible children first. If `Row` or `Column`'s main axis has extra space, `Row` or `Column` divides that extra space among its flexible children. `Flexible` determines how that extra space is divided among `Row` or `Column`'s flexible children. +`mainAxisAlignment` and `crossAxisAlignment` are properties that determine how `Row` and `Column` can position widgets in extra space. When `Row` and `Column` lay out widgets, they lay out widgets of a fixed size first. Widgets of a fixed size are considered "inflexible" because they can't resize themselves after `Row` and `Column` lay them out. -`Flexible` has two properties that help determine how extra space is divided among flexible children. +`Flexible` is a class that wraps around a widget, takes the widget as its child, and then resizes the widget. When the `Flexible` class wraps around a widget, the widget is considered "flexible" because the widget can resize itself. `Row` and `Column` lay out flexible widgets after they lay out inflexible widgets. Flexible widgets can resize themselves according to their `flex` and `fit` properties: * `flex`
- Compares flexible children against one another and then determines how much of the extra space each flexible child receieves. + Compares itself against other `flex` properties before determining what fraction of the total extra space each flexible widget receives. + * `fit`
- Determines whether a flexible child receives all of the extra space. + Determines whether a flexible widget fills all of its extra space. -#### Code example (flex property) +#### Code example: flex property {:.no_toc} +{{site.alert.secondary}} + *Check out Dart.* -Check out **Dart**. In the code, `Row` contains one `BlueBox` widget and two `Flexible` classes. Notice how both `Flexible` classes wrap around `BlueBox` widgets and make the `BlueBox` widgets their children. Also notice how both `Flexible` classes contain `flex` properties with different `flex` values. + `Row` contains one `BlueBox` widget and two `Flexible` classes. Notice how the `Flexible` classes wrap around two `BlueBox` widgets. Also, notice that the `Flexible` classes contain `flex` properties with `flex` values set to 1. -1. Run the code. + When `flex` properties compare themselves against one another, they add up their `flex` values, and the sum of the `flex` values determines what fraction of the total extra space each flexible widget receives. + + In this code example, the sum of both `flex` values (2) determines that each flexible widget receives half of the extra space. + ***Run the code.*** +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/82e4dd24028034ae03ba0ddc71bf59e5 +{% endcomment %} -
-The code displays three blue squares, but notice how two of the squares are displayed at different sizes. -In a `Row` or `Column`, when `Flexible` classes wrap around widgets, the `Flexible` classes assign the widgets `flex` properties with `flex` values. The `flex` properties then compare themselves against one another according to their `flex` values divided by the total number of `flex` values. - -In this code example, one flexible `BlueBox` widget contains a `flex` property of 1, and the other flexible `BlueBox` widget contains a `flex` property of 2. The total number `flex` values is 3, so one flexible `BlueBox` widget receieves one third of the extra space while the other flexible `BlueBox` widget receives two-thirds of the extra space. - -#### Code example (fit property) +#### Code example: fit property {:.no_toc} +{{site.alert.secondary}} + *Check out Dart.* + + `Row` contains two `Flexible` classes that both wrap around `BlueBox` widgets. Notice that the `Flexible` classes contain `flex` properties with `flex` values set to 1. Also, notice that the `Flexible` classes contain `fit` properties with `fit` values set to `FlexFit.loose`. The `fit` property has two `fit` values that help determine whether a flexible widget can occupy all of its extra space: -`fit` has two `fit` values: - -* `FlexFit.loose` -
- Enables flexible children to occupy as much of or as little of the extra space. -* `FlexFit.tight` -
- Forces flexible children to occupy all of the extra space. - -Check out **Dart**. In the code, `Row` contains three `Flexible` classes. Notice that all three `Flexible` classes wrap around `BlueBox` widgets. Also notice that all three `BlueBox` widgets have `flex` properties with different `flex` values. + * `FlexFit.loose` +
+ Enables a flexible widget to occupy as much of or as little of its extra space. + * `FlexFit.tight` +
+ Forces a flexible widget to fill of its extra space. -1. Run the code. + In this code example, the `fit` properties restrict the flexible widgets from filling all of their extra space. Try resetting the `fit` properties to `FlexFit.tight`. + ***Run the code.*** +{{site.alert.end}} -
-The code displays three blue squares, but notice how the silver box contains extra space. - -In this code example, the `Flexible` classes contain `fit` properties set to `FlexFit.loose`. - -. Notice how the silver box contains extra space. `Flexible` classes contain `flex` and `fit` properties, and `fit` properties determine whether `Flexible` classes receieve all of the extra space according to their `flex` values. Notice the display message that suggests resetting the `fit` properties to `FlexFit.tight`. - -1. In the code, replace `FlexFit.loose` with `FlexFit.tight` for each of the three `fit` properties. -2. Run the code. - -The code displays three blue squares, and now the silver box doesn't contain extra space. ## Expanded class -Similar to the `Flexible` class, `Expanded` is a class that wraps around a widget and then makes the widget its child. The difference is that the `Expanded` class doesn't require a `flex` or `fit` property. +Similar to the `Flexible` class, `Expanded` is a class that can wrap around a widget, take the widget as its child, and then resize the widget. However, the `Expanded` class doesn't utilize `flex` and `fit` properties to resize its child. Insetad, the `Expanded` class forces its child to fill extra space. -#### Code example +#### Code example: Expanded class {:.no_toc} +{{site.alert.secondary}} + *Check out Dart.* -Check out **Dart**. In the code, `Row` contains three `BlueBox` widgets. + `Row` contains two `BlueBox` widgets and one `Expanded` class. Notice how the `Expanded` class wraps around another `BlueBox` widget. -1. Run the code. + In this code example, the code displays three blue squares, and the middle square fills all of the extra space inside the grey, rectangular box. + ***Run the code.*** +{{site.alert.end}} -
- -The code displays three blue squares. Notice that the silver box contains extra space. Try wrapping the second `BlueBox` in an `Expanded` class, so the middle, blue square fills the extra space. - -1. ## SizedBox class -Similar to the `Expanded` and `Flexible` classes, `SizedBox` is a class that can wrap around a widget and then make the widget its child. The difference is that the `SizedBox` class doesn't require a child widget. +Similar to the `Flexible` and `Expanded` classes, `SizedBox` is a class that can wrap around a widget, take the widget as its child, and then resize the widget. However, the `SizedBox` class also can create space between widgets. Instead of utilizing `flex` and `fit` properties, the `SizedBox` class utilizes `width` and `height` properties. #### Code example: SizedBox with a child {:.no_toc} +{{site.alert.secondary}} +*Check out Dart.* -When `SizedBox` wraps around a widget, it makes the widget its child and then resizes the widget to an exact dimension. `SizedBox` resizes widgets with `width` and `height` properties. - -Check out **Dart**. In the code, `Row` contains two `BlueBox` widgets and one `SizedBox` class. Notice that `SizedBox` wraps around a `BlueBox` widget and contains a `width` property of 100. +`Row` contains two `BlueBox` widgets and one `SizedBox` class. Notice how the `SizedBox` class wraps around another `BlueBox` widget and contains a `width` property equal to 100. -1. Run the code. +In this code example, try adding a height property equal to 100 inside the `SizedBox` class. +***Run the code.*** +{{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/6582851e85b57180ff5321f814fabb81 {% endcomment %} -
- -The code displays three blue squares. Notice how `SizedBox` increases the middle, blue square's width from 50 to 100. Try adding a `height` property to `SizedBox`. - -1. In the code, create a new line under `width: 100`. -2. On the new line, enter `height: 100`. -3. Run the code. - -The code displays three blue squares, and now the middle square has a width and height of 100. #### Code example: SizedBox without a child {:.no_toc} +{{site.alert.secondary}} +*Check out Dart.* -`SizedBox` doesn't require a child widget. When `SizedBox` doesn't wrap around a widget, `SizedBox` creates space between widgets. +`Row` contains three `BlueBox` widgets and one `SizedBox` class. Notice how the `SizedBox` class separates the first and second `BlueBox` widgets. Also, notice how the `SizedBox` class doesn't wrap around a widget and only contains a `width` property. -Check out **Dart**. In the code, `Row` contains three `BlueBox` eidgets and one `SizedBox` class. Notice how the `SizedBox` separates the first and second `BlueBox` widgets. Also notice that `SizedBox` contains a `width` property of 100. +When the `SizedBox` class creates space between widgets, the `SizedBox` class doesn't take a child widget. Also, when `Row` contains a `SizedBox` class, the `SizedBox` class only utilizes a `width` property. Likewise, when `Column` contains a `SizedBox` class, the `SizedBox` class only utilizes a `height` property. -1. Run the code. +In this code example, try adding another `SizedBox` class between the second and third `BlueBox` widgets. Then add a `width` property equal to 25 inside the `SizedBox` class. +***Run the code.*** +{{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/19ead147ab5c7668d7d32e1cfed90097 {% endcomment %} -
-The code displays three blue squares, and `SizedBox` creates a gap between the first and middle squares. Try adding another `SizedBox` class to `Row`. - -1. In the code, create a new line between the second and third `BlueBox` widgets. -2. On the new line, enter `SizedBox()`. -2. Inside of the parentheses, enter `width: 25`. -3. Run the code. - -The code displays three blue squares, but now the squares have gaps between them, one with a width of 50 and another with a width of 25. ## Spacer class -Similar to `SizedBox`, `Spacer` is a class that creates space between widgets. The difference is that `Spacer` requires a `flex` property instead of `width` and `height` properties. +Similar to the `SizedBox` class, `Spacer` is a class that creates space between widgets. However, the `Spacer` class can't take child widgets and doesn't create space at exact dimensions. Instead, the `Spacer` class creates space utilizing `flex` properties. -#### Code example +#### Code example: Spacer class {:.no_toc} +{{site.alert.secondary}} +*Check out Dart.* -Check out **Dart**. In the code, `Row` contains three `BlueBox` widgets and one `Spacer` class. Notice how `Spacer` separates the first and second `BlueBox` widgets. +`Row` contains three `BlueBox` widgets and one `Spacer` class with a `flex` property equal to 1. Notice how the `Spacer` class separates the first and second `BlueBox` widgets. -1. Run the code. +In this code example, try adding another `Spacer` class between the second and third `BlueBox` widgets. Then add another `flex` property equal to 1 inside the `Spacer` class. +***Run the code.*** +{{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/bfc367aefde35e02ea5283efdbf58e60 {% endcomment %} -
-The code displays three blue squares, and `Spacer` creates a gap between the first and middle squares. Notice how the gap takes up all of the extra space inside the silver box. Try adding another `Spacer` class to `Row`. - -1. In the code, create a new line between the second and third `BlueBox` widgets. -2. On the new line, enter `Spacer()`. -3. Inside of the parentheses, enter `flex: 2`. -4. Run the code. - -The code displays three blue squares, but now the squares have gaps between them. ## Text class -`Text` is a class that displays a single line of text. `Text` classes can display lines of text in different fonts, styles, and colors. +`Text` is a class that displays a string of text. The `Text` class can display text at different font sizes and in various fonts and colors. -#### Code example +#### Code example: Text class {:.no_toc} +{{site.alert.secondary}} +*Check out Dart.* + + `Row` contains three `Text` classes, which all display "Hey!" in the same font, but at different font sizes and in different colors. Notice how `Row` also contains the `crossAxisAlignment` property and the `textBaseline` property. -Check out **Dart**. In the code, `Row` contains three `Text` classes. Also, notice that `Row` contains two properties: `crossAxisalignment` and `textBaseline`. + Earlier in this codelab, you learn about the `crossAxisAlignment` property and its `CrossAxisAlignment` enum `CrossAxisAlignment.baseline`. When `Row` and `Column` contain `Text` classes, the `crossAxisAlignment` property set to `CrossAxisAlignment.baseline` can align the `Text` classes along their character baselines. However, the `crossAxisAlignment` property requires the `textBaseline` property set to `TextBaseline.alphabetic`. -1. Run the code. + In this code example, try resetting the `crossAxisAlignment` property to `CrossAxisAlignment.baseline`. +***Run the code*** +{{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/0ff109090b99ef1873d9fad501b2bc86 {% endcomment %} -
-The code displays "Hey! Hey! Hey!" at three different font sizes and in Arial and black. Notice how "Hey! Hey! Hey!" is displayed at the center of the silver box. Try resetting `crossAxisAlignment` to `CrossAxisAlignment.baseline`. - -1. In the code, replace `CrossAxisAlignment.center` with `CrossAxisAlignment.baseline`. -2. Run the code. - -The code now displays all three `Text` classes on the same baseline. ## Icon class - -Icon is a class that displays glyphs and symbols. -#### Code example +`Icon` is a class that displays glyphs. Flutter is preloaded with multiple icon packages for Android and iOS applications. + +#### Code example: Icon class {:.no_toc} +{{site.alert.secondary}} + *Check out Dart.* -Check out **Dart**. In the code, `Row` contains three `Icon` classes. + `Row` contains three `Icon` classes, which all display widget icons in the same size. Notice how the first and second `Icon` classes contain `color` properties. -1. Run the code. + In this code example, try adding a `color` property set to `Colors.amber` inside the third `Icon` class. + ***Run the code*** +{{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/01688fca8c13f85d93078054af2e858b {% endcomment %} - -
- -The code displays a yellow sun, a white cloud, and a snowflake. Try adding a color property to `Icons.ac_unit`. - -1. In the code, create a new line under `size:50`. -2. On the new line, enter `color: Colors.blue`. -3. Run the code. - -The code displays all three icons, but now the snowflake is blue. + ## Image class -`Image` is a class that displays images. Unlike the widgets previously covered in this codelab, the `Image` class references data that's stored in another location. +`Image` is a class that links to and displays an image. Unlike the widgets previously covered in this codelab, the `Image` class references its data, which is stored remotely. -#### Code example +#### Code example: Image class {:.no_toc} +{{site.alert.secondary}} + *Check out Dart* -Check out **Dart**. In the code, `Row` contains three `Expanded` classes. Notice how the `Expanded` classes wrap around the `Image` classes. Also notice how the `Image` classes reference their images, which are stored on GitGub.com. - -1. Run the code. - - -
+ `Row` contains an `Image` class. Notice how the `Image` class references its image. The `Image` class initiates that it's linking to an image with `.Network` followed by parentheses. Then, inside the parentheses, the `Image` class links to its image. -The code displays three images. + In this code example, the code displays an image that's stored remotely on [GitHub](https://github.com/flutter/website/tree/master/examples/layout/sizing/images). + ***Run the code.*** +{{site.alert.end}} + ## Test yourself ### Part 1 ### Part 2 From b237fa9443d3ee18fef8edbb058417ee80ac6c6d Mon Sep 17 00:00:00 2001 From: datafoya <51213160+datafoya@users.noreply.github.com> Date: Thu, 1 Aug 2019 14:59:46 -0700 Subject: [PATCH 03/18] Update extended-flex-widget.md --- src/docs/codelabs/extended-flex-widget.md | 120 ++++++++++++++++------ 1 file changed, 87 insertions(+), 33 deletions(-) diff --git a/src/docs/codelabs/extended-flex-widget.md b/src/docs/codelabs/extended-flex-widget.md index dadd41f583..16bad0f6ce 100644 --- a/src/docs/codelabs/extended-flex-widget.md +++ b/src/docs/codelabs/extended-flex-widget.md @@ -13,9 +13,16 @@ toc: true Flutter supports devices that maintain right-to-left language settings. {{site.alert.end}} ## Introduction -In this codelab, you interact with and build Flutter layouts in a code editor called DartPad2. As you progress through this codelab, you learn that widgets build everything in flutter. A widget is an immutable object that describes a specific part of a UI. You also learn that, while widgets are simple in their functions, widgets can be complex in their structures. Widgets can be built around and inside of other widgets, and widgets can have interconnected and ordered relationships with one another. At the end of this codelab, you apply what you learn and build a simple interface using basic Fluter layout concepts. +In this codelab, you interact with and build Flutter layouts in a code editor called DartPad2. As you progress +through this codelab, you learn that widgets build everything in flutter. A widget is an immutable object +that describes a specific part of a UI. You also learn that, while widgets are simple in their functions, +widgets can be complex in their structures. Widgets can be built around and inside of other widgets, +and widgets can have interconnected and ordered relationships with one another. At the end of this codelab, +you apply what you learn and build a simple interface using basic Fluter layout concepts. ## Row class and Column class -`Row` and `Column` are classes that contain widgets. When `Row` and `Column` contain widgets, the widgets become "children," and `Row` and `Column` become "parents." Moreover, when `Row` and `Column` contain widgets, `Row` and `Column` lay them out. `Row` lays out its widgets horizontally. `Column` lays out its widgets vertically. +`Row` and `Column` are classes that contain widgets. When `Row` and `Column` contain widgets, the widgets +become "children," and `Row` and `Column` become "parents." Moreover, when `Row` and `Column` contain widgets, +`Row` and `Column` lay them out. `Row` lays out its widgets horizontally. `Column` lays out its widgets vertically. #### Code example: Row {:.no_toc} {{site.alert.secondary}} @@ -51,7 +58,8 @@ In this codelab, you interact with and build Flutter layouts in a code editor ca ## mainAxisSize property -`Row` and `Column` occupy different main axes. `Row`\'s main axis is horizontal. `Column`\'s main axis is vertical. `mainAxisSize` is a property that determines how much space `Row` and `Column` can occupy on their main axes. `mainAxisSize` has two `MainAxisSize` enums: +`Row` and `Column` occupy different main axes. `Row`\'s main axis is horizontal. `Column`\'s main axis is vertical. `mainAxisSize` is a property that determines how much space `Row` and `Column` can occupy on their main axes. +`mainAxisSize` has two `MainAxisSize` enums: * `MainAxisSize.max`
@@ -61,7 +69,8 @@ Increases the amount of space `Row` and `Column` can occupy on their main axes. Decreases the amount of space `Row` and `Column` can occupy on their main axes. {{site.alert.tip}} - `MainAxisSize.max` is a default enum. When building Flutter layouts, `Row` and `Column` automatically occupy all of the space on their main axes. + `MainAxisSize.max` is a default enum. When building Flutter layouts, `Row` and `Column` automatically occupy + all of the space on their main axes. {{site.alert.end}} #### Code example: MainAxisSize.max @@ -72,9 +81,11 @@ Decreases the amount of space `Row` and `Column` can occupy on their main axes. `Row` contains three `BlueBox` widgets. Notice how `mainAxisSize` is set to `MainAxisSize.max`. - When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` occupy all of the space on their main axes. As a result, `Row` and `Column` may have extra space on their main axes. + When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` occupy all of the space on their main axes. + As a result, `Row` and `Column` may have extra space on their main axes. - In this code example, the code displays three blue squares, but notice how the grey, rectangular box has extra space. + In this code example, the code displays three blue squares, but notice how the grey, rectangular box + has extra space. ***Run the code.*** {{site.alert.end}} @@ -91,9 +102,11 @@ Decreases the amount of space `Row` and `Column` can occupy on their main axes. `Row` contains three `BlueBox` widgets. Notice how `mainAxisSize` is set to `MainAxisSize.min`. - When `mainAxisSize` is set to `MainAxisSize.min`, `Row` and `Column` only occupy enough space on their main axes for their children. As a result, `Row` and `Column` don't have any extra space on their main axes. + When `mainAxisSize` is set to `MainAxisSize.min`, `Row` and `Column` only occupy enough space on their main axes + for their children. As a result, `Row` and `Column` don't have any extra space on their main axes. - In this code example, the code displays three blue squares, but notice how the grey, rectangular box doesn't have extra space. + In this code example, the code displays three blue squares, but notice how the grey, rectangular box + doesn't have extra space. ***Run the code.*** {{site.alert.end}} @@ -103,7 +116,9 @@ Decreases the amount of space `Row` and `Column` can occupy on their main axes. ## mainAxisAlignment property -When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` may have extra space on their main axes. `mainAxisAlignment` is a property that determines how `Row` and `Column` can position their children horizontally in extra space. `mainAxisAlignment` has six `MainAxisAlignment` enums: +When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` may have extra space +on their main axes. `mainAxisAlignment` is a property that determines how `Row` and `Column` can position +their children horizontally in extra space. `mainAxisAlignment` has six `MainAxisAlignment` enums: * `MainAxisAlignment.start`
Positions children near the beginning of the main axis. (Left for `Row`, top for `Column`) @@ -138,7 +153,11 @@ When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` may have ex {{site.alert.end}} ## crossAxisAlignment property -Similar to the `mainAxisAlignment` property, `crossAxisAlignment` is a property that determines how `Row` and `Column` can position their children in extra space. However, the `crossAxisAlignment` property determines how `Row` and `Column` can position their children vertically in extra space. As a result, most of the `crossAxisAlignment` property's enums only function inside of `Row`. The `crossAxisAlignment` property has five `CrossAxisAlignment` enums: +Similar to the `mainAxisAlignment` property, `crossAxisAlignment` is a property +that determines how `Row` and `Column` can position their children in extra space. However, +the `crossAxisAlignment` property determines how `Row` and `Column` can position their children vertically +in extra space. As a result, most of the `crossAxisAlignment` property's enums only function inside of `Row`. +The `crossAxisAlignment` property has five `CrossAxisAlignment` enums: * `CrossAxisAlignment.start`
Positions children near the top of the cross axis. (`Row`) @@ -174,9 +193,13 @@ Similar to the `mainAxisAlignment` property, `crossAxisAlignment` is a property {{site.alert.end}} ## Flexible class -`mainAxisAlignment` and `crossAxisAlignment` are properties that determine how `Row` and `Column` can position widgets in extra space. When `Row` and `Column` lay out widgets, they lay out widgets of a fixed size first. Widgets of a fixed size are considered "inflexible" because they can't resize themselves after `Row` and `Column` lay them out. +`mainAxisAlignment` and `crossAxisAlignment` are properties that determine how `Row` and `Column` can position widgets +in extra space. When `Row` and `Column` lay out widgets, they lay out widgets of a fixed size first. Widgets +of a fixed size are considered "inflexible" because they can't resize themselves after `Row` and `Column` lay them out. -`Flexible` is a class that wraps around a widget, takes the widget as its child, and then resizes the widget. When the `Flexible` class wraps around a widget, the widget is considered "flexible" because the widget can resize itself. `Row` and `Column` lay out flexible widgets after they lay out inflexible widgets. Flexible widgets can resize themselves according to their `flex` and `fit` properties: +`Flexible` is a class that wraps around a widget, takes the widget as its child, and then resizes the widget. +When the `Flexible` class wraps around a widget, the widget is considered "flexible" because the widget can resize +itself. `Row` and `Column` lay out flexible widgets after they lay out inflexible widgets. Flexible widgets can resize themselves according to their `flex` and `fit` properties: * `flex`
@@ -191,11 +214,15 @@ Similar to the `mainAxisAlignment` property, `crossAxisAlignment` is a property {{site.alert.secondary}} *Check out Dart.* - `Row` contains one `BlueBox` widget and two `Flexible` classes. Notice how the `Flexible` classes wrap around two `BlueBox` widgets. Also, notice that the `Flexible` classes contain `flex` properties with `flex` values set to 1. + `Row` contains one `BlueBox` widget and two `Flexible` classes. Notice how the `Flexible` classes wrap + around two `BlueBox` widgets. Also, notice that the `Flexible` classes contain `flex` properties + with `flex` values set to 1. - When `flex` properties compare themselves against one another, they add up their `flex` values, and the sum of the `flex` values determines what fraction of the total extra space each flexible widget receives. + When `flex` properties compare themselves against one another, they add up their `flex` values, and the sum + of the `flex` values determines what fraction of the total extra space each flexible widget receives. - In this code example, the sum of both `flex` values (2) determines that each flexible widget receives half of the extra space. + In this code example, the sum of both `flex` values (2) determines that each flexible widget receives half + of the extra space. ***Run the code.*** {{site.alert.end}} @@ -209,7 +236,10 @@ Similar to the `mainAxisAlignment` property, `crossAxisAlignment` is a property {{site.alert.secondary}} *Check out Dart.* - `Row` contains two `Flexible` classes that both wrap around `BlueBox` widgets. Notice that the `Flexible` classes contain `flex` properties with `flex` values set to 1. Also, notice that the `Flexible` classes contain `fit` properties with `fit` values set to `FlexFit.loose`. The `fit` property has two `fit` values that help determine whether a flexible widget can occupy all of its extra space: + `Row` contains two `Flexible` classes that both wrap around `BlueBox` widgets. Notice that + the `Flexible` classes contain `flex` properties with `flex` values set to 1. Also, notice that + the `Flexible` classes contain `fit` properties with `fit` values set to `FlexFit.loose`. The `fit` property has + two `fit` values that help determine whether a flexible widget can occupy all of its extra space: * `FlexFit.loose`
@@ -226,7 +256,9 @@ Similar to the `mainAxisAlignment` property, `crossAxisAlignment` is a property ## Expanded class -Similar to the `Flexible` class, `Expanded` is a class that can wrap around a widget, take the widget as its child, and then resize the widget. However, the `Expanded` class doesn't utilize `flex` and `fit` properties to resize its child. Insetad, the `Expanded` class forces its child to fill extra space. +Similar to the `Flexible` class, `Expanded` is a class that can wrap around a widget, take the widget as its child, +and then resize the widget. However, the `Expanded` class doesn't utilize `flex` and `fit` properties to resize +its child. Insetad, the `Expanded` class forces its child to fill extra space. #### Code example: Expanded class {:.no_toc} @@ -235,7 +267,8 @@ Similar to the `Flexible` class, `Expanded` is a class that can wrap around a wi `Row` contains two `BlueBox` widgets and one `Expanded` class. Notice how the `Expanded` class wraps around another `BlueBox` widget. - In this code example, the code displays three blue squares, and the middle square fills all of the extra space inside the grey, rectangular box. + In this code example, the code displays three blue squares, and the middle square fills all of the extra space + inside the grey, rectangular box. ***Run the code.*** {{site.alert.end}} @@ -243,14 +276,17 @@ Similar to the `Flexible` class, `Expanded` is a class that can wrap around a wi ## SizedBox class -Similar to the `Flexible` and `Expanded` classes, `SizedBox` is a class that can wrap around a widget, take the widget as its child, and then resize the widget. However, the `SizedBox` class also can create space between widgets. Instead of utilizing `flex` and `fit` properties, the `SizedBox` class utilizes `width` and `height` properties. +Similar to the `Flexible` and `Expanded` classes, `SizedBox` is a class that can wrap around a widget, take the widget +as its child, and then resize the widget. However, the `SizedBox` class also can create space between widgets. +Instead of utilizing `flex` and `fit` properties, the `SizedBox` class utilizes `width` and `height` properties. #### Code example: SizedBox with a child {:.no_toc} {{site.alert.secondary}} *Check out Dart.* -`Row` contains two `BlueBox` widgets and one `SizedBox` class. Notice how the `SizedBox` class wraps around another `BlueBox` widget and contains a `width` property equal to 100. +`Row` contains two `BlueBox` widgets and one `SizedBox` class. Notice how the `SizedBox` class wraps +around another `BlueBox` widget and contains a `width` property equal to 100. In this code example, try adding a height property equal to 100 inside the `SizedBox` class. @@ -266,11 +302,16 @@ In this code example, try adding a height property equal to 100 inside the `Size {{site.alert.secondary}} *Check out Dart.* -`Row` contains three `BlueBox` widgets and one `SizedBox` class. Notice how the `SizedBox` class separates the first and second `BlueBox` widgets. Also, notice how the `SizedBox` class doesn't wrap around a widget and only contains a `width` property. +`Row` contains three `BlueBox` widgets and one `SizedBox` class. Notice how the `SizedBox` class separates +the first and second `BlueBox` widgets. Also, notice how the `SizedBox` class doesn't wrap around a widget +and only contains a `width` property. -When the `SizedBox` class creates space between widgets, the `SizedBox` class doesn't take a child widget. Also, when `Row` contains a `SizedBox` class, the `SizedBox` class only utilizes a `width` property. Likewise, when `Column` contains a `SizedBox` class, the `SizedBox` class only utilizes a `height` property. +When the `SizedBox` class creates space between widgets, the `SizedBox` class doesn't take a child widget. Also, +when `Row` contains a `SizedBox` class, the `SizedBox` class only utilizes a `width` property. Likewise, +when `Column` contains a `SizedBox` class, the `SizedBox` class only utilizes a `height` property. -In this code example, try adding another `SizedBox` class between the second and third `BlueBox` widgets. Then add a `width` property equal to 25 inside the `SizedBox` class. +In this code example, try adding another `SizedBox` class between the second and third `BlueBox` widgets. Then add +a `width` property equal to 25 inside the `SizedBox` class. ***Run the code.*** {{site.alert.end}} @@ -281,16 +322,20 @@ In this code example, try adding another `SizedBox` class between the second and ## Spacer class -Similar to the `SizedBox` class, `Spacer` is a class that creates space between widgets. However, the `Spacer` class can't take child widgets and doesn't create space at exact dimensions. Instead, the `Spacer` class creates space utilizing `flex` properties. +Similar to the `SizedBox` class, `Spacer` is a class that creates space between widgets. However, the `Spacer` class +can't take child widgets and doesn't create space at exact dimensions. Instead, the `Spacer` class creates space +utilizing `flex` properties. #### Code example: Spacer class {:.no_toc} {{site.alert.secondary}} *Check out Dart.* -`Row` contains three `BlueBox` widgets and one `Spacer` class with a `flex` property equal to 1. Notice how the `Spacer` class separates the first and second `BlueBox` widgets. +`Row` contains three `BlueBox` widgets and one `Spacer` class with a `flex` property equal to 1. +Notice how the `Spacer` class separates the first and second `BlueBox` widgets. -In this code example, try adding another `Spacer` class between the second and third `BlueBox` widgets. Then add another `flex` property equal to 1 inside the `Spacer` class. +In this code example, try adding another `Spacer` class between the second and third `BlueBox` widgets. +Then add another `flex` property equal to 1 inside the `Spacer` class. ***Run the code.*** {{site.alert.end}} @@ -301,16 +346,20 @@ In this code example, try adding another `Spacer` class between the second and t ## Text class -`Text` is a class that displays a string of text. The `Text` class can display text at different font sizes and in various fonts and colors. +`Text` is a class that displays a string of text. The `Text` class can display text at different font sizes and +in various fonts and colors. #### Code example: Text class {:.no_toc} {{site.alert.secondary}} *Check out Dart.* - `Row` contains three `Text` classes, which all display "Hey!" in the same font, but at different font sizes and in different colors. Notice how `Row` also contains the `crossAxisAlignment` property and the `textBaseline` property. + `Row` contains three `Text` classes, which all display "Hey!" in the same font, but at different font sizes and + in different colors. Notice how `Row` also contains the `crossAxisAlignment` property and the `textBaseline` property. - Earlier in this codelab, you learn about the `crossAxisAlignment` property and its `CrossAxisAlignment` enum `CrossAxisAlignment.baseline`. When `Row` and `Column` contain `Text` classes, the `crossAxisAlignment` property set to `CrossAxisAlignment.baseline` can align the `Text` classes along their character baselines. However, the `crossAxisAlignment` property requires the `textBaseline` property set to `TextBaseline.alphabetic`. + Earlier in this codelab, you learn about the `crossAxisAlignment` property and its `CrossAxisAlignment` enum `CrossAxisAlignment.baseline`. When `Row` and `Column` contain `Text` classes, + the `crossAxisAlignment` property set to `CrossAxisAlignment.baseline` can align the `Text` classes + along their character baselines. However, the `crossAxisAlignment` property requires the `textBaseline` property set to `TextBaseline.alphabetic`. In this code example, try resetting the `crossAxisAlignment` property to `CrossAxisAlignment.baseline`. @@ -323,14 +372,16 @@ In this code example, try adding another `Spacer` class between the second and t ## Icon class -`Icon` is a class that displays glyphs. Flutter is preloaded with multiple icon packages for Android and iOS applications. +`Icon` is a class that displays glyphs. Flutter is preloaded with multiple icon packages +for Android and iOS applications. #### Code example: Icon class {:.no_toc} {{site.alert.secondary}} *Check out Dart.* - `Row` contains three `Icon` classes, which all display widget icons in the same size. Notice how the first and second `Icon` classes contain `color` properties. + `Row` contains three `Icon` classes, which all display widget icons in the same size. + Notice how the first and second `Icon` classes contain `color` properties. In this code example, try adding a `color` property set to `Colors.amber` inside the third `Icon` class. @@ -343,14 +394,17 @@ In this code example, try adding another `Spacer` class between the second and t ## Image class -`Image` is a class that links to and displays an image. Unlike the widgets previously covered in this codelab, the `Image` class references its data, which is stored remotely. +`Image` is a class that links to and displays an image. Unlike the widgets previously covered in this codelab, +the `Image` class references its data, which is stored remotely. #### Code example: Image class {:.no_toc} {{site.alert.secondary}} *Check out Dart* - `Row` contains an `Image` class. Notice how the `Image` class references its image. The `Image` class initiates that it's linking to an image with `.Network` followed by parentheses. Then, inside the parentheses, the `Image` class links to its image. + `Row` contains an `Image` class. Notice how the `Image` class references its image. The `Image` class initiates that + it's linking to an image with `.Network` followed by parentheses. Then, inside the parentheses, the `Image` class + links to its image. In this code example, the code displays an image that's stored remotely on [GitHub](https://github.com/flutter/website/tree/master/examples/layout/sizing/images). From 812d05971f6e0865202b36b693f3752cabeb630a Mon Sep 17 00:00:00 2001 From: datafoya <51213160+datafoya@users.noreply.github.com> Date: Thu, 1 Aug 2019 15:11:50 -0700 Subject: [PATCH 04/18] Update extended-flex-widget.md --- src/docs/codelabs/extended-flex-widget.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docs/codelabs/extended-flex-widget.md b/src/docs/codelabs/extended-flex-widget.md index 16bad0f6ce..4239e3df78 100644 --- a/src/docs/codelabs/extended-flex-widget.md +++ b/src/docs/codelabs/extended-flex-widget.md @@ -19,7 +19,7 @@ that describes a specific part of a UI. You also learn that, while widgets are s widgets can be complex in their structures. Widgets can be built around and inside of other widgets, and widgets can have interconnected and ordered relationships with one another. At the end of this codelab, you apply what you learn and build a simple interface using basic Fluter layout concepts. -## Row class and Column class +## Row and Column classes `Row` and `Column` are classes that contain widgets. When `Row` and `Column` contain widgets, the widgets become "children," and `Row` and `Column` become "parents." Moreover, when `Row` and `Column` contain widgets, `Row` and `Column` lay them out. `Row` lays out its widgets horizontally. `Column` lays out its widgets vertically. From 25276cbb879e839a70798e491e020e2a38cc1f55 Mon Sep 17 00:00:00 2001 From: datafoya Date: Fri, 2 Aug 2019 14:31:09 -0700 Subject: [PATCH 05/18] incorporating feedback plus other changes --- src/docs/codelabs/extended-flex-widget.md | 254 +++++++++++++--------- src/docs/codelabs/index.md | 2 +- src/docs/development/ui/widgets-intro.md | 4 +- src/docs/whats-new-archive.md | 2 +- 4 files changed, 153 insertions(+), 109 deletions(-) diff --git a/src/docs/codelabs/extended-flex-widget.md b/src/docs/codelabs/extended-flex-widget.md index dadd41f583..b172c253ff 100644 --- a/src/docs/codelabs/extended-flex-widget.md +++ b/src/docs/codelabs/extended-flex-widget.md @@ -1,5 +1,5 @@ --- -title: "Codelab: basic Flutter layout concepts" +title: "Codelab: Basic Flutter layout concepts" description: "A codelab that teaches basic Flutter layout concepts through DartPad2 code examples." toc: true --- @@ -13,20 +13,23 @@ toc: true Flutter supports devices that maintain right-to-left language settings. {{site.alert.end}} ## Introduction -In this codelab, you interact with and build Flutter layouts in a code editor called DartPad2. As you progress through this codelab, you learn that widgets build everything in flutter. A widget is an immutable object that describes a specific part of a UI. You also learn that, while widgets are simple in their functions, widgets can be complex in their structures. Widgets can be built around and inside of other widgets, and widgets can have interconnected and ordered relationships with one another. At the end of this codelab, you apply what you learn and build a simple interface using basic Fluter layout concepts. -## Row class and Column class -`Row` and `Column` are classes that contain widgets. When `Row` and `Column` contain widgets, the widgets become "children," and `Row` and `Column` become "parents." Moreover, when `Row` and `Column` contain widgets, `Row` and `Column` lay them out. `Row` lays out its widgets horizontally. `Column` lays out its widgets vertically. +In this codelab, you'll interact with and build Flutter layouts in a code editor called DartPad2. As you progress through this codelab, +you learn that widgets build everything in Flutter. A widget is an immutable object that describes a specific part of a UI. You also learn that, +while widgets are simple in their functions, widgets can be complex in their structures. Widgets can be built around and inside of other widgets, +and widgets can have interconnected and ordered relationships with one another. At the end of this codelab, you'll apply what you learn and build +a simple interface using basic Flutter layout concepts. +## Row and Column classes +`Row` and `Column` are classes that contain and lay out widgets. These widgets are called "children," and `Row` and `Column` are referred to + as "parents." `Row` lays out its widgets *horizontally*. `Column` lays out its widgets *vertically*. #### Code example: Row {:.no_toc} {{site.alert.secondary}} {:.no_toc} - *Check out Dart.* - - In the code, `Row` contains three children, all `BlueBox` widgets. - - In this code example, the code displays three blue squares horizontally. + Check out Dart. + + The following code example displays three blue squares horizontally. - ***Run the code.*** + Click the **Run** button. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/26c8fb02c58c4120917b073ec6253953 @@ -37,13 +40,11 @@ In this codelab, you interact with and build Flutter layouts in a code editor ca {:.no_toc} {{site.alert.secondary}} {:.no_toc} - *Check out Dart.* + Check out Dart. - In the code, `Column` contains three child widgets, all `BlueBox` widgets. + The following code example displays three blue squares vertically. - In this code example, the code displays three blue squares vertically. - - ***Run the code.*** + Click the **Run** button. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/db96dc75c3283227bc849ba31d213783 @@ -51,51 +52,35 @@ In this codelab, you interact with and build Flutter layouts in a code editor ca ## mainAxisSize property -`Row` and `Column` occupy different main axes. `Row`\'s main axis is horizontal. `Column`\'s main axis is vertical. `mainAxisSize` is a property that determines how much space `Row` and `Column` can occupy on their main axes. `mainAxisSize` has two `MainAxisSize` enums: +`Row` and `Column` occupy different main axes. `Row`\'s main axis is horizontal. `Column`\'s main axis is vertical. `mainAxisSize` is a property +that determines how much space `Row` and `Column` can occupy on their main axes. `mainAxisSize` has two `MainAxisSize` enums: * `MainAxisSize.max`
-Increases the amount of space `Row` and `Column` can occupy on their main axes. -* `MainAxisSize.min` +Increases the amount of space `Row` and `Column` can occupy on their main axes. `Row` and `Column` may have extra space. +* `MainAxisSize.min`
-Decreases the amount of space `Row` and `Column` can occupy on their main axes. +Decreases the amount of space `Row` and `Column` can occupy on their main axes. `Row` and `Column` only have enough space for their children. {{site.alert.tip}} - `MainAxisSize.max` is a default enum. When building Flutter layouts, `Row` and `Column` automatically occupy all of the space on their main axes. -{{site.alert.end}} - -#### Code example: MainAxisSize.max -{:.no_toc} -{{site.alert.secondary}} -{:.no_toc} - *Check out Dart.* - - `Row` contains three `BlueBox` widgets. Notice how `mainAxisSize` is set to `MainAxisSize.max`. - - When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` occupy all of the space on their main axes. As a result, `Row` and `Column` may have extra space on their main axes. - - In this code example, the code displays three blue squares, but notice how the grey, rectangular box has extra space. - - ***Run the code.*** + `MainAxisSize.max` is a default enum. Default enums don't require that you enter them in your code. Take a look at the previous code examples. + Both code examples contain the `mainAxisSize` property, although you can't see it. The following code example demonstrates where and how + the `mainAxisSize` property is entered. {{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/def3c5c3c68459b5bb4bdfed58f5d024 -{% endcomment %} - -#### Code example: MainAxisSize.min +#### Code example: MainAxisSize.max and MainAxisSize.min {:.no_toc} {{site.alert.secondary}} {:.no_toc} - *Check out Dart.* + Try Dart - `Row` contains three `BlueBox` widgets. Notice how `mainAxisSize` is set to `MainAxisSize.min`. + Notice how `Row` contains the `mainAxisSize` property set to `MainAxisSize.max`. - When `mainAxisSize` is set to `MainAxisSize.min`, `Row` and `Column` only occupy enough space on their main axes for their children. As a result, `Row` and `Column` don't have any extra space on their main axes. + **1.** Click the **Run** button. - In this code example, the code displays three blue squares, but notice how the grey, rectangular box doesn't have extra space. + **2.** Change the `mainAxisSize` property to `MainAxisSize.min`. - ***Run the code.*** + **3.** Click the **Run** button. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/def3c5c3c68459b5bb4bdfed58f5d024 @@ -103,7 +88,8 @@ Decreases the amount of space `Row` and `Column` can occupy on their main axes. ## mainAxisAlignment property -When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` may have extra space on their main axes. `mainAxisAlignment` is a property that determines how `Row` and `Column` can position their children horizontally in extra space. `mainAxisAlignment` has six `MainAxisAlignment` enums: +When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` may have extra space on their main axes. `mainAxisAlignment` is a property + that determines how `Row` and `Column` can position their children *horizontally* in that extra space. `mainAxisAlignment` has six `MainAxisAlignment` enums: * `MainAxisAlignment.start`
Positions children near the beginning of the main axis. (Left for `Row`, top for `Column`) @@ -121,24 +107,29 @@ When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` may have ex #### Code example: mainAxisAlignment property {:.no_toc} {{site.alert.secondary}} - *Check out Dart.* + Try Dart. - `Row` contains three `BlueBox` widgets. Notice how `mainAxisAlignment` is set to `MainAxisAlignment.start`. + Notice how `mainAxisAlignment` is set to `MainAxisAlignment.start`. - In this code example, the code displays three blue squares on the left side of the grey, rectangular box. + **1.** Click the **Run** button. - ***Run the code.*** + **2.** Change the `mainAxisAlignment` property to `MainAxisAlignment.end`. + + **3.** Click the **Run** button. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/cb8abed13f90a6a0c7a0ada6f15a09c9 {% endcomment %} {{site.alert.tip}} - Before moving to the next section, try resetting `mainAxisAlignment` to one of the other `MainAxisAlignment` enums. + Before moving to the next section, try changing `MainAxisAlignment.start` to one of the other enums. {{site.alert.end}} ## crossAxisAlignment property -Similar to the `mainAxisAlignment` property, `crossAxisAlignment` is a property that determines how `Row` and `Column` can position their children in extra space. However, the `crossAxisAlignment` property determines how `Row` and `Column` can position their children vertically in extra space. As a result, most of the `crossAxisAlignment` property's enums only function inside of `Row`. The `crossAxisAlignment` property has five `CrossAxisAlignment` enums: +Similar to the `mainAxisAlignment` property, `crossAxisAlignment` is a property that determines how `Row` and `Column` can position their children +in extra space. However, the `crossAxisAlignment` property determines how `Row` and `Column` can position their children *vertically* in that extra space. +Note that most of the `crossAxisAlignment` property's enums only function inside of `Row`. The `crossAxisAlignment` property +has five `CrossAxisAlignment` enums: * `CrossAxisAlignment.start`
Positions children near the top of the cross axis. (`Row`) @@ -149,34 +140,43 @@ Similar to the `mainAxisAlignment` property, `crossAxisAlignment` is a property * `CrossAxisAlignment.stretch`
Stretches children across the cross axis. (Top to bottom for `Row`, left to right for `Column`) * `CrossAxisAlignment.baseline`
- Aligns children according to their character baselines. (`Text` class) -{{site.alert.note}} - `CrossAxisAlignment.baseline` aligns `Text` classes along their character baselines, but requires the `textBaseline` property set to `TextBaseline.alphabetic`. In the following code example, if you reset `crossAxisAlignment` to `CrossAxisAlignment.baseline`, the code displays an error message. `CrossAxisAlignment.baseline` is covered in the [Text class](#text-class) section. + Aligns children by their character baselines. (`Text` class) +{{site.alert.tip}} + `CrossAxisAlignment.baseline` functions with `Text` classes and requires the `textBaseline` property set to `TextBaseline.alphabetic`. + In the [Text class](#text-class) section, you encounter a scenario where you may use this enum. {{site.alert.end}} #### Code example: crossAxisAlignment property {:.no_toc} {{site.alert.secondary}} - *Check out Dart.* + Try Dart. + + In this code example, the `crossAxisAlignnment` property is set to `CrossAxisAlignment.center`. Also, notice how `Row` contains a `BiggerBlueBox` widget + and the `mainAxisAlignment` property set to `MainAxisAlignment.spaceAround`. This widget and property help illustrate how the code displays + the children vertically. - `Row` contains two `BlueBox` widgets and one `BiggerBlueBox` widget. Notice how `crossAxisAlignment` is set to `CrossAxisAlignment.center`. + **1.** Click the **Run** button. - In this code example, the code displays two squares and one rectangle at the middle of the grey, rectangular box. + **2.** Change `CrossAxisAlignment.center` to `CrossAxisAlignment.start`. -***Run the code.*** + **3.** Click the **Run** button. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/70a6eb88f13019eec349a57bc4fd5fe0 {% endcomment %} {{site.alert.tip}} - Before moving to the next section, try resetting `crossAxisAlignment` to one of the other `CrossAxisAlignment` enums. + Before moving to the next section, try changing `CrossAxisAlignment.center` to one of the other enums. {{site.alert.end}} ## Flexible class -`mainAxisAlignment` and `crossAxisAlignment` are properties that determine how `Row` and `Column` can position widgets in extra space. When `Row` and `Column` lay out widgets, they lay out widgets of a fixed size first. Widgets of a fixed size are considered "inflexible" because they can't resize themselves after `Row` and `Column` lay them out. +`mainAxisAlignment` and `crossAxisAlignment` are properties that determine how `Row` and `Column` can position widgets in extra space. + When `Row` and `Column` lay out widgets, they lay out widgets of a fixed size first. Widgets of a fixed size are considered "inflexible" + because they can't resize themselves after `Row` and `Column` lay them out. -`Flexible` is a class that wraps around a widget, takes the widget as its child, and then resizes the widget. When the `Flexible` class wraps around a widget, the widget is considered "flexible" because the widget can resize itself. `Row` and `Column` lay out flexible widgets after they lay out inflexible widgets. Flexible widgets can resize themselves according to their `flex` and `fit` properties: +`Flexible` is a class that wraps around a widget, takes the widget as its child, and then resizes the widget. When the `Flexible` class wraps around a widget, + the widget is considered "flexible" because the widget can resize itself. `Row` and `Column` lay out flexible widgets after they lay out inflexible widgets. + Flexible widgets can resize themselves according to their `flex` and `fit` properties: * `flex`
@@ -189,27 +189,32 @@ Similar to the `mainAxisAlignment` property, `crossAxisAlignment` is a property #### Code example: flex property {:.no_toc} {{site.alert.secondary}} - *Check out Dart.* + Checkout Dart. - `Row` contains one `BlueBox` widget and two `Flexible` classes. Notice how the `Flexible` classes wrap around two `BlueBox` widgets. Also, notice that the `Flexible` classes contain `flex` properties with `flex` values set to 1. + Notice how two `Flexible` classes wrap around two `BlueBox` widgets. Also, notice that the `Flexible` classes contain `flex` properties equal to 1. - When `flex` properties compare themselves against one another, they add up their `flex` values, and the sum of the `flex` values determines what fraction of the total extra space each flexible widget receives. + When `flex` properties compare themselves against one another, they add up their `flex` values, and the sum of the `flex` values + determines what fraction of the total extra space each flexible widget receives. In this code example, the sum of both `flex` values (2) determines that each flexible widget receives half of the extra space. - ***Run the code.*** + Click the **Run** button. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/82e4dd24028034ae03ba0ddc71bf59e5 {% endcomment %} +{{site.alert.tip}} + Before moving to the next code example, try changing the `flex` values. +{{site.alert.end}} #### Code example: fit property {:.no_toc} {{site.alert.secondary}} - *Check out Dart.* + Try Dart. - `Row` contains two `Flexible` classes that both wrap around `BlueBox` widgets. Notice that the `Flexible` classes contain `flex` properties with `flex` values set to 1. Also, notice that the `Flexible` classes contain `fit` properties with `fit` values set to `FlexFit.loose`. The `fit` property has two `fit` values that help determine whether a flexible widget can occupy all of its extra space: + Notice how the `Flexible` classes contain `fit` properties set to `FlexFit.loose`. The `fit` property + has two `fit` values that help determine whether a flexible widget can occupy all of its extra space: * `FlexFit.loose`
@@ -218,43 +223,59 @@ Similar to the `mainAxisAlignment` property, `crossAxisAlignment` is a property
Forces a flexible widget to fill of its extra space. - In this code example, the `fit` properties restrict the flexible widgets from filling all of their extra space. Try resetting the `fit` properties to `FlexFit.tight`. + In this code example, the `fit` properties restrict the flexible widgets from filling all of their extra space. + + **1.** Click the **Run** button. - ***Run the code.*** + **2.** Change the `fit` properties to `FlexFit.tight`. + + **3.** Click the **Run** button. {{site.alert.end}} ## Expanded class -Similar to the `Flexible` class, `Expanded` is a class that can wrap around a widget, take the widget as its child, and then resize the widget. However, the `Expanded` class doesn't utilize `flex` and `fit` properties to resize its child. Insetad, the `Expanded` class forces its child to fill extra space. +Similar to the `Flexible` class, `Expanded` is a class that can wrap around a widget and take the widget as its child. However, the `Expanded` class forces its widget +to fill extra space. #### Code example: Expanded class {:.no_toc} {{site.alert.secondary}} - *Check out Dart.* + Try Dart. - `Row` contains two `BlueBox` widgets and one `Expanded` class. Notice how the `Expanded` class wraps around another `BlueBox` widget. + The `Expanded` class wraps around a widget in the exact same way that the `Flexible` class does. Except, the `Expanded` class doesn't require `flex` and `fit` + properties. - In this code example, the code displays three blue squares, and the middle square fills all of the extra space inside the grey, rectangular box. + **1.** Click the **Run** button. - ***Run the code.*** + **2.** Wrap the second BlueBox widget in an `Expanded` class. + + **3.** Click the **Run** button. {{site.alert.end}} ## SizedBox class -Similar to the `Flexible` and `Expanded` classes, `SizedBox` is a class that can wrap around a widget, take the widget as its child, and then resize the widget. However, the `SizedBox` class also can create space between widgets. Instead of utilizing `flex` and `fit` properties, the `SizedBox` class utilizes `width` and `height` properties. +Similar to the `Flexible` and `Expanded` classes, `SizedBox` is a class that can wrap around a widget, take the widget as its child, and then resize the widget. However, the `SizedBox` class also can create space between widgets. Instead of using `flex` and `fit` properties, the `SizedBox` class uses + `width` and `height` properties. +{{site.alert.tip}} + When the `SizedBox` class creates space between widgets, it doesn't take a child widget. It also only uses `width` properties when it's inside of `Row` + and `height` properties when it's inside of `Column`. +{{site.alert.end}} #### Code example: SizedBox with a child {:.no_toc} {{site.alert.secondary}} -*Check out Dart.* + Try Dart. -`Row` contains two `BlueBox` widgets and one `SizedBox` class. Notice how the `SizedBox` class wraps around another `BlueBox` widget and contains a `width` property equal to 100. + Notice how `Row` contains two `BlueBox` widgets and one `SizedBox` class that class wraps around a `BlueBox` widget. Also, notice how the `SizedBox` class + contains a `width` property equal to 100. -In this code example, try adding a height property equal to 100 inside the `SizedBox` class. + **1.** Click the **Run** button. -***Run the code.*** + **2.** Add a height property equal to 100 inside the `SizedBox` class. + + **3.** Click the **Run** button. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/6582851e85b57180ff5321f814fabb81 @@ -264,15 +285,18 @@ In this code example, try adding a height property equal to 100 inside the `Size #### Code example: SizedBox without a child {:.no_toc} {{site.alert.secondary}} -*Check out Dart.* + Try Dart. + + Notice how `Row` contains three `BlueBox` widgets and one `SizedBox` class that separates the first and second `BlueBox` widgets. + Also, notice how the `SizedBox` class contains a `width` property equal to 50. -`Row` contains three `BlueBox` widgets and one `SizedBox` class. Notice how the `SizedBox` class separates the first and second `BlueBox` widgets. Also, notice how the `SizedBox` class doesn't wrap around a widget and only contains a `width` property. + **1.** Click the **Run** button. -When the `SizedBox` class creates space between widgets, the `SizedBox` class doesn't take a child widget. Also, when `Row` contains a `SizedBox` class, the `SizedBox` class only utilizes a `width` property. Likewise, when `Column` contains a `SizedBox` class, the `SizedBox` class only utilizes a `height` property. + **2.** Add another `SizedBox` class between the second and third `BlueBox` widgets. -In this code example, try adding another `SizedBox` class between the second and third `BlueBox` widgets. Then add a `width` property equal to 25 inside the `SizedBox` class. + **3.** Inside the `SizedBox` class, add a `width` property equal to 25. -***Run the code.*** + **4.** Click the **Run** button. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/19ead147ab5c7668d7d32e1cfed90097 @@ -281,18 +305,24 @@ In this code example, try adding another `SizedBox` class between the second and ## Spacer class -Similar to the `SizedBox` class, `Spacer` is a class that creates space between widgets. However, the `Spacer` class can't take child widgets and doesn't create space at exact dimensions. Instead, the `Spacer` class creates space utilizing `flex` properties. +Similar to the `SizedBox` class, `Spacer` is a class that creates space between widgets. However, the `Spacer` class can't take child widgets + and doesn't create space at exact dimensions. Instead, the `Spacer` class creates space using the `flex` property. #### Code example: Spacer class {:.no_toc} {{site.alert.secondary}} -*Check out Dart.* + Try Dart. + + Notice how `Row` contains three `BlueBox` widgets and one `Spacer` class that separates the first and second `BlueBox` widgets. Also, notice + how the `Spacer` class separates the first and second `BlueBox` widgets. -`Row` contains three `BlueBox` widgets and one `Spacer` class with a `flex` property equal to 1. Notice how the `Spacer` class separates the first and second `BlueBox` widgets. + **1.** Click the **Run** button. -In this code example, try adding another `Spacer` class between the second and third `BlueBox` widgets. Then add another `flex` property equal to 1 inside the `Spacer` class. + **2.** Add another `Spacer` class between the second and third `BlueBox` widgets. -***Run the code.*** + **3.** Inside the `Spacer` class, add another `flex` property equal to 1. + + **4.** Click the **Run** button. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/bfc367aefde35e02ea5283efdbf58e60 @@ -301,20 +331,24 @@ In this code example, try adding another `Spacer` class between the second and t ## Text class -`Text` is a class that displays a string of text. The `Text` class can display text at different font sizes and in various fonts and colors. +`Text` is a class that displays a string of text. The `Text` class can display text at different font sizes and in different fonts and colors. #### Code example: Text class {:.no_toc} {{site.alert.secondary}} -*Check out Dart.* + Try Dart. + + Notice how `Row` contains three `Text` classes, which display "Hey!" in the same font but at different font sizes and in different colors. + Also, notice that `Row` contains the `crossAxisAlignment` property and the `textBaseline` property. - `Row` contains three `Text` classes, which all display "Hey!" in the same font, but at different font sizes and in different colors. Notice how `Row` also contains the `crossAxisAlignment` property and the `textBaseline` property. + Earlier in this codelab, you learn that `CrossAxisAlignment.baseline` aligns `Text` classes by their character baselines when your code + contains the `textBaseline` property set to `TextBaseline.alphabetic`. - Earlier in this codelab, you learn about the `crossAxisAlignment` property and its `CrossAxisAlignment` enum `CrossAxisAlignment.baseline`. When `Row` and `Column` contain `Text` classes, the `crossAxisAlignment` property set to `CrossAxisAlignment.baseline` can align the `Text` classes along their character baselines. However, the `crossAxisAlignment` property requires the `textBaseline` property set to `TextBaseline.alphabetic`. + **1.** Click the **Run** button. - In this code example, try resetting the `crossAxisAlignment` property to `CrossAxisAlignment.baseline`. + **2.** Change the `crossAxisAlignment` property to `CrossAxisAlignment.baseline`. -***Run the code*** + **3.** Click the **Run** button. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/0ff109090b99ef1873d9fad501b2bc86 @@ -323,18 +357,26 @@ In this code example, try adding another `Spacer` class between the second and t ## Icon class -`Icon` is a class that displays glyphs. Flutter is preloaded with multiple icon packages for Android and iOS applications. +`Icon` is a class that displays symbols. Flutter is preloaded with icon packages for Android and iOS applications. #### Code example: Icon class {:.no_toc} {{site.alert.secondary}} - *Check out Dart.* + + Try Dart. + + Notice how `Row` contains two `Icon` classes that display widget icons at the same size. Also, notice how the `Icon` classes contain + different color properties. + + **1.** Click the **Run** button. + + **2.** Add another widget icon below the red widget icon. - `Row` contains three `Icon` classes, which all display widget icons in the same size. Notice how the first and second `Icon` classes contain `color` properties. + **3.** Give it a `size` property equal to 50. - In this code example, try adding a `color` property set to `Colors.amber` inside the third `Icon` class. + **4.** Give it `color` property set to `Colors.amber`. - ***Run the code*** + **3.** Click the **Run** button. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/01688fca8c13f85d93078054af2e858b @@ -343,18 +385,20 @@ In this code example, try adding another `Spacer` class between the second and t ## Image class -`Image` is a class that links to and displays an image. Unlike the widgets previously covered in this codelab, the `Image` class references its data, which is stored remotely. +`Image` is a class that links to and displays an image. Unlike the widgets previously covered in this codelab, the `Image` class references its data, +which is stored remotely. #### Code example: Image class {:.no_toc} {{site.alert.secondary}} - *Check out Dart* + Check out Dart. - `Row` contains an `Image` class. Notice how the `Image` class references its image. The `Image` class initiates that it's linking to an image with `.Network` followed by parentheses. Then, inside the parentheses, the `Image` class links to its image. + `Row` contains an `Image` class. Notice how the `Image` class references its image. The `Image` class initiates that its link with `.Network` + followed by parentheses. Then, inside the parentheses, the `Image` class links to its image. In this code example, the code displays an image that's stored remotely on [GitHub](https://github.com/flutter/website/tree/master/examples/layout/sizing/images). - ***Run the code.*** + Click the **Run** button. {{site.alert.end}} ## Test yourself diff --git a/src/docs/codelabs/index.md b/src/docs/codelabs/index.md index 13b8796a82..1d7f143e4c 100644 --- a/src/docs/codelabs/index.md +++ b/src/docs/codelabs/index.md @@ -4,7 +4,7 @@ description: "Codelabs help you quickly get started programming Flutter." --- -#### [Basic Flutter layout](/docs/codelabs/layout-basics) +#### [Codelab: basic Flutter layout concepts](/docs/codelabs/extended-flex-widget) Use DartPad in a browser (no need to download Flutter or Dart!) to learn the basics of creating a Flutter layout. diff --git a/src/docs/development/ui/widgets-intro.md b/src/docs/development/ui/widgets-intro.md index 56438b4add..8665f1d876 100644 --- a/src/docs/development/ui/widgets-intro.md +++ b/src/docs/development/ui/widgets-intro.md @@ -17,8 +17,8 @@ needed in the underlying render tree to transition from one state to the next. {{site.alert.note}} If you would like to become better acquainted with Flutter by diving - into some code, check out [Basic layout - codelab](/docs/codelabs/layout-basics), [Building Layouts in + into some code, check out [Basic Flutter layout + codelab](/docs/codelabs/extended-flex-widget), [Building Layouts in Flutter](/docs/development/ui/layout), and [Adding Interactivity to Your Flutter App](/docs/development/ui/interactive). {{site.alert.end}} diff --git a/src/docs/whats-new-archive.md b/src/docs/whats-new-archive.md index a487abf35b..b98689993e 100644 --- a/src/docs/whats-new-archive.md +++ b/src/docs/whats-new-archive.md @@ -19,7 +19,7 @@ notes](https://github.com/flutter/flutter/wiki/Release-Notes-Flutter-1.5.4) or [download the release](/docs/development/tools/sdk/archive). We are updating DartPad to work with Flutter. Try our new -[Basic Flutter layout codelab](/docs/codelabs/layout-basics) +[Basic Flutter layout codelab](/docs/codelabs/extended-widget-flex) and tell us what you think! ## **February 26, 2019** From 43faea49239961ad1f0547d51caee13dc0e94aaa Mon Sep 17 00:00:00 2001 From: datafoya Date: Mon, 5 Aug 2019 11:02:53 -0700 Subject: [PATCH 06/18] fixing broken link --- src/docs/whats-new-archive.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docs/whats-new-archive.md b/src/docs/whats-new-archive.md index b98689993e..2775ed1fff 100644 --- a/src/docs/whats-new-archive.md +++ b/src/docs/whats-new-archive.md @@ -19,7 +19,7 @@ notes](https://github.com/flutter/flutter/wiki/Release-Notes-Flutter-1.5.4) or [download the release](/docs/development/tools/sdk/archive). We are updating DartPad to work with Flutter. Try our new -[Basic Flutter layout codelab](/docs/codelabs/extended-widget-flex) +[Basic Flutter layout codelab](/docs/codelabs/extended-flex-widget) and tell us what you think! ## **February 26, 2019** From 702328c82267ecd4c4c8c5f863e3a1398cf88846 Mon Sep 17 00:00:00 2001 From: datafoya Date: Tue, 6 Aug 2019 14:49:25 -0700 Subject: [PATCH 07/18] applying shams' comments --- src/docs/codelabs/extended-flex-widget.md | 234 +++++++++++++--------- 1 file changed, 140 insertions(+), 94 deletions(-) diff --git a/src/docs/codelabs/extended-flex-widget.md b/src/docs/codelabs/extended-flex-widget.md index cb3924ab3a..89203813c1 100644 --- a/src/docs/codelabs/extended-flex-widget.md +++ b/src/docs/codelabs/extended-flex-widget.md @@ -1,37 +1,27 @@ --- -title: "Codelab: Basic Flutter layout concepts" +title: "Basic Flutter layout concepts" description: "A codelab that teaches basic Flutter layout concepts through DartPad2 code examples." toc: true --- {{site.alert.important}} - This codelab covers basic Flutter layout concepts using a code editor called DartPad2. An understanding of [Dart](https://www.dart.dev) or some exposure to object-oriented programming is recommended. -{{site.alert.end}} -{{site.alert.important}} - Currently, DartPad2 is in the experimental stage and being tested with Google Chrome. A PC (Microsoft, Mac, or Linux) with Google Chrome installed is required for this codelab. If you encounter any difficulties while using DartPad2, please create a [DartPad issue](https://github.com/dart-lang/dart-pad/issues/new) and label the issue "platform-web." + This codelab covers basic Flutter layout concepts using a browser-based code editor called DartPad. Currently, DartPad is in the experimental stage and has experienced issues on Safari. If you encounter any difficulties while using DartPad, please create a [DartPad issue](https://github.com/dart-lang/dart-pad/issues/new) and label the issue "platform-web." {{site.alert.end}} -{{site.alert.note}} - Flutter supports devices that maintain right-to-left language settings. -{{site.alert.end}} ## Introduction -In this codelab, you'll interact with and build Flutter layouts in a code editor called DartPad2. -As you progress through this codelab, you learn that widgets build everything in Flutter. -A widget is an immutable object that describes a specific part of a UI. You also learn that, -while widgets are simple in their functions, widgets can be complex in their structures. -Widgets can be built around and inside of other widgets, -and widgets can have interconnected and ordered relationships with one another. At the end of this codelab, -you'll apply what you learn and build a simple interface using basic Flutter layout concepts. +Flutter is different from other frameworks in that its UI is built from code, not an XML file (or similar). +Widgets are the basic building blocks of Flutter's UI. As you progress through this codelab, +you'll learn that almost everything in Flutter is a widget. A widget is an immutable object that describes a specific part of a UI. You'll also learn that Flutter's widgets are composable; meaning, +you can combine existing widgets to make more sophisticated widgets. For example, widgets can be built around and inside of other widgets, and widgets can have interconnected and ordered relationships with one another. +At the end of this codelab, you'll apply what you've learned to build an interface that uses Flutter's basic layout concepts. ## Row and Column classes `Row` and `Column` are classes that contain and lay out widgets. These widgets are called "children," -and `Row` and `Column` are referred to as "parents." `Row` lays out its widgets *horizontally*. +and `Row` and `Column` are referred to as "parents." `Row` lays out its widgets *horizontally*, and `Column` lays out its widgets *vertically*. -#### Code example: Row +#### Example: Create a Row {:.no_toc} {{site.alert.secondary}} -{:.no_toc} - Check out Dart. - +{:.no_toc} The following code example displays three blue squares horizontally. Click the **Run** button. @@ -41,14 +31,14 @@ and `Row` and `Column` are referred to as "parents." `Row` lays out its widgets {% endcomment %} -#### Code example: Column +#### Example: Create a Column {:.no_toc} {{site.alert.secondary}} {:.no_toc} - Check out Dart. - The following code example displays three blue squares vertically. + The difference between this example and the previous one is that `MyWidget` in the code below returns a `Column`. + Click the **Run** button. {{site.alert.end}} {% comment %} @@ -56,32 +46,34 @@ and `Row` and `Column` are referred to as "parents." `Row` lays out its widgets {% endcomment %} -## mainAxisSize property +## Alignment + +So far, the blue boxes have been displayed close together (either to the left or at the top) of the UI Output. You can change their spacing using the following alignment properties. -`Row` and `Column` occupy different main axes. `Row`\'s main axis is horizontal. `Column`\'s main axis is vertical. +### mainAxisSize property + +`Row` and `Column` occupy different main axes. `Row`\'s main axis is horizontal, and `Column`\'s main axis is vertical. `mainAxisSize` is a property that determines how much space `Row` and `Column` can occupy on their main axes. -`mainAxisSize` has two `MainAxisSize` enums: +`mainAxisSize` has two possible values: `MainAxisSize.max` : Increases the amount of space `Row` and `Column` can occupy on their main axes. -`Row` and `Column` may have extra space. +`Row` and `Column` might have extra space. `MainAxisSize.min` : Decreases the amount of space `Row` and `Column` can occupy on their main axes. `Row` and `Column` only have enough space for their children. {{site.alert.tip}} - `MainAxisSize.max` is a default enum. Default enums don't require that you enter them in your code. - Take a look at the previous code examples. Both code examples contain the `mainAxisSize` property, - although you can't see it. The following code example demonstrates where and how the `mainAxisSize` property is entered. + `MainAxisSize.max` is a default value. Default values aren't required in the code, + as shown in the previous code examples. {{site.alert.end}} -#### Code example: MainAxisSize.max and MainAxisSize.min +#### Example: Modify axis size {:.no_toc} {{site.alert.secondary}} {:.no_toc} - Try Dart - Notice how `Row` contains the `mainAxisSize` property set to `MainAxisSize.max`. + The following example explicitly sets the `mainAxisSize` property to `MainAxisSize.max`. **1.** Click the **Run** button. @@ -94,10 +86,10 @@ and `Row` and `Column` are referred to as "parents." `Row` lays out its widgets {% endcomment %} -## mainAxisAlignment property +### mainAxisAlignment property -When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` may have extra space on their main axes. -`mainAxisAlignment` is a property that determines how `Row` and `Column` can position their children *horizontally* in that extra space. `mainAxisAlignment` has six `MainAxisAlignment` enums: +When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` might have extra space on their main axes. +`mainAxisAlignment` is a property that determines how `Row` and `Column` can position their children in that extra space. `mainAxisAlignment` has six possible values: `MainAxisAlignment.start` : Positions children near the beginning of the main axis. (Left for `Row`, top for `Column`) @@ -117,12 +109,11 @@ When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` may have ex `MainAxisAlignment.spaceAround` : Similar to `MainAxisAlignment.spaceEvenly` but reduces half of the space before the first child and after the last child. -#### Code example: mainAxisAlignment property +#### Example: mainAxisAlignment property {:.no_toc} {{site.alert.secondary}} - Try Dart. - Notice how `mainAxisAlignment` is set to `MainAxisAlignment.start`. + The following example explicitly sets the `mainAxisAlignment` property to `MainAxisAlignment.start`. **1.** Click the **Run** button. @@ -135,45 +126,40 @@ When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` may have ex {% endcomment %} {{site.alert.tip}} - Before moving to the next section, try changing `MainAxisAlignment.start` to one of the other enums. + Before moving to the next section, try changing `MainAxisAlignment.start` to one of the other values. {{site.alert.end}} -## crossAxisAlignment property +### crossAxisAlignment property Similar to the `mainAxisAlignment` property, -`crossAxisAlignment` is a property that determines how `Row` and `Column` can position their children in extra space. -However, -the `crossAxisAlignment` property determines how `Row` and `Column` can position their children *vertically* in that extra space. -Note that most of the `crossAxisAlignment` property's enums only function inside of `Row`. -The `crossAxisAlignment` property has five `CrossAxisAlignment` enums: +`crossAxisAlignment` is a property that determines how `Row` and `Column` can position their children in extra space. +The difference is that the `crossAxisAlignment` property determines how `Row` and `Column` can position their children in vertical space. Most of the `crossAxisAlignment` property's values only work with `Row`, +and the `crossAxisAlignment` property has five possible values: `CrossAxisAlignment.start` -: Positions children near the top of the cross axis. (`Row`) +: Positions children near the top of the cross axis. (`Row` only) `CrossAxisAlignment.end` -: Positions children near the bottom of the cross axis. (`Row`) +: Positions children near the bottom of the cross axis. (`Row` only) `CrossAxisAlignment.center` -: Positions children at the middle of the cross axis. (`Row`) +: Positions children at the middle of the cross axis. (`Row` only) `CrossAxisAlignment.stretch` : Stretches children across the cross axis. (Top to bottom for `Row`, left to right for `Column`) `CrossAxisAlignment.baseline` -: Aligns children by their character baselines. (`Text` class) +: Aligns children by their character baselines. (`Text` class only) {{site.alert.tip}} - `CrossAxisAlignment.baseline` functions with `Text` classes and requires the `textBaseline` property set to `TextBaseline.alphabetic`. In the [Text class](#text-class) section, - you encounter a scenario where you may use this enum. + `CrossAxisAlignment.baseline` works with `Text` classes and requires the `textBaseline` property set to `TextBaseline.alphabetic`. See the [Text class](#text-class) section for an example of this value. {{site.alert.end}} -#### Code example: crossAxisAlignment property +#### Example: crossAxisAlignment property {:.no_toc} {{site.alert.secondary}} - Try Dart. - - In this code example, the `crossAxisAlignnment` property is set to `CrossAxisAlignment.center`. Also, - notice how `Row` contains a `BiggerBlueBox` widget and the `mainAxisAlignment` property set to `MainAxisAlignment.spaceAround`. This widget and property help illustrate how the code displays the children vertically. + The following example explicitly sets the `crossAxisAlignnment` property to `CrossAxisAlignment.center`. + Also, notice how `Row` contains a `BiggerBlueBox` widget and the `mainAxisAlignment` property set to `MainAxisAlignment.spaceAround`. This widget and property help illustrate how the code displays the children in vertical space. **1.** Click the **Run** button. @@ -186,7 +172,7 @@ The `crossAxisAlignment` property has five `CrossAxisAlignment` enums: {% endcomment %} {{site.alert.tip}} - Before moving to the next section, try changing `CrossAxisAlignment.center` to one of the other enums. + Before moving to the next section, try changing `CrossAxisAlignment.center` to one of the other values. {{site.alert.end}} ## Flexible class @@ -205,11 +191,9 @@ itself. `Row` and `Column` lay out flexible widgets after they lay out inflexibl `fit` : Determines whether a flexible widget fills all of its extra space. -#### Code example: flex property +#### Example: flex property {:.no_toc} {{site.alert.secondary}} - Checkout Dart. - Notice how two `Flexible` classes wrap around two `BlueBox` widgets. Also, notice that the `Flexible` classes contain `flex` properties equal to 1. When `flex` properties compare themselves against one another, they add up their `flex` values, and the sum of the `flex` values @@ -228,11 +212,9 @@ itself. `Row` and `Column` lay out flexible widgets after they lay out inflexibl Before moving to the next code example, try changing the `flex` values. {{site.alert.end}} -#### Code example: fit property +#### Example: fit property {:.no_toc} {{site.alert.secondary}} - Try Dart. - Notice how the `Flexible` classes contain `fit` properties set to `FlexFit.loose`. The `fit` property has two `fit` values that help determine whether a flexible widget can occupy all of its extra space: @@ -252,16 +234,14 @@ itself. `Row` and `Column` lay out flexible widgets after they lay out inflexibl {{site.alert.end}} -## Expanded class +## Expanded widget Similar to the `Flexible` class, `Expanded` is a class that can wrap around a widget and take the widget as its child. However, the `Expanded` class forces its widget to fill extra space. -#### Code example: Expanded class +#### Example: Expanded widget {:.no_toc} {{site.alert.secondary}} - Try Dart. - The `Expanded` class wraps around a widget in the exact same way that the `Flexible` class does. Except, the `Expanded` class doesn't require `flex` and `fit` properties. @@ -273,7 +253,7 @@ However, the `Expanded` class forces its widget to fill extra space. {{site.alert.end}} -## SizedBox class +## SizedBox widget Similar to the `Flexible` and `Expanded` classes, `SizedBox` is a class that can wrap around a widget, take the widget as its child, and then resize the widget. However, the `SizedBox` class also can create space between widgets. Instead of using `flex` and `fit` properties, the `SizedBox` class uses `width` and `height` properties. @@ -282,11 +262,9 @@ take the widget as its child, and then resize the widget. However, the `SizedBox When the `SizedBox` class creates space between widgets, it doesn't take a child widget. It also only uses `width` properties when it's inside of `Row` and `height` properties when it's inside of `Column`. {{site.alert.end}} -#### Code example: SizedBox with a child +#### Example: SizedBox with a child {:.no_toc} {{site.alert.secondary}} - Try Dart. - Notice how `Row` contains two `BlueBox` widgets and one `SizedBox` class that class wraps around a `BlueBox` widget. Also, notice how the `SizedBox` class contains a `width` property equal to 100. @@ -301,11 +279,9 @@ take the widget as its child, and then resize the widget. However, the `SizedBox {% endcomment %} -#### Code example: SizedBox without a child +#### Example: SizedBox without a child {:.no_toc} {{site.alert.secondary}} - Try Dart. - Notice how `Row` contains three `BlueBox` widgets and one `SizedBox` class that separates the first and second `BlueBox` widgets. Also, notice how the `SizedBox` class contains a `width` property equal to 50. @@ -322,17 +298,15 @@ take the widget as its child, and then resize the widget. However, the `SizedBox {% endcomment %} -## Spacer class +## Spacer widget Similar to the `SizedBox` class, `Spacer` is a class that creates space between widgets. However, the `Spacer` class can't take child widgets and doesn't create space at exact dimensions. Instead, the `Spacer` class creates space using the `flex` property. -#### Code example: Spacer class +#### Example: Spacer widget {:.no_toc} {{site.alert.secondary}} - Try Dart. - Notice how `Row` contains three `BlueBox` widgets and one `Spacer` class that separates the first and second `BlueBox` widgets. Also, notice how the `Spacer` class separates the first and second `BlueBox` widgets. **1.** Click the **Run** button. @@ -348,16 +322,14 @@ the `Spacer` class creates space using the `flex` property. {% endcomment %} -## Text class +## Text widget `Text` is a class that displays a string of text. The `Text` class can display text at different font sizes and in different fonts and colors. -#### Code example: Text class +#### Example: Text widget {:.no_toc} {{site.alert.secondary}} - Try Dart. - Notice how `Row` contains three `Text` classes, which display "Hey!" in the same font but at different font sizes and in different colors. Also, notice that `Row` contains the `crossAxisAlignment` property and the `textBaseline` property. @@ -375,16 +347,13 @@ The `Text` class can display text at different font sizes and in different fonts {% endcomment %} -## Icon class +## Icon widget `Icon` is a class that displays symbols. Flutter is preloaded with icon packages for Android and iOS applications. -#### Code example: Icon class +#### Example: Icon widget {:.no_toc} {{site.alert.secondary}} - - Try Dart. - Notice how `Row` contains two `Icon` classes that display widget icons at the same size. Also, notice how the `Icon` classes contain different color properties. @@ -403,16 +372,14 @@ The `Text` class can display text at different font sizes and in different fonts {% endcomment %} -## Image class +## Image widget `Image` is a class that links to and displays an image. Unlike the widgets previously covered in this codelab, the `Image` class references its data, which is stored remotely. -#### Code example: Image class +#### Example: Image widget {:.no_toc} {{site.alert.secondary}} - Check out Dart. - `Row` contains an `Image` class. Notice how the `Image` class references its image. The `Image` class initiates its link with `.Network` followed by parentheses. Then, inside the parentheses, the `Image` class links to its image. @@ -422,8 +389,87 @@ the `Image` class references its data, which is stored remotely. Click the **Run** button. {{site.alert.end}} -## Test yourself + +## Putting it all together +{:.no_toc} + +In this section of the codelab, you'll apply techniques that you've learned and build a UI that displays a business card. + ### Part 1 +{:.no_toc} + +This part contains two examples. In the first part, you build a `Column` that displays a name and business title. In the second part, you wrap the `Column` that you create in a `Row` that displays the name, business title, and business icon. + +#### Example: Name and business title +{:.no_toc} +{{site.alert.secondary}} + + To complete this example, you need to build a `Column` that contains the following classes. + + * Two `Text` classes. + + One `Text` class that contains the name "Flutter McFlutter" and a `style` property set to `Theme.of(context).textTheme.headline`. + + Another `Text` class that contains the title "Experienced Developer." + + * A `mainAxisSize` property set to `MainAxisSize.min` + * A `crossAxisAlignment` property set to `CrossAxisAlignment.start`. +{{site.alert.end}} + + +#### Example: Business icon +{:.no_toc} +{{site.alert.secondary}} + To complete this example, you need to wrap the `Column` you created in a `Row` that contains the following classes. + + * An `Icon` class set to `Icons.account_circle` and that contains a `size` property set to 50. + * A `Padding` widget that wraps around the `Icon` class. The `Padding` widget also contains a `padding` constraint set to `const EdgeInsets.all(8.0)`. + +{{site.alert.end}} + + ### Part 2 +{:.no_toc} + +#### Example: Contact information 1 +{{site.alert.secondary}} + + To complete this example, you need to wrap the `Row` you created in a `Column` that contains the following classes. + + **1.** A `mainAxisSize` property set to `MainAxisSize.min`. + + **3.** A `crossAxisAlignment` property set to `CrossAxisAlignment.stretch`. + + **4.** A `SizedBox` class with a height property equal to 8. + + **5.** An empty `Row` class. + + **6.** Another `SizedBox` class with a height property equal to 16. + + **7.** Another empty `Row` class. +{{site.alert.end}} + + + +#### Example: Contact information 2 + +{{site.alert.secondary}} + +**1.** In the first `Row` class' list of children, add a `Text` class that contains the address `'123 Main Street'`. + +**2.** In the second `Row` class' list of children, add a `Text` class that contain the phone number `'123-456-7890'`. + +**3.** Set the first `Row` class' `mainAxisAlignment` to `mainAxisAlignment.SpaceBetween`. + +{{site.alert.end}} + + ### Part 3 -## Conclusion +{:.no_toc} +{{site.alert.secondary}} +{{site.alert.end}} + + + +## Conclusion +{:.no_toc} From 1300ab7c38b15b7baf61a3a36d41251320d332a7 Mon Sep 17 00:00:00 2001 From: datafoya Date: Mon, 12 Aug 2019 10:52:28 -0700 Subject: [PATCH 08/18] adding Shams' edits --- src/docs/codelabs/extended-flex-widget.md | 578 +++++++++++++--------- 1 file changed, 350 insertions(+), 228 deletions(-) diff --git a/src/docs/codelabs/extended-flex-widget.md b/src/docs/codelabs/extended-flex-widget.md index 89203813c1..b86afb0223 100644 --- a/src/docs/codelabs/extended-flex-widget.md +++ b/src/docs/codelabs/extended-flex-widget.md @@ -4,98 +4,110 @@ description: "A codelab that teaches basic Flutter layout concepts through DartP toc: true --- {{site.alert.important}} - This codelab covers basic Flutter layout concepts using a browser-based code editor called DartPad. Currently, DartPad is in the experimental stage and has experienced issues on Safari. If you encounter any difficulties while using DartPad, please create a [DartPad issue](https://github.com/dart-lang/dart-pad/issues/new) and label the issue "platform-web." -{{site.alert.end}} -## Introduction + This codelab covers basic Flutter layout concepts using a code editor called DartPad. + DartPad is in an experimental stage and hasn't been fully tested on all browsers. If you encounter any difficulties while using DartPad on a specific browser, + please create a [DartPad issue](https://github.com/dart-lang/dart-pad/issues/new) and specify which browser you're using in the issue title. +{{site.alert.end}} -Flutter is different from other frameworks in that its UI is built from code, not an XML file (or similar). -Widgets are the basic building blocks of Flutter's UI. As you progress through this codelab, -you'll learn that almost everything in Flutter is a widget. A widget is an immutable object that describes a specific part of a UI. You'll also learn that Flutter's widgets are composable; meaning, -you can combine existing widgets to make more sophisticated widgets. For example, widgets can be built around and inside of other widgets, and widgets can have interconnected and ordered relationships with one another. -At the end of this codelab, you'll apply what you've learned to build an interface that uses Flutter's basic layout concepts. -## Row and Column classes -`Row` and `Column` are classes that contain and lay out widgets. These widgets are called "children," -and `Row` and `Column` are referred to as "parents." `Row` lays out its widgets *horizontally*, and -`Column` lays out its widgets *vertically*. +Welcome to the Flutter layout codelab, +where you learn to lay out a Flutter UI without downloading or installing Flutter and Dart! -#### Example: Create a Row -{:.no_toc} -{{site.alert.secondary}} -{:.no_toc} - The following code example displays three blue squares horizontally. +Flutter is different from other frameworks because its UI is built in code, +not (for example) in an XML file or similar. +Widgets are the basic building blocks of a Flutter UI. +As you progress through this codelab, +you'll learn that almost everything in Flutter is a widget. +A widget is an immutable object that describes a specific part of a UI. +You'll also learn that Flutter widgets are composable, meaning, +that you can combine existing widgets to make more sophisticated widgets. +At the end of this codelab, +you'll apply what you've learned into building a Flutter UI that displays a business card. - Click the **Run** button. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/26c8fb02c58c4120917b073ec6253953 -{% endcomment %} - +**Estimated time to complete this codelab: 45-60 minutes.** -#### Example: Create a Column +## Row and Column classes +`Row` and `Column` are classes that contain and lay out widgets. +Widgets inside of a `Row` or `Column` are called *children*, +and `Row` and `Column` are referred to as *parents*. +`Row` lays out its widgets horizontally, +and `Column` lays out its widgets vertically. + +#### Example: Creating a Column {:.no_toc} {{site.alert.secondary}} -{:.no_toc} - The following code example displays three blue squares vertically. +{:.no_toc} + The following example displays the differences between a `Row` and `Column`. - The difference between this example and the previous one is that `MyWidget` in the code below returns a `Column`. + **1.** Click the **Run** button. - Click the **Run** button. + **2.** In the code, change the `Row` to a `Column`, and run again. {{site.alert.end}} {% comment %} - Gist: https://gist.github.com/db96dc75c3283227bc849ba31d213783 + Gist: https://gist.github.com/4e11c4a7ec824685f963f25d7c30ba0b {% endcomment %} - + -## Alignment +## Axis size and alignment -So far, the blue boxes have been displayed close together (either to the left or at the top) of the UI Output. You can change their spacing using the following alignment properties. +So far, the blue boxes widgets have been squished together +(either to the left or at the top of the UI Output). +You can change how the blue boxes widgets are spaced using the size and alignment properties. ### mainAxisSize property -`Row` and `Column` occupy different main axes. `Row`\'s main axis is horizontal, and `Column`\'s main axis is vertical. -`mainAxisSize` is a property that determines how much space `Row` and `Column` can occupy on their main axes. +`Row` and `Column` occupy different main axes. +`Row`'s main axis is horizontal, +and `Column`'s main axis is vertical. +The `mainAxisSize` property determines how much space `Row` and `Column` can occupy on their main axes. `mainAxisSize` has two possible values: `MainAxisSize.max` -: Increases the amount of space `Row` and `Column` can occupy on their main axes. -`Row` and `Column` might have extra space. +: Increases the amount of space `Row` and `Column` can occupy on their main axes. +If the combined width of `Row` and `Column`'s child widgets is +less than the total space on `Row` and `Column`'s main axes, +the children are laid out with extra space. `MainAxisSize.min` : Decreases the amount of space `Row` and `Column` can occupy on their main axes. -`Row` and `Column` only have enough space for their children. +`Row` and `Column`'s children are laid out without extra space. {{site.alert.tip}} - `MainAxisSize.max` is a default value. Default values aren't required in the code, - as shown in the previous code examples. + `MainAxisSize.max` is the default value for the `mainAxisSize` property. + If you don't specify another value, + the default value is used, + as shown in the previous example. {{site.alert.end}} #### Example: Modify axis size {:.no_toc} {{site.alert.secondary}} {:.no_toc} - The following example explicitly sets the `mainAxisSize` property to `MainAxisSize.max`. + The following example explicitly sets `mainAxisSize` to its default value, `MainAxisSize.max`. **1.** Click the **Run** button. - **2.** Change the `mainAxisSize` property to `MainAxisSize.min`. - - **3.** Click the **Run** button. + **2.** Change the `mainAxisSize` property to `MainAxisSize.min`, and run again. {{site.alert.end}} {% comment %} - Gist: https://gist.github.com/def3c5c3c68459b5bb4bdfed58f5d024 + Gist: https://gist.github.com/d852e4f07d6c87600fe8e0f186c7a31b {% endcomment %} - + ### mainAxisAlignment property -When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` might have extra space on their main axes. -`mainAxisAlignment` is a property that determines how `Row` and `Column` can position their children in that extra space. `mainAxisAlignment` has six possible values: +When `mainAxisSize` is set to `MainAxisSize.max`, +`Row` and `Column` might lay out their children with extra space. +The `mainAxisAlignment` property determines how `Row` and `Column` +can position their children in that extra space. + `mainAxisAlignment` has six possible values: `MainAxisAlignment.start` -: Positions children near the beginning of the main axis. (Left for `Row`, top for `Column`) +: Positions children near the beginning of the main axis. +(Left for `Row`, top for `Column`) `MainAxisAlignment.end` -: Positions children near the end of the main axis. (Right for `Row`, bottom for `Column`) +: Positions children near the end of the main axis. +(Right for `Row`, bottom for `Column`) `MainAxisAlignment.center` : Positions children at the middle of the main axis. @@ -104,37 +116,39 @@ When `mainAxisSize` is set to `MainAxisSize.max`, `Row` and `Column` might have : Divides the extra space evenly between children. `MainAxisAlignment.spaceEvenly` -: Divides the extra space evenly between children and creates an even amount of space before the first child and after the last child. +: Divides the extra space evenly between children and before and after the children. `MainAxisAlignment.spaceAround` -: Similar to `MainAxisAlignment.spaceEvenly` but reduces half of the space before the first child and after the last child. +: Similar to `MainAxisAlignment.spaceEvenly`, +but reduces half of the space before the first child and after the last child +to half of the width between the children. -#### Example: mainAxisAlignment property +#### Example: Modify main axis alignment {:.no_toc} {{site.alert.secondary}} - The following example explicitly sets the `mainAxisAlignment` property to `MainAxisAlignment.start`. + The following example explicitly sets the `mainAxisAlignment` property to its default value, + `MainAxisAlignment.start`. **1.** Click the **Run** button. - **2.** Change the `mainAxisAlignment` property to `MainAxisAlignment.end`. - - **3.** Click the **Run** button. + **2.** Change `MainAxisAlignment.start` to `MainAxisAlignment.end`, and run again. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/cb8abed13f90a6a0c7a0ada6f15a09c9 {% endcomment %} - + {{site.alert.tip}} - Before moving to the next section, try changing `MainAxisAlignment.start` to one of the other values. + Before moving to the next section, change `MainAxisAlignment.end` to one of the other values. {{site.alert.end}} ### crossAxisAlignment property -Similar to the `mainAxisAlignment` property, -`crossAxisAlignment` is a property that determines how `Row` and `Column` can position their children in extra space. -The difference is that the `crossAxisAlignment` property determines how `Row` and `Column` can position their children in vertical space. Most of the `crossAxisAlignment` property's values only work with `Row`, -and the `crossAxisAlignment` property has five possible values: +The `crossAxisAlignment` property determines +how `Row` and `Column` can position their children on their cross axes. +A `Row`'s cross axis is vertical, and a `Column`'s cross axis is horizontal. +Most of the `crossAxisAlignment` property's values only work with `Row`. +`crossAxisAlignment` has five possible values: `CrossAxisAlignment.start` : Positions children near the top of the cross axis. (`Row` only) @@ -146,330 +160,438 @@ and the `crossAxisAlignment` property has five possible values: : Positions children at the middle of the cross axis. (`Row` only) `CrossAxisAlignment.stretch` -: Stretches children across the cross axis. (Top to bottom for `Row`, left to right for `Column`) +: Stretches children across the cross axis. +(Top-to-bottom for `Row`, left-to-right for `Column`) `CrossAxisAlignment.baseline` -: Aligns children by their character baselines. (`Text` class only) - -{{site.alert.tip}} - `CrossAxisAlignment.baseline` works with `Text` classes and requires the `textBaseline` property set to `TextBaseline.alphabetic`. See the [Text class](#text-class) section for an example of this value. -{{site.alert.end}} +: Aligns children by their character baselines. (`Text` class only, and requires that the `textBaseline` property is set to `TextBaseline.alphabetic`. See the [Text class](#text-class) section for an example.) -#### Example: crossAxisAlignment property +#### Example: Modify cross axis alignment {:.no_toc} {{site.alert.secondary}} - The following example explicitly sets the `crossAxisAlignnment` property to `CrossAxisAlignment.center`. - Also, notice how `Row` contains a `BiggerBlueBox` widget and the `mainAxisAlignment` property set to `MainAxisAlignment.spaceAround`. This widget and property help illustrate how the code displays the children in vertical space. + The following example explicitly sets the `crossAxisAlignment` property to its default value, + `CrossAxisAlignment.center`. - **1.** Click the **Run** button. + To demonstrate cross axis alignment, `Row` now contains a `BiggerBlueBox` widget + that is taller than the other widgets, and `mainAxisAlignment` is set to + `MainAxisAlignment.spaceAround`. - **2.** Change `CrossAxisAlignment.center` to `CrossAxisAlignment.start`. + **1.** Click the **Run** button. - **3.** Click the **Run** button. + **2.** Change `CrossAxisAlignment.center` to `CrossAxisAlignment.start`, and run again. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/70a6eb88f13019eec349a57bc4fd5fe0 {% endcomment %} - + {{site.alert.tip}} - Before moving to the next section, try changing `CrossAxisAlignment.center` to one of the other values. + Before moving to the next section, change `CrossAxisAlignment.start` to one of the other values. {{site.alert.end}} -## Flexible class +## Flexible widget -`mainAxisAlignment` and `crossAxisAlignment` are properties that determine how `Row` and `Column` can position widgets -in extra space. When `Row` and `Column` lay out widgets, they lay out widgets of a fixed size first. Widgets -of a fixed size are considered "inflexible" because they can't resize themselves after `Row` and `Column` lay them out. +As you've seen, the `mainAxisAlignment` and `crossAxisAlignment` properties determine +how `Row` and `Column` position widgets along both axes. +`Row` and `Column` first lay out widgets of a fixed size. +Fixed size widgets are considered *inflexible* because they can't resize +themselves after they've been laid out. -`Flexible` is a class that wraps around a widget, takes the widget as its child, and then resizes the widget. -When the `Flexible` class wraps around a widget, the widget is considered "flexible" because the widget can resize -itself. `Row` and `Column` lay out flexible widgets after they lay out inflexible widgets. Flexible widgets can resize themselves according to their `flex` and `fit` properties: +The `Flexible` widget wraps a widget, so the widget becomes resizable. +When the `Flexible` widget wraps a widget, the widget becomes the `Flexible` widget's child +and is considered *flexible*. +After inflexible widgets are laid out, +flexible widgets are resized according to their `flex` and `fit` properties.: `flex` -: Compares itself against other `flex` properties before determining what fraction of the total extra space each flexible widget receives. +: Compares itself against other `flex` properties before determining +what fraction of the total extra space each `Flexible` widget receives. `fit` -: Determines whether a flexible widget fills all of its extra space. +: Determines whether a `Flexible` widget fills all of its extra space. -#### Example: flex property +#### Example: Testing flex values {:.no_toc} {{site.alert.secondary}} - Notice how two `Flexible` classes wrap around two `BlueBox` widgets. Also, notice that the `Flexible` classes contain `flex` properties equal to 1. + In the following example, two `Flexible` widgets wrap two `BlueBox` widgets. + The `Flexible` widgets contain `flex` properties with values set to 1 (the default value). - When `flex` properties compare themselves against one another, they add up their `flex` values, and the sum of the `flex` values - determines what fraction of the total extra space each flexible widget receives. - - In this code example, the sum of both `flex` values (2) determines that each flexible widget receives half - of the extra space. + When `flex` properties are compared, + the ratio between the values determines + what fraction of the total extra space each `Flexible` widget receives. - Click the **Run** button. + In this example, the sum of the `flex` values (2), + determines that each `Flexible` widget increases + by half of the free space. + The fixed-width widget remains the same size. + + **1.** Click the **Run** button. {{site.alert.end}} {% comment %} - Gist: https://gist.github.com/datafoya/82e4dd24028034ae03ba0ddc71bf59e5 + Gist: https://gist.github.com/82e4dd24028034ae03ba0ddc71bf59e5 {% endcomment %} - + {{site.alert.tip}} - Before moving to the next code example, try changing the `flex` values. + Before moving to the next code example, change the `flex` properties to other values, + such as 2 and 1. {{site.alert.end}} -#### Example: fit property +#### Example: Testing fit properties {:.no_toc} {{site.alert.secondary}} - Notice how the `Flexible` classes contain `fit` properties set to `FlexFit.loose`. The `fit` property - has two `fit` values that help determine whether a flexible widget can occupy all of its extra space: + The following example displays the `fit` property, + which can have one of two values: `FlexFit.loose` - : Enables a flexible widget to occupy as much of or as little of its extra space. + : The widget's preferred size is used. (Default) `FlexFit.tight` - : Forces a flexible widget to fill of its extra space. + : Forces the widget to fill all of its extra space. - In this code example, the `fit` properties restrict the flexible widgets from filling all of their extra space. + In this example, modify the `fit` properties to + make the `Flexible` widgets fill the free space. **1.** Click the **Run** button. - **2.** Change the `fit` properties to `FlexFit.tight`. - - **3.** Click the **Run** button. + **2.** Change the `fit` values to `FlexFit.tight`, + and run again. {{site.alert.end}} - +{% comment %} + Gist: https://gist.github.com/ba0f40356d1023066d960f6de2be1a4b +{% endcomment %} + ## Expanded widget -Similar to the `Flexible` class, `Expanded` is a class that can wrap around a widget and take the widget as its child. -However, the `Expanded` class forces its widget to fill extra space. +Similar to the `Flexible` widget, the `Expanded` widget can wrap a widget and force the widget to fill extra space. -#### Example: Expanded widget +{{site.alert.tip}} + **What's the difference between Flexible and Expanded?** + Use `Flexible` to resize widgets in a `Row` or `Column`, + so you can adjust child widgets' spacing while keeping the + relation with their parent widget. + `Expanded` changes the constraints of the child widgets + to fill any empty space. +{{site.alert.end}} + +#### Example: Filling extra space {:.no_toc} {{site.alert.secondary}} - The `Expanded` class wraps around a widget in the exact same way that the `Flexible` class does. Except, - the `Expanded` class doesn't require `flex` and `fit` properties. + The following example demonstrates how the `Expanded` widget forces its child widget to fill extra space. **1.** Click the **Run** button. - **2.** Wrap the second BlueBox widget in an `Expanded` class. - - **3.** Click the **Run** button. -{{site.alert.end}} - + **2.** Wrap the second `BlueBox` widget in an `Expanded` widget. -## SizedBox widget + For example: -Similar to the `Flexible` and `Expanded` classes, `SizedBox` is a class that can wrap around a widget, -take the widget as its child, and then resize the widget. However, the `SizedBox` class also can create space between widgets. Instead of using `flex` and `fit` properties, the `SizedBox` class uses `width` and `height` properties. + ```dart + Expanded(child: BlueBox(),), + ``` + **3.** Select the **Format** button, and run again. -{{site.alert.tip}} - When the `SizedBox` class creates space between widgets, it doesn't take a child widget. - It also only uses `width` properties when it's inside of `Row` and `height` properties when it's inside of `Column`. {{site.alert.end}} -#### Example: SizedBox with a child +{% comment %} + Gist: https://gist.github.com/77021d2ed15f9ece850de15e73c47526 +{% endcomment %} + + +## SizedBox widget + +The `SizedBox` widget can be used in one of two ways. +When `SizedBox` wraps a widget, +it resizes the widget using the `height` and `width` properties. +When it doesn't wrap a widget, +it uses the `height` and `width` properties to create empty space. +#### Example: Resizing a widget {:.no_toc} {{site.alert.secondary}} - Notice how `Row` contains two `BlueBox` widgets and one `SizedBox` class that class wraps around a `BlueBox` widget. - Also, notice how the `SizedBox` class contains a `width` property equal to 100. + The following example wraps the middle `BlueBox` widget inside of a + `SizedBox` widget and sets the `BlueBox`'s width to 100 logical pixels. **1.** Click the **Run** button. - **2.** Add a height property equal to 100 inside the `SizedBox` class. - - **3.** Click the **Run** button. + **2.** Add a `height` property equal to 100 logical pixels inside the `SizedBox` widget, and run again. {{site.alert.end}} {% comment %} - Gist: https://gist.github.com/datafoya/6582851e85b57180ff5321f814fabb81 + Gist: https://gist.github.com/6582851e85b57180ff5321f814fabb81 {% endcomment %} - + -#### Example: SizedBox without a child +#### Example: Creating space {:.no_toc} {{site.alert.secondary}} - Notice how `Row` contains three `BlueBox` widgets and one `SizedBox` class that separates the first and second `BlueBox` widgets. - Also, notice how the `SizedBox` class contains a `width` property equal to 50. + The following example contains three `BlueBox` widgets and one `SizedBox` widget that separates the first and second `BlueBox` widgets. The `SizedBox` widget contains a `width` property equal to 50 logical pixels. **1.** Click the **Run** button. - **2.** Add another `SizedBox` class between the second and third `BlueBox` widgets. - - **3.** Inside the `SizedBox` class, add a `width` property equal to 25. - - **4.** Click the **Run** button. + **2.** Create more space by adding another `SizedBox` widget (25 logical pixels wide) + between the second and third `BlueBox` widgets, and run again. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/19ead147ab5c7668d7d32e1cfed90097 {% endcomment %} - + ## Spacer widget -Similar to the `SizedBox` class, `Spacer` is a class that creates space between widgets. However, -the `Spacer` class can't take child widgets and doesn't create space at exact dimensions. Instead, -the `Spacer` class creates space using the `flex` property. +Similar to the `SizedBox` widget, the `Spacer` widget also can create space between widgets. + +{{site.alert.tip}} + **What's the difference between SizedBox and Spacer?** + Use `Spacer` when you want to create space using a `flex` property. + Use `SizedBox` when you want to create space + using a specific number of logical pixels. +{{site.alert.end}} -#### Example: Spacer widget +#### Example: Creating more space {:.no_toc} {{site.alert.secondary}} - Notice how `Row` contains three `BlueBox` widgets and one `Spacer` class that separates the first and second `BlueBox` widgets. Also, notice how the `Spacer` class separates the first and second `BlueBox` widgets. + The following example separates the first two `BlueBox` widgets using + a `Spacer` widget with a `flex` value of 1. **1.** Click the **Run** button. - **2.** Add another `Spacer` class between the second and third `BlueBox` widgets. - - **3.** Inside the `Spacer` class, add another `flex` property equal to 1. - - **4.** Click the **Run** button. + **2.** Add another `Spacer` widget (also with a `flex` value of 1) + between the second and third `BlueBox` widgets. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/bfc367aefde35e02ea5283efdbf58e60 {% endcomment %} - + ## Text widget -`Text` is a class that displays a string of text. -The `Text` class can display text at different font sizes and in different fonts and colors. +The `Text` widget displays text and can be configured +for different fonts, sizes, and colors. -#### Example: Text widget +#### Example: Aligning text {:.no_toc} {{site.alert.secondary}} - Notice how `Row` contains three `Text` classes, which display "Hey!" in the same font but at different font sizes and in different colors. - Also, notice that `Row` contains the `crossAxisAlignment` property and the `textBaseline` property. + The following example displays "Hey!" three times in one row, + but at different font sizes and in different colors. + `Row` specifies the `crossAxisAlignment` and `textBaseline` properties. - Earlier in this codelab, you learn that `CrossAxisAlignment.baseline` aligns `Text` classes by their character baselines when your code - contains the `textBaseline` property set to `TextBaseline.alphabetic`. + As mentioned previously, to align `Text` widgets along their character baselines, + set the `textBaseline` property to `TextBaseline.alphabetic`. **1.** Click the **Run** button. - **2.** Change the `crossAxisAlignment` property to `CrossAxisAlignment.baseline`. - - **3.** Click the **Run** button. + **2.** Change `CrossAxisAlignment.center` to `CrossAxisAlignment.baseline`, and run again. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/0ff109090b99ef1873d9fad501b2bc86 {% endcomment %} - + ## Icon widget -`Icon` is a class that displays symbols. Flutter is preloaded with icon packages for Android and iOS applications. +The `Icon` widget displays a graphical symbol, +which represents an aspect of the UI. +Flutter is preloaded with icon packages for +[Material](https://api.flutter.dev/flutter/material/MaterialApp-class.html) and +[Cupertino](https://api.flutter.dev/flutter/cupertino/CupertinoApp-class.html) applications. -#### Example: Icon widget +#### Example: Create an Icon widget {:.no_toc} {{site.alert.secondary}} - Notice how `Row` contains two `Icon` classes that display widget icons at the same size. Also, - notice how the `Icon` classes contain different color properties. + The following example displays the widget icon from the + [Material Icon library](https://api.flutter.dev/flutter/material/Icons-class.html) in red and blue. **1.** Click the **Run** button. - **2.** Add another widget icon below the red widget icon. + **2.** Add another `Icon` widget from the + [Material Icon library](https://api.flutter.dev/flutter/material/Icons-class.html) + with a size of 50. - **3.** Enter a `size` property equal to 50. - - **4.** Enter a `color` property set to `Colors.amber`. - - **3.** Click the **Run** button. + **3.** Give the icon a color of `Color.amber` from the + [Material Color palette](https://api.flutter.dev/flutter/material/Colors-class.html), + and run again. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/01688fca8c13f85d93078054af2e858b {% endcomment %} - + ## Image widget -`Image` is a class that links to and displays an image. Unlike the widgets previously covered in this codelab, -the `Image` class references its data, which is stored remotely. +The `Image` widget displays an image. You either can reference images using a URL, +or you can include images inside your app package. Since DartPad can't package an image, +the following example uses an image from the network. #### Example: Image widget {:.no_toc} {{site.alert.secondary}} - `Row` contains an `Image` class. Notice how the `Image` class references its image. - The `Image` class initiates its link with `.Network` followed by parentheses. Then, inside the parentheses, - the `Image` class links to its image. + The following example displays an image using `Image`. + The `Image.network` method takes a string parameter that contains the image's URL. - In this code example, the code displays an image that's stored remotely on [GitHub](https://github.com/flutter/website/tree/master/examples/layout/sizing/images). + This example displays an image that's stored remotely on [GitHub](https://github.com/flutter/website/tree/master/examples/layout/sizing/images). - Click the **Run** button. + **1.** Click the **Run** button. {{site.alert.end}} ## Putting it all together -{:.no_toc} -In this section of the codelab, you'll apply techniques that you've learned and build a UI that displays a business card. +You've almost reached the end of this codelab. +Why not test your knowledge by applying the techniques +you've learned to build a UI that displays a business card! -### Part 1 -{:.no_toc} +You'll break down the layout into parts, which is how you'd +create a UI in the real world. This exercise can be broken +into three parts. In part 1, +you'll implement a `Column` containing a name, title, and icon. +In part 2, you'll wrap the `Column` in a `Row`, tweak the layout to look nice, +and add contact information. In part 3, +you'll add another `Row` containing an address. -This part contains two examples. In the first part, you build a `Column` that displays a name and business title. In the second part, you wrap the `Column` that you create in a `Row` that displays the name, business title, and business icon. - -#### Example: Name and business title +### Part 1 {:.no_toc} -{{site.alert.secondary}} - - To complete this example, you need to build a `Column` that contains the following classes. - * Two `Text` classes. +This part contains two examples. +In the first example, you'll build a `Column`, +which contains a name and title. +In the second example, you'll wrap your `Column` in a `Row`, +which contains an icon. +By the end of Part 1, +your code displays a name, business title, and business icon. - One `Text` class that contains the name "Flutter McFlutter" and a `style` property set to `Theme.of(context).textTheme.headline`. - - Another `Text` class that contains the title "Experienced Developer." - - * A `mainAxisSize` property set to `MainAxisSize.min` - * A `crossAxisAlignment` property set to `CrossAxisAlignment.start`. -{{site.alert.end}} - - -#### Example: Business icon +#### Example: Create the name and title {:.no_toc} {{site.alert.secondary}} - To complete this example, you need to wrap the `Column` you created in a `Row` that contains the following classes. - - * An `Icon` class set to `Icons.account_circle` and that contains a `size` property set to 50. - * A `Padding` widget that wraps around the `Icon` class. The `Padding` widget also contains a `padding` constraint set to `const EdgeInsets.all(8.0)`. + Build a `Column` that contains the following widgets: + +
    +
  • + One Text widget that contains the name "Flutter McFlutter" and + the `style` property set to `Theme.of(context).textTheme.headline`. +
  • +
  • + A second `Text` widget that contains the business title "Experienced Developer." + + For your Column, set the: +
  • + +
  • `mainAxisSize` property to `MainAxisSize.min` +
  • +
  • `crossAxisAlignment` property to `CrossAxisAlignment.start`. +
  • +
+ {{site.alert.end}} - + -### Part 2 +#### Exercise: Wrap the Column in a Row {:.no_toc} - -#### Example: Contact information 1 {{site.alert.secondary}} - To complete this example, you need to wrap the `Row` you created in a `Column` that contains the following classes. - - **1.** A `mainAxisSize` property set to `MainAxisSize.min`. - **3.** A `crossAxisAlignment` property set to `CrossAxisAlignment.stretch`. + Wrap your `Column` in a `Row` that contains the following widgets: - **4.** A `SizedBox` class with a height property equal to 8. +
    +
  • + An `Icon` widget set to `Icons.account_circle` with a size of 50 pixels. +
  • +
  • + A `Padding` widget that creates a space of 8 pixels around the `Icon` widget. - **5.** An empty `Row` class. + To do this, you can specify `const EdgeInsets.all(8.0)` for the padding property. - **6.** Another `SizedBox` class with a height property equal to 16. + For example: +
  • +
- **7.** Another empty `Row` class. + ```dart + Padding( + padding: const EdgeInsets.all(8.0), + child: Icon(Icons.account_circle, size: 50)), + ``` {{site.alert.end}} + - +### Part 2 +{:.no_toc} -#### Example: Contact information 2 +This part also contains two examples, both focusing on contact information. +In the first example, you'll wrap the `Row` you built in a `Column`, +so you can create space for the contact information. +In the second example, you'll enter the contact information. +At the end of Part 2, your code will contain a `Column` within a `Row` within a `Column`. +#### Exercise: Tweak the layout +{:.no_toc} {{site.alert.secondary}} + + Wrap your `Row` inside a `Column` that contains the following widgets: + +
    +
  • + A `mainAxisSize` property set to `MainAxisSize.min`. +
  • +
  • + A `crossAxisAlignment` property set to `CrossAxisAlignment.stretch`. +
  • +
  • + A `SizedBox` widget with a height of 8. +
  • +
  • + An empty `Row` class where you'll add your contact information. +
  • +
  • + A second `SizedBox` widget with a height of 16. +
  • +
  • + A second empty `Row` class where you'll add different icons (covered in [Part 3](#part-3)). +
  • +
+ + Your `SizedBox` widgets and empty `Row` classes should be formatted like this: + + ```dart + + ], + ), + SizedBox(), + Row(), // First empty Row class. + SizedBox(), + Row(), // Second empty Row class. + ], + ); + + ``` +{{site.alert.end}} -**1.** In the first `Row` class' list of children, add a `Text` class that contains the address `'123 Main Street'`. - -**2.** In the second `Row` class' list of children, add a `Text` class that contain the phone number `'123-456-7890'`. - -**3.** Set the first `Row` class' `mainAxisAlignment` to `mainAxisAlignment.SpaceBetween`. + +#### Example: Enter contact information +{:.no_toc} +{{site.alert.secondary}} + Enter the following widgets inside the first empty `Row` class: + +
    +
  • + A `Text` widget that contains the address "123 Main Street." +
  • +
  • + A second `Text` widget that contains the phone number "123-456-7890." +
  • +
  • + A `mainAxisAlignment` property set to `mainAxisAlignment.SpaceBetween`. +
  • +
{{site.alert.end}} - + ### Part 3 {:.no_toc} +This part contains one example where you finish your business card display. You'll add four `Icon` widgets to the second empty `Row` class that you built in Part 2. + {{site.alert.secondary}} + Enter the following `Icon` widgets in the second empty `Row` class. + * `Icons.accessibility` + * `Icons.timer` + * `Icons.phone_android` + * `Icons.phone_iphone` {{site.alert.end}} - - -## Conclusion -{:.no_toc} + \ No newline at end of file From 9dcd0967f77a9158ea526368b283786cdb7b10ca Mon Sep 17 00:00:00 2001 From: datafoya Date: Fri, 16 Aug 2019 12:00:15 -0700 Subject: [PATCH 09/18] stashing edits --- src/docs/codelabs/extended-flex-widget.md | 172 ++++++++++++---------- 1 file changed, 92 insertions(+), 80 deletions(-) diff --git a/src/docs/codelabs/extended-flex-widget.md b/src/docs/codelabs/extended-flex-widget.md index b86afb0223..641d1f453a 100644 --- a/src/docs/codelabs/extended-flex-widget.md +++ b/src/docs/codelabs/extended-flex-widget.md @@ -1,26 +1,26 @@ --- title: "Basic Flutter layout concepts" -description: "A codelab that teaches basic Flutter layout concepts through DartPad2 code examples." +description: "A codelab that teaches basic Flutter layout concepts through DartPad examples and exercises." toc: true --- +Welcome to the Flutter layout codelab, +where you learn how to lay out a Flutter UI without downloading or installing Flutter and Dart! + {{site.alert.important}} This codelab covers basic Flutter layout concepts using a code editor called DartPad. DartPad is in an experimental stage and hasn't been fully tested on all browsers. If you encounter any difficulties while using DartPad on a specific browser, please create a [DartPad issue](https://github.com/dart-lang/dart-pad/issues/new) and specify which browser you're using in the issue title. {{site.alert.end}} -Welcome to the Flutter layout codelab, -where you learn to lay out a Flutter UI without downloading or installing Flutter and Dart! - Flutter is different from other frameworks because its UI is built in code, -not (for example) in an XML file or similar. -Widgets are the basic building blocks of a Flutter UI. -As you progress through this codelab, -you'll learn that almost everything in Flutter is a widget. -A widget is an immutable object that describes a specific part of a UI. -You'll also learn that Flutter widgets are composable, meaning, -that you can combine existing widgets to make more sophisticated widgets. -At the end of this codelab, +not (for example) in an XML file or similar. +Widgets are the basic building blocks of a Flutter UI. +As you progress through this codelab, +you'll learn that almost everything in Flutter is a widget. +A widget is an immutable object that describes a specific part of a UI. +You'll also learn that Flutter widgets are composable, meaning, +that you can combine existing widgets to make more sophisticated widgets. +At the end of this codelab, you'll apply what you've learned into building a Flutter UI that displays a business card. **Estimated time to complete this codelab: 45-60 minutes.** @@ -49,9 +49,9 @@ and `Column` lays out its widgets vertically. ## Axis size and alignment -So far, the blue boxes widgets have been squished together +So far, the `BlueBox` widgets have been squished together (either to the left or at the top of the UI Output). -You can change how the blue boxes widgets are spaced using the size and alignment properties. +You can change how the `BlueBox` widgets are spaced out using the `mainAxisSize` and `CrossAxisAlignment` properties. ### mainAxisSize property @@ -72,12 +72,12 @@ the children are laid out with extra space. `Row` and `Column`'s children are laid out without extra space. {{site.alert.tip}} - `MainAxisSize.max` is the default value for the `mainAxisSize` property. + `MainAxisSize.max` is the `mainAxisSize` property's default. If you don't specify another value, the default value is used, as shown in the previous example. {{site.alert.end}} -#### Example: Modify axis size +#### Example: Modifying axis size {:.no_toc} {{site.alert.secondary}} {:.no_toc} @@ -86,7 +86,7 @@ the children are laid out with extra space. **1.** Click the **Run** button. - **2.** Change the `mainAxisSize` property to `MainAxisSize.min`, and run again. + **2.** Change the `MainAxisSize.max` to `MainAxisSize.min`, and run again. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/d852e4f07d6c87600fe8e0f186c7a31b @@ -139,7 +139,7 @@ to half of the width between the children. {% endcomment %} {{site.alert.tip}} - Before moving to the next section, change `MainAxisAlignment.end` to one of the other values. + Before moving to the next section, change `MainAxisAlignment.end` to another value. {{site.alert.end}} ### crossAxisAlignment property @@ -185,7 +185,7 @@ Most of the `crossAxisAlignment` property's values only work with `Row`. {% endcomment %} {{site.alert.tip}} - Before moving to the next section, change `CrossAxisAlignment.start` to one of the other values. + Before moving to the next section, change `CrossAxisAlignment.start` to another value. {{site.alert.end}} ## Flexible widget @@ -225,6 +225,8 @@ what fraction of the total extra space each `Flexible` widget receives. The fixed-width widget remains the same size. **1.** Click the **Run** button. + + **2.** Change the width of the UI by dragging the divider between the code and the UI. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/82e4dd24028034ae03ba0ddc71bf59e5 @@ -367,12 +369,9 @@ for different fonts, sizes, and colors. #### Example: Aligning text {:.no_toc} {{site.alert.secondary}} - The following example displays "Hey!" three times in one row, + The following example displays "Hey!" three times, but at different font sizes and in different colors. - `Row` specifies the `crossAxisAlignment` and `textBaseline` properties. - - As mentioned previously, to align `Text` widgets along their character baselines, - set the `textBaseline` property to `TextBaseline.alphabetic`. + `Row` specifies the `crossAxisAlignment` and `textBaseline` properties. **1.** Click the **Run** button. @@ -385,8 +384,8 @@ for different fonts, sizes, and colors. ## Icon widget -The `Icon` widget displays a graphical symbol, -which represents an aspect of the UI. +The `Icon` widget displays a graphical symbol +that represents an aspect of the UI. Flutter is preloaded with icon packages for [Material](https://api.flutter.dev/flutter/material/MaterialApp-class.html) and [Cupertino](https://api.flutter.dev/flutter/cupertino/CupertinoApp-class.html) applications. @@ -426,8 +425,13 @@ the following example uses an image from the network. This example displays an image that's stored remotely on [GitHub](https://github.com/flutter/website/tree/master/examples/layout/sizing/images). - **1.** Click the **Run** button. + **1.** Click the **Run** button. + + **2.** Change the width of the UI by dragging the divider between the code and the UI. {{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/b6f3084800bd139cdb522b8858bb58b7 +{% endcomment %} ## Putting it all together @@ -437,21 +441,22 @@ Why not test your knowledge by applying the techniques you've learned to build a UI that displays a business card! You'll break down the layout into parts, which is how you'd -create a UI in the real world. This exercise can be broken -into three parts. In part 1, -you'll implement a `Column` containing a name, title, and icon. +create a UI in the real world. In part 1, +you'll implement a `Column` that contains a name, title, and icon. + In part 2, you'll wrap the `Column` in a `Row`, tweak the layout to look nice, -and add contact information. In part 3, -you'll add another `Row` containing an address. +and add contact information. + +In part 3, +you'll add another `Row` containing four icons. ### Part 1 {:.no_toc} This part contains two examples. -In the first example, you'll build a `Column`, -which contains a name and title. -In the second example, you'll wrap your `Column` in a `Row`, -which contains an icon. +In the first example, you'll build a `Column` +that contains a name and title. +In the second example, you'll wrap your `Column` in a `Row` that contains an icon. By the end of Part 1, your code displays a name, business title, and business icon. @@ -463,22 +468,19 @@ your code displays a name, business title, and business icon.
  • - One Text widget that contains the name "Flutter McFlutter" and + One Text widget that contains the name `Flutter McFlutter` and the `style` property set to `Theme.of(context).textTheme.headline`.
  • - A second `Text` widget that contains the business title "Experienced Developer." - - For your Column, set the: -
  • - -
  • `mainAxisSize` property to `MainAxisSize.min` -
  • -
  • `crossAxisAlignment` property to `CrossAxisAlignment.start`. + A second `Text` widget that contains the business title `Experienced Developer`.
- + + For your `Column`, set the `mainAxisSize` property to `MainAxisSize.min` and `crossAxisAlignment` property to `CrossAxisAlignment.start`. {{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/30ccbe0fcf31cc10eafba3aea8ff0697 +{% endcomment %} #### Exercise: Wrap the Column in a Row @@ -507,6 +509,9 @@ your code displays a name, business title, and business icon. child: Icon(Icons.account_circle, size: 50)), ``` {{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/95dcc1451aea8412669c41eb8a1a5f23 +{% endcomment %} ### Part 2 @@ -522,76 +527,83 @@ At the end of Part 2, your code will contain a `Column` within a `Row` within a {:.no_toc} {{site.alert.secondary}} - Wrap your `Row` inside a `Column` that contains the following widgets: + Wrap your `Row` inside a `Column` that has a `mainAxisSize` property set to `MainAxisSize.min` + and a `crossAxisAlignment` property set to `CrossAxisAlignment.stretch`. + Your `Column` also should contain the following widgets: -
    -
  • - A `mainAxisSize` property set to `MainAxisSize.min`. -
  • -
  • - A `crossAxisAlignment` property set to `CrossAxisAlignment.stretch`. -
  • -
  • - A `SizedBox` widget with a height of 8. -
  • -
  • - An empty `Row` class where you'll add your contact information. -
  • -
  • - A second `SizedBox` widget with a height of 16. -
  • -
  • - A second empty `Row` class where you'll add different icons (covered in [Part 3](#part-3)). -
  • -
+ * A `SizedBox` widget with a height of 8. + + * An empty `Row` where you'll add contact information. - Your `SizedBox` widgets and empty `Row` classes should be formatted like this: + * A second `SizedBox` widget with a height of 16. + + * A second empty `Row` where you'll add different icons (covered in [Part 3](#part-3)). + + Your `SizedBox` widgets and empty `Row`s should be formatted like this: ```dart ], ), SizedBox(), - Row(), // First empty Row class. + Row(), // First empty Row. SizedBox(), - Row(), // Second empty Row class. + Row(), // Second empty Row. ], ); ``` -{{site.alert.end}} +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/c3ac34ed8952724a0ecb0af1445c2af8 +{% endcomment %} #### Example: Enter contact information {:.no_toc} {{site.alert.secondary}} - Enter the following widgets inside the first empty `Row` class: + Enter two `Text` widgets inside the first empty `Row` :
  • - A `Text` widget that contains the address "123 Main Street." + The first `Text` widget contains the address `123 Main Street`.
  • - A second `Text` widget that contains the phone number "123-456-7890." -
  • -
  • - A `mainAxisAlignment` property set to `mainAxisAlignment.SpaceBetween`. + The second `Text` widget contains the phone number `(415) 555-0198`.
+ + For the first empty `Row`, + set the `mainAxisAlignment` property to `MainAxisAlignment.SpaceBetween`. + {{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/c5be61116652927c5d92262fce1b5360 +{% endcomment %} ### Part 3 {:.no_toc} -This part contains one example where you finish your business card display. You'll add four `Icon` widgets to the second empty `Row` class that you built in Part 2. +This part contains one example, +where you'll finish your business card display. +You'll add four `Icon` widgets to the second empty `Row` +that you built in Part 2. {{site.alert.secondary}} - Enter the following `Icon` widgets in the second empty `Row` class. + Enter the following `Icon` widgets in the second empty `Row`: + * `Icons.accessibility` * `Icons.timer` * `Icons.phone_android` * `Icons.phone_iphone` + + For the second empty `Row`, + set the `mainAxisAlignment` property to `MainAxisAlignment.spaceAround`. {{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/dae36611fc9af04c4b9d0fbc3429275e +{% endcomment %} + - \ No newline at end of file +Congratulations! You finished the Flutter layout codelab. \ No newline at end of file From 028db82695667188407471a8cfeff35125ae073b Mon Sep 17 00:00:00 2001 From: datafoya Date: Sun, 18 Aug 2019 18:14:28 -0700 Subject: [PATCH 10/18] adding kathy's changes --- src/docs/codelabs/extended-flex-widget.md | 296 ++++++++++++---------- 1 file changed, 162 insertions(+), 134 deletions(-) diff --git a/src/docs/codelabs/extended-flex-widget.md b/src/docs/codelabs/extended-flex-widget.md index 641d1f453a..26c1cc8ad3 100644 --- a/src/docs/codelabs/extended-flex-widget.md +++ b/src/docs/codelabs/extended-flex-widget.md @@ -4,12 +4,14 @@ description: "A codelab that teaches basic Flutter layout concepts through DartP toc: true --- Welcome to the Flutter layout codelab, -where you learn how to lay out a Flutter UI without downloading or installing Flutter and Dart! +where you learn how to build a Flutter UI without downloading and installing Flutter or Dart! {{site.alert.important}} - This codelab covers basic Flutter layout concepts using a code editor called DartPad. - DartPad is in an experimental stage and hasn't been fully tested on all browsers. If you encounter any difficulties while using DartPad on a specific browser, - please create a [DartPad issue](https://github.com/dart-lang/dart-pad/issues/new) and specify which browser you're using in the issue title. + This codelab covers basic Flutter layout concepts using an experimental code editor called DartPad. + DartPad hasn't been fully tested on all browsers. + If you experience any difficulties while using DartPad on a specific browser, + please create a [DartPad issue](https://github.com/dart-lang/dart-pad/issues/new) + and specify which browser you're using in the issue title. {{site.alert.end}} Flutter is different from other frameworks because its UI is built in code, @@ -21,7 +23,8 @@ A widget is an immutable object that describes a specific part of a UI. You'll also learn that Flutter widgets are composable, meaning, that you can combine existing widgets to make more sophisticated widgets. At the end of this codelab, -you'll apply what you've learned into building a Flutter UI that displays a business card. +you'll get to apply what you've learned +into building a Flutter UI that displays a business card. **Estimated time to complete this codelab: 45-60 minutes.** @@ -51,28 +54,29 @@ and `Column` lays out its widgets vertically. So far, the `BlueBox` widgets have been squished together (either to the left or at the top of the UI Output). -You can change how the `BlueBox` widgets are spaced out using the `mainAxisSize` and `CrossAxisAlignment` properties. +You can change how the `BlueBox` widgets are spaced out using the axis size and alignment properties. ### mainAxisSize property `Row` and `Column` occupy different main axes. -`Row`'s main axis is horizontal, -and `Column`'s main axis is vertical. -The `mainAxisSize` property determines how much space `Row` and `Column` can occupy on their main axes. +A `Row`'s main axis is horizontal, +and a `Column`'s main axis is vertical. +The `mainAxisSize` property determines how much space a `Row` and `Column` can occupy on their main axes. `mainAxisSize` has two possible values: `MainAxisSize.max` -: Increases the amount of space `Row` and `Column` can occupy on their main axes. -If the combined width of `Row` and `Column`'s child widgets is -less than the total space on `Row` and `Column`'s main axes, -the children are laid out with extra space. +: `Row` and `Column` occupy all of the space on their main axes. +If the combined width of their children is +less than the total space on their main axes, +their children are laid out with extra space. `MainAxisSize.min` -: Decreases the amount of space `Row` and `Column` can occupy on their main axes. -`Row` and `Column`'s children are laid out without extra space. +: `Row` and `Column` only occupy enough space on their main axes +for their children. Their children are laid out without extra space +and at the middle of their main axes. {{site.alert.tip}} - `MainAxisSize.max` is the `mainAxisSize` property's default. + `MainAxisSize.max` is the `mainAxisSize` property's default value. If you don't specify another value, the default value is used, as shown in the previous example. @@ -86,7 +90,7 @@ the children are laid out with extra space. **1.** Click the **Run** button. - **2.** Change the `MainAxisSize.max` to `MainAxisSize.min`, and run again. + **2.** Change `MainAxisSize.max` to `MainAxisSize.min`, and run again. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/d852e4f07d6c87600fe8e0f186c7a31b @@ -123,11 +127,11 @@ can position their children in that extra space. but reduces half of the space before the first child and after the last child to half of the width between the children. -#### Example: Modify main axis alignment +#### Example: Modifying main axis alignment {:.no_toc} {{site.alert.secondary}} - The following example explicitly sets the `mainAxisAlignment` property to its default value, + The following example explicitly sets `mainAxisAlignment` to its default value, `MainAxisAlignment.start`. **1.** Click the **Run** button. @@ -147,7 +151,7 @@ to half of the width between the children. The `crossAxisAlignment` property determines how `Row` and `Column` can position their children on their cross axes. A `Row`'s cross axis is vertical, and a `Column`'s cross axis is horizontal. -Most of the `crossAxisAlignment` property's values only work with `Row`. +Most of the `crossAxisAlignment` property's values only work with the `Row` class. `crossAxisAlignment` has five possible values: `CrossAxisAlignment.start` @@ -166,15 +170,15 @@ Most of the `crossAxisAlignment` property's values only work with `Row`. `CrossAxisAlignment.baseline` : Aligns children by their character baselines. (`Text` class only, and requires that the `textBaseline` property is set to `TextBaseline.alphabetic`. See the [Text class](#text-class) section for an example.) -#### Example: Modify cross axis alignment +#### Example: Modifying cross axis alignment {:.no_toc} {{site.alert.secondary}} - The following example explicitly sets the `crossAxisAlignment` property to its default value, + The following example explicitly sets `crossAxisAlignment` to its default value, `CrossAxisAlignment.center`. - To demonstrate cross axis alignment, `Row` now contains a `BiggerBlueBox` widget - that is taller than the other widgets, and `mainAxisAlignment` is set to - `MainAxisAlignment.spaceAround`. + To demonstrate cross axis alignment, `mainAxisAlignment` is set to + `MainAxisAlignment.spaceAround`, and `Row` now contains a `BiggerBlueBox` widget + that is taller than the `BlueBox` widgets. **1.** Click the **Run** button. @@ -200,47 +204,19 @@ The `Flexible` widget wraps a widget, so the widget becomes resizable. When the `Flexible` widget wraps a widget, the widget becomes the `Flexible` widget's child and is considered *flexible*. After inflexible widgets are laid out, -flexible widgets are resized according to their `flex` and `fit` properties.: +the widgets are resized according to their `flex` and `fit` properties.: `flex` : Compares itself against other `flex` properties before determining -what fraction of the total extra space each `Flexible` widget receives. +what fraction of the total remaining space each `Flexible` widget receives. `fit` : Determines whether a `Flexible` widget fills all of its extra space. -#### Example: Testing flex values -{:.no_toc} -{{site.alert.secondary}} - In the following example, two `Flexible` widgets wrap two `BlueBox` widgets. - The `Flexible` widgets contain `flex` properties with values set to 1 (the default value). - - When `flex` properties are compared, - the ratio between the values determines - what fraction of the total extra space each `Flexible` widget receives. - - In this example, the sum of the `flex` values (2), - determines that each `Flexible` widget increases - by half of the free space. - The fixed-width widget remains the same size. - - **1.** Click the **Run** button. - - **2.** Change the width of the UI by dragging the divider between the code and the UI. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/82e4dd24028034ae03ba0ddc71bf59e5 -{% endcomment %} - -{{site.alert.tip}} - Before moving to the next code example, change the `flex` properties to other values, - such as 2 and 1. -{{site.alert.end}} - -#### Example: Testing fit properties +#### Example: Changing fit properties {:.no_toc} {{site.alert.secondary}} - The following example displays the `fit` property, + The following example demonstrates the `fit` property, which can have one of two values: `FlexFit.loose` @@ -249,12 +225,12 @@ what fraction of the total extra space each `Flexible` widget receives. `FlexFit.tight` : Forces the widget to fill all of its extra space. - In this example, modify the `fit` properties to - make the `Flexible` widgets fill the free space. + In this example, change the `fit` properties to + make the `Flexible` widgets fill the extra space. **1.** Click the **Run** button. - **2.** Change the `fit` values to `FlexFit.tight`, + **2.** Change both `fit` values to `FlexFit.tight`, and run again. {{site.alert.end}} {% comment %} @@ -262,17 +238,46 @@ what fraction of the total extra space each `Flexible` widget receives. {% endcomment %} +#### Example: Testing flex values +{:.no_toc} +{{site.alert.secondary}} + In the following example, `Row` contains one `BlueBox` widget + and two `Flexible` widgets that wrap two `BlueBox` widgets. + The `Flexible` widgets contain `flex` properties with `flex` values set to 1 (the default value). + + When `flex` properties are compared against one another, + the ratio between their `flex` values determines + what fraction of the total remaining space each `Flexible` widget receives. + + ```dart + remainingSpace * (flex / totalOfAllFlexValues) + ``` + + In this example, the sum of the `flex` values (2), + determines that both `Flexible` widgets receive + half of the total remaining space. + The `BlueBox` widget (or fixed-size widget) remains the same size. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/82e4dd24028034ae03ba0ddc71bf59e5 +{% endcomment %} + +{{site.alert.tip}} + Before moving to the next example, try changing the `flex` properties to other values, + such as 2 and 1. +{{site.alert.end}} + ## Expanded widget -Similar to the `Flexible` widget, the `Expanded` widget can wrap a widget and force the widget to fill extra space. +Similar to `Flexible`, the `Expanded` widget can wrap a widget and force the widget to fill extra space. {{site.alert.tip}} **What's the difference between Flexible and Expanded?** - Use `Flexible` to resize widgets in a `Row` or `Column`, - so you can adjust child widgets' spacing while keeping the - relation with their parent widget. - `Expanded` changes the constraints of the child widgets - to fill any empty space. + Use `Flexible` to resize widgets in a `Row` or `Column`. + That way, you can adjust a child widget's spacing + while keeping its size in relation to its parent widget. + `Expanded` changes the constraints of a child widget, + so it fills any empty space. {{site.alert.end}} #### Example: Filling extra space @@ -299,7 +304,7 @@ Similar to the `Flexible` widget, the `Expanded` widget can wrap a widget and fo ## SizedBox widget -The `SizedBox` widget can be used in one of two ways. +The `SizedBox` widget can be used in one of two ways when creating exact dimensions. When `SizedBox` wraps a widget, it resizes the widget using the `height` and `width` properties. When it doesn't wrap a widget, @@ -336,7 +341,7 @@ it uses the `height` and `width` properties to create empty space. ## Spacer widget -Similar to the `SizedBox` widget, the `Spacer` widget also can create space between widgets. +Similar to `SizedBox`, the `Spacer` widget also can create space between widgets. {{site.alert.tip}} **What's the difference between SizedBox and Spacer?** @@ -390,19 +395,19 @@ Flutter is preloaded with icon packages for [Material](https://api.flutter.dev/flutter/material/MaterialApp-class.html) and [Cupertino](https://api.flutter.dev/flutter/cupertino/CupertinoApp-class.html) applications. -#### Example: Create an Icon widget +#### Example: Creating an Icon {:.no_toc} {{site.alert.secondary}} - The following example displays the widget icon from the + The following example displays the widget `Icons.widget` from the [Material Icon library](https://api.flutter.dev/flutter/material/Icons-class.html) in red and blue. **1.** Click the **Run** button. - **2.** Add another `Icon` widget from the + **2.** Add another `Icon` from the [Material Icon library](https://api.flutter.dev/flutter/material/Icons-class.html) with a size of 50. - **3.** Give the icon a color of `Color.amber` from the + **3.** Give the `Icon` a color of `Color.amber` from the [Material Color palette](https://api.flutter.dev/flutter/material/Colors-class.html), and run again. {{site.alert.end}} @@ -417,17 +422,11 @@ The `Image` widget displays an image. You either can reference images using a UR or you can include images inside your app package. Since DartPad can't package an image, the following example uses an image from the network. -#### Example: Image widget +#### Example: Displaying an image {:.no_toc} {{site.alert.secondary}} - The following example displays an image using `Image`. + The following example displays an image that's stored remotely on [GitHub](https://github.com/flutter/website/tree/master/examples/layout/sizing/images). The `Image.network` method takes a string parameter that contains the image's URL. - - This example displays an image that's stored remotely on [GitHub](https://github.com/flutter/website/tree/master/examples/layout/sizing/images). - - **1.** Click the **Run** button. - - **2.** Change the width of the UI by dragging the divider between the code and the UI. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/b6f3084800bd139cdb522b8858bb58b7 @@ -436,47 +435,66 @@ the following example uses an image from the network. ## Putting it all together -You've almost reached the end of this codelab. -Why not test your knowledge by applying the techniques -you've learned to build a UI that displays a business card! +You're almost at the end of this codelab. +If you'd like to test your knowledge of the techniques that you've learned, +why not apply those skills into building a Flutter UI that displays a business card! + + ![Completed business card]({% asset codelab/layout/businesscarddisplay0.png + @path %}){:width="325px"}{:.text-center} + +You'll break down Flutter's layout into parts, which is how you'd +create a Flutter UI in the real world. + +In [Part 1](#part-1), +you'll implement a `Column` that contains the name and title. +Then you'll wrap the `Column` in a `Row` that contains the icon, +which is positioned to the left of the name and title. + -You'll break down the layout into parts, which is how you'd -create a UI in the real world. In part 1, -you'll implement a `Column` that contains a name, title, and icon. + ![Completed business card]({% asset codelab/layout/businesscarddisplay2.png + @path %}){:width="275px"}{:.text-center} -In part 2, you'll wrap the `Column` in a `Row`, tweak the layout to look nice, -and add contact information. -In part 3, -you'll add another `Row` containing four icons. +In [Part 2](#part-2), you'll wrap the `Row` in a `Column`, +so the code contains a `Column` within a `Row` within a `Column`. +Then you'll tweak the outermost `Column`'s layout, +so it looks nice. +Finally, you'll add the contact information +to the outermost `Column`'s list of children, +so it's displayed below the name, title, and icon. + + ![Completed business card]({% asset codelab/layout/businesscarddisplay4.png + @path %}){:width="275px"}{:.text-center} + +In [Part 3](#part-3), +you'll finish building the business card display by adding four more icons, +which are positioned below the contact information. + + ![Completed business card]({% asset codelab/layout/businesscarddisplay5.png + @path %}){:width="300px"}{:.text-center} ### Part 1 {:.no_toc} -This part contains two examples. -In the first example, you'll build a `Column` -that contains a name and title. -In the second example, you'll wrap your `Column` in a `Row` that contains an icon. -By the end of Part 1, -your code displays a name, business title, and business icon. - -#### Example: Create the name and title +#### Exercise: Create the name and title {:.no_toc} {{site.alert.secondary}} - Build a `Column` that contains the following widgets: + Implement a `Column` that contains two text widgets:
  • - One Text widget that contains the name `Flutter McFlutter` and + The first `Text` widget contains the name `Flutter McFlutter` and the `style` property set to `Theme.of(context).textTheme.headline`.
  • - A second `Text` widget that contains the business title `Experienced Developer`. + The second `Text` widget contains the title `Experienced Developer`.
- For your `Column`, set the `mainAxisSize` property to `MainAxisSize.min` and `crossAxisAlignment` property to `CrossAxisAlignment.start`. + For the `Column`, + set `mainAxisSize` to `MainAxisSize.min` + and `crossAxisAlignment` to `CrossAxisAlignment.start`. {{site.alert.end}} {% comment %} Gist: https://gist.github.com/datafoya/30ccbe0fcf31cc10eafba3aea8ff0697 @@ -486,27 +504,33 @@ your code displays a name, business title, and business icon. #### Exercise: Wrap the Column in a Row {:.no_toc} {{site.alert.secondary}} - - Wrap your `Column` in a `Row` that contains the following widgets: + Wrap the `Column` you implemented in a `Row` that contains the following widgets:
  • - An `Icon` widget set to `Icons.account_circle` with a size of 50 pixels. + An `Icon` widget set to `Icons.account_circle` and with a size of 50 pixels. +
  • A `Padding` widget that creates a space of 8 pixels around the `Icon` widget. - To do this, you can specify `const EdgeInsets.all(8.0)` for the padding property. + To do this, you can specify `const EdgeInsets.all(8.0)` for the `padding` property. - For example: + The `Row` should look like this:
```dart - Padding( - padding: const EdgeInsets.all(8.0), - child: Icon(Icons.account_circle, size: 50)), + Row( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Icon(Icons.account_circle, size: 50), + ), + Column( ... ), // <--- The Column you first implemented + ], + ); ``` {{site.alert.end}} {% comment %} @@ -517,40 +541,35 @@ your code displays a name, business title, and business icon. ### Part 2 {:.no_toc} -This part also contains two examples, both focusing on contact information. -In the first example, you'll wrap the `Row` you built in a `Column`, -so you can create space for the contact information. -In the second example, you'll enter the contact information. -At the end of Part 2, your code will contain a `Column` within a `Row` within a `Column`. - #### Exercise: Tweak the layout {:.no_toc} {{site.alert.secondary}} - Wrap your `Row` inside a `Column` that has a `mainAxisSize` property set to `MainAxisSize.min` + Wrap the `Row` in a `Column` that has a `mainAxisSize` property set to `MainAxisSize.min` and a `crossAxisAlignment` property set to `CrossAxisAlignment.stretch`. - Your `Column` also should contain the following widgets: + The `Column` contains the following widgets: * A `SizedBox` widget with a height of 8. - * An empty `Row` where you'll add contact information. + * An empty `Row` where you'll add the contact information. * A second `SizedBox` widget with a height of 16. - * A second empty `Row` where you'll add different icons (covered in [Part 3](#part-3)). + * A second empty `Row` where you'll add different the four icons (Part 3). - Your `SizedBox` widgets and empty `Row`s should be formatted like this: + The `Column`'s list of widgets should be formatted like this, + so the contact information and icons are displayed below the name and title: ```dart ], - ), + ), // <--- Closing parentheses for the Row SizedBox(), - Row(), // First empty Row. + Row(), // First empty Row SizedBox(), - Row(), // Second empty Row. - ], - ); + Row(), // Second empty Row + ], + ); // <--- Closing parentheses for the Column that wraps the Row ``` @@ -560,7 +579,7 @@ At the end of Part 2, your code will contain a `Column` within a `Row` within a {% endcomment %} -#### Example: Enter contact information +#### Exercise: Enter contact information {:.no_toc} {{site.alert.secondary}} Enter two `Text` widgets inside the first empty `Row` : @@ -585,13 +604,10 @@ At the end of Part 2, your code will contain a `Column` within a `Row` within a ### Part 3 {:.no_toc} -This part contains one example, -where you'll finish your business card display. -You'll add four `Icon` widgets to the second empty `Row` -that you built in Part 2. - +#### Exercise: Add four icons +{:.no_toc} {{site.alert.secondary}} - Enter the following `Icon` widgets in the second empty `Row`: + Enter the following `Icon` widgets inside the second empty `Row`: * `Icons.accessibility` * `Icons.timer` @@ -606,4 +622,16 @@ that you built in Part 2. {% endcomment %} -Congratulations! You finished the Flutter layout codelab. \ No newline at end of file +## What's next? + +Congratulations, you finished this codelab! If you'd like to learn more about Flutter, here are couple of suggestions for resources worth exploring: + +* Check this [list of sample apps](https://github.com/flutter/samples/blob/master/INDEX.md) +that were created using Flutter. +* Visit [Flutter's YouTube channel](https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw), +where you can watch videos that focus on individual widgets +and see how developers all over the world are using Flutter. + +You also can download Flutter by visiting the [Get started](https://flutter.dev/docs/get-started/install) page. + + \ No newline at end of file From f28545817f0d7d522ab9a4fbb01ef8d3a2039ab1 Mon Sep 17 00:00:00 2001 From: datafoya Date: Tue, 20 Aug 2019 12:09:56 -0700 Subject: [PATCH 11/18] committing changes --- src/docs/codelabs/extended-flex-widget.md | 637 ---------------------- src/docs/codelabs/index.md | 2 +- src/docs/whats-new-archive.md | 2 +- 3 files changed, 2 insertions(+), 639 deletions(-) delete mode 100644 src/docs/codelabs/extended-flex-widget.md diff --git a/src/docs/codelabs/extended-flex-widget.md b/src/docs/codelabs/extended-flex-widget.md deleted file mode 100644 index 26c1cc8ad3..0000000000 --- a/src/docs/codelabs/extended-flex-widget.md +++ /dev/null @@ -1,637 +0,0 @@ ---- -title: "Basic Flutter layout concepts" -description: "A codelab that teaches basic Flutter layout concepts through DartPad examples and exercises." -toc: true ---- -Welcome to the Flutter layout codelab, -where you learn how to build a Flutter UI without downloading and installing Flutter or Dart! - -{{site.alert.important}} - This codelab covers basic Flutter layout concepts using an experimental code editor called DartPad. - DartPad hasn't been fully tested on all browsers. - If you experience any difficulties while using DartPad on a specific browser, - please create a [DartPad issue](https://github.com/dart-lang/dart-pad/issues/new) - and specify which browser you're using in the issue title. -{{site.alert.end}} - -Flutter is different from other frameworks because its UI is built in code, -not (for example) in an XML file or similar. -Widgets are the basic building blocks of a Flutter UI. -As you progress through this codelab, -you'll learn that almost everything in Flutter is a widget. -A widget is an immutable object that describes a specific part of a UI. -You'll also learn that Flutter widgets are composable, meaning, -that you can combine existing widgets to make more sophisticated widgets. -At the end of this codelab, -you'll get to apply what you've learned -into building a Flutter UI that displays a business card. - -**Estimated time to complete this codelab: 45-60 minutes.** - -## Row and Column classes -`Row` and `Column` are classes that contain and lay out widgets. -Widgets inside of a `Row` or `Column` are called *children*, -and `Row` and `Column` are referred to as *parents*. -`Row` lays out its widgets horizontally, -and `Column` lays out its widgets vertically. - -#### Example: Creating a Column -{:.no_toc} -{{site.alert.secondary}} -{:.no_toc} - The following example displays the differences between a `Row` and `Column`. - - **1.** Click the **Run** button. - - **2.** In the code, change the `Row` to a `Column`, and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/4e11c4a7ec824685f963f25d7c30ba0b -{% endcomment %} - - -## Axis size and alignment - -So far, the `BlueBox` widgets have been squished together -(either to the left or at the top of the UI Output). -You can change how the `BlueBox` widgets are spaced out using the axis size and alignment properties. - -### mainAxisSize property - -`Row` and `Column` occupy different main axes. -A `Row`'s main axis is horizontal, -and a `Column`'s main axis is vertical. -The `mainAxisSize` property determines how much space a `Row` and `Column` can occupy on their main axes. -`mainAxisSize` has two possible values: - -`MainAxisSize.max` -: `Row` and `Column` occupy all of the space on their main axes. -If the combined width of their children is -less than the total space on their main axes, -their children are laid out with extra space. - -`MainAxisSize.min` -: `Row` and `Column` only occupy enough space on their main axes -for their children. Their children are laid out without extra space -and at the middle of their main axes. - -{{site.alert.tip}} - `MainAxisSize.max` is the `mainAxisSize` property's default value. - If you don't specify another value, - the default value is used, - as shown in the previous example. -{{site.alert.end}} -#### Example: Modifying axis size -{:.no_toc} -{{site.alert.secondary}} -{:.no_toc} - - The following example explicitly sets `mainAxisSize` to its default value, `MainAxisSize.max`. - - **1.** Click the **Run** button. - - **2.** Change `MainAxisSize.max` to `MainAxisSize.min`, and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/d852e4f07d6c87600fe8e0f186c7a31b -{% endcomment %} - - -### mainAxisAlignment property - -When `mainAxisSize` is set to `MainAxisSize.max`, -`Row` and `Column` might lay out their children with extra space. -The `mainAxisAlignment` property determines how `Row` and `Column` -can position their children in that extra space. - `mainAxisAlignment` has six possible values: - -`MainAxisAlignment.start` -: Positions children near the beginning of the main axis. -(Left for `Row`, top for `Column`) - -`MainAxisAlignment.end` -: Positions children near the end of the main axis. -(Right for `Row`, bottom for `Column`) - -`MainAxisAlignment.center` -: Positions children at the middle of the main axis. - -`MainAxisAlignment.spaceBetween` -: Divides the extra space evenly between children. - -`MainAxisAlignment.spaceEvenly` -: Divides the extra space evenly between children and before and after the children. - -`MainAxisAlignment.spaceAround` -: Similar to `MainAxisAlignment.spaceEvenly`, -but reduces half of the space before the first child and after the last child -to half of the width between the children. - -#### Example: Modifying main axis alignment -{:.no_toc} -{{site.alert.secondary}} - - The following example explicitly sets `mainAxisAlignment` to its default value, - `MainAxisAlignment.start`. - - **1.** Click the **Run** button. - - **2.** Change `MainAxisAlignment.start` to `MainAxisAlignment.end`, and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/cb8abed13f90a6a0c7a0ada6f15a09c9 -{% endcomment %} - -{{site.alert.tip}} - Before moving to the next section, change `MainAxisAlignment.end` to another value. -{{site.alert.end}} - -### crossAxisAlignment property - -The `crossAxisAlignment` property determines -how `Row` and `Column` can position their children on their cross axes. -A `Row`'s cross axis is vertical, and a `Column`'s cross axis is horizontal. -Most of the `crossAxisAlignment` property's values only work with the `Row` class. -`crossAxisAlignment` has five possible values: - -`CrossAxisAlignment.start` -: Positions children near the top of the cross axis. (`Row` only) - -`CrossAxisAlignment.end` -: Positions children near the bottom of the cross axis. (`Row` only) - -`CrossAxisAlignment.center` -: Positions children at the middle of the cross axis. (`Row` only) - -`CrossAxisAlignment.stretch` -: Stretches children across the cross axis. -(Top-to-bottom for `Row`, left-to-right for `Column`) - -`CrossAxisAlignment.baseline` -: Aligns children by their character baselines. (`Text` class only, and requires that the `textBaseline` property is set to `TextBaseline.alphabetic`. See the [Text class](#text-class) section for an example.) - -#### Example: Modifying cross axis alignment -{:.no_toc} -{{site.alert.secondary}} - The following example explicitly sets `crossAxisAlignment` to its default value, - `CrossAxisAlignment.center`. - - To demonstrate cross axis alignment, `mainAxisAlignment` is set to - `MainAxisAlignment.spaceAround`, and `Row` now contains a `BiggerBlueBox` widget - that is taller than the `BlueBox` widgets. - - **1.** Click the **Run** button. - - **2.** Change `CrossAxisAlignment.center` to `CrossAxisAlignment.start`, and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/70a6eb88f13019eec349a57bc4fd5fe0 -{% endcomment %} - -{{site.alert.tip}} - Before moving to the next section, change `CrossAxisAlignment.start` to another value. -{{site.alert.end}} - -## Flexible widget - -As you've seen, the `mainAxisAlignment` and `crossAxisAlignment` properties determine -how `Row` and `Column` position widgets along both axes. -`Row` and `Column` first lay out widgets of a fixed size. -Fixed size widgets are considered *inflexible* because they can't resize -themselves after they've been laid out. - -The `Flexible` widget wraps a widget, so the widget becomes resizable. -When the `Flexible` widget wraps a widget, the widget becomes the `Flexible` widget's child -and is considered *flexible*. -After inflexible widgets are laid out, -the widgets are resized according to their `flex` and `fit` properties.: - -`flex` -: Compares itself against other `flex` properties before determining -what fraction of the total remaining space each `Flexible` widget receives. - -`fit` -: Determines whether a `Flexible` widget fills all of its extra space. - -#### Example: Changing fit properties -{:.no_toc} -{{site.alert.secondary}} - The following example demonstrates the `fit` property, - which can have one of two values: - - `FlexFit.loose` - : The widget's preferred size is used. (Default) - - `FlexFit.tight` - : Forces the widget to fill all of its extra space. - - In this example, change the `fit` properties to - make the `Flexible` widgets fill the extra space. - - **1.** Click the **Run** button. - - **2.** Change both `fit` values to `FlexFit.tight`, - and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/ba0f40356d1023066d960f6de2be1a4b -{% endcomment %} - - -#### Example: Testing flex values -{:.no_toc} -{{site.alert.secondary}} - In the following example, `Row` contains one `BlueBox` widget - and two `Flexible` widgets that wrap two `BlueBox` widgets. - The `Flexible` widgets contain `flex` properties with `flex` values set to 1 (the default value). - - When `flex` properties are compared against one another, - the ratio between their `flex` values determines - what fraction of the total remaining space each `Flexible` widget receives. - - ```dart - remainingSpace * (flex / totalOfAllFlexValues) - ``` - - In this example, the sum of the `flex` values (2), - determines that both `Flexible` widgets receive - half of the total remaining space. - The `BlueBox` widget (or fixed-size widget) remains the same size. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/82e4dd24028034ae03ba0ddc71bf59e5 -{% endcomment %} - -{{site.alert.tip}} - Before moving to the next example, try changing the `flex` properties to other values, - such as 2 and 1. -{{site.alert.end}} - -## Expanded widget - -Similar to `Flexible`, the `Expanded` widget can wrap a widget and force the widget to fill extra space. - -{{site.alert.tip}} - **What's the difference between Flexible and Expanded?** - Use `Flexible` to resize widgets in a `Row` or `Column`. - That way, you can adjust a child widget's spacing - while keeping its size in relation to its parent widget. - `Expanded` changes the constraints of a child widget, - so it fills any empty space. -{{site.alert.end}} - -#### Example: Filling extra space -{:.no_toc} -{{site.alert.secondary}} - The following example demonstrates how the `Expanded` widget forces its child widget to fill extra space. - - **1.** Click the **Run** button. - - **2.** Wrap the second `BlueBox` widget in an `Expanded` widget. - - For example: - - ```dart - Expanded(child: BlueBox(),), - ``` - **3.** Select the **Format** button, and run again. - -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/77021d2ed15f9ece850de15e73c47526 -{% endcomment %} - - -## SizedBox widget - -The `SizedBox` widget can be used in one of two ways when creating exact dimensions. -When `SizedBox` wraps a widget, -it resizes the widget using the `height` and `width` properties. -When it doesn't wrap a widget, -it uses the `height` and `width` properties to create empty space. -#### Example: Resizing a widget -{:.no_toc} -{{site.alert.secondary}} - The following example wraps the middle `BlueBox` widget inside of a - `SizedBox` widget and sets the `BlueBox`'s width to 100 logical pixels. - - **1.** Click the **Run** button. - - **2.** Add a `height` property equal to 100 logical pixels inside the `SizedBox` widget, and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/6582851e85b57180ff5321f814fabb81 -{% endcomment %} - - -#### Example: Creating space -{:.no_toc} -{{site.alert.secondary}} - The following example contains three `BlueBox` widgets and one `SizedBox` widget that separates the first and second `BlueBox` widgets. The `SizedBox` widget contains a `width` property equal to 50 logical pixels. - - **1.** Click the **Run** button. - - **2.** Create more space by adding another `SizedBox` widget (25 logical pixels wide) - between the second and third `BlueBox` widgets, and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/19ead147ab5c7668d7d32e1cfed90097 -{% endcomment %} - - -## Spacer widget - -Similar to `SizedBox`, the `Spacer` widget also can create space between widgets. - -{{site.alert.tip}} - **What's the difference between SizedBox and Spacer?** - Use `Spacer` when you want to create space using a `flex` property. - Use `SizedBox` when you want to create space - using a specific number of logical pixels. -{{site.alert.end}} - -#### Example: Creating more space -{:.no_toc} -{{site.alert.secondary}} - The following example separates the first two `BlueBox` widgets using - a `Spacer` widget with a `flex` value of 1. - - **1.** Click the **Run** button. - - **2.** Add another `Spacer` widget (also with a `flex` value of 1) - between the second and third `BlueBox` widgets. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/bfc367aefde35e02ea5283efdbf58e60 -{% endcomment %} - - -## Text widget - -The `Text` widget displays text and can be configured -for different fonts, sizes, and colors. - -#### Example: Aligning text -{:.no_toc} -{{site.alert.secondary}} - The following example displays "Hey!" three times, - but at different font sizes and in different colors. - `Row` specifies the `crossAxisAlignment` and `textBaseline` properties. - - **1.** Click the **Run** button. - - **2.** Change `CrossAxisAlignment.center` to `CrossAxisAlignment.baseline`, and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/0ff109090b99ef1873d9fad501b2bc86 -{% endcomment %} - - -## Icon widget - -The `Icon` widget displays a graphical symbol -that represents an aspect of the UI. -Flutter is preloaded with icon packages for -[Material](https://api.flutter.dev/flutter/material/MaterialApp-class.html) and -[Cupertino](https://api.flutter.dev/flutter/cupertino/CupertinoApp-class.html) applications. - -#### Example: Creating an Icon -{:.no_toc} -{{site.alert.secondary}} - The following example displays the widget `Icons.widget` from the - [Material Icon library](https://api.flutter.dev/flutter/material/Icons-class.html) in red and blue. - - **1.** Click the **Run** button. - - **2.** Add another `Icon` from the - [Material Icon library](https://api.flutter.dev/flutter/material/Icons-class.html) - with a size of 50. - - **3.** Give the `Icon` a color of `Color.amber` from the - [Material Color palette](https://api.flutter.dev/flutter/material/Colors-class.html), - and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/01688fca8c13f85d93078054af2e858b -{% endcomment %} - - -## Image widget - -The `Image` widget displays an image. You either can reference images using a URL, -or you can include images inside your app package. Since DartPad can't package an image, -the following example uses an image from the network. - -#### Example: Displaying an image -{:.no_toc} -{{site.alert.secondary}} - The following example displays an image that's stored remotely on [GitHub](https://github.com/flutter/website/tree/master/examples/layout/sizing/images). - The `Image.network` method takes a string parameter that contains the image's URL. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/b6f3084800bd139cdb522b8858bb58b7 -{% endcomment %} - - -## Putting it all together - -You're almost at the end of this codelab. -If you'd like to test your knowledge of the techniques that you've learned, -why not apply those skills into building a Flutter UI that displays a business card! - - ![Completed business card]({% asset codelab/layout/businesscarddisplay0.png - @path %}){:width="325px"}{:.text-center} - -You'll break down Flutter's layout into parts, which is how you'd -create a Flutter UI in the real world. - -In [Part 1](#part-1), -you'll implement a `Column` that contains the name and title. -Then you'll wrap the `Column` in a `Row` that contains the icon, -which is positioned to the left of the name and title. - - - ![Completed business card]({% asset codelab/layout/businesscarddisplay2.png - @path %}){:width="275px"}{:.text-center} - - -In [Part 2](#part-2), you'll wrap the `Row` in a `Column`, -so the code contains a `Column` within a `Row` within a `Column`. -Then you'll tweak the outermost `Column`'s layout, -so it looks nice. -Finally, you'll add the contact information -to the outermost `Column`'s list of children, -so it's displayed below the name, title, and icon. - - ![Completed business card]({% asset codelab/layout/businesscarddisplay4.png - @path %}){:width="275px"}{:.text-center} - -In [Part 3](#part-3), -you'll finish building the business card display by adding four more icons, -which are positioned below the contact information. - - ![Completed business card]({% asset codelab/layout/businesscarddisplay5.png - @path %}){:width="300px"}{:.text-center} - -### Part 1 -{:.no_toc} - -#### Exercise: Create the name and title -{:.no_toc} -{{site.alert.secondary}} - - Implement a `Column` that contains two text widgets: - -
    -
  • - The first `Text` widget contains the name `Flutter McFlutter` and - the `style` property set to `Theme.of(context).textTheme.headline`. -
  • -
  • - The second `Text` widget contains the title `Experienced Developer`. -
  • -
- - For the `Column`, - set `mainAxisSize` to `MainAxisSize.min` - and `crossAxisAlignment` to `CrossAxisAlignment.start`. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/30ccbe0fcf31cc10eafba3aea8ff0697 -{% endcomment %} - - -#### Exercise: Wrap the Column in a Row -{:.no_toc} -{{site.alert.secondary}} - - Wrap the `Column` you implemented in a `Row` that contains the following widgets: - -
    -
  • - An `Icon` widget set to `Icons.account_circle` and with a size of 50 pixels. - -
  • -
  • - A `Padding` widget that creates a space of 8 pixels around the `Icon` widget. - - To do this, you can specify `const EdgeInsets.all(8.0)` for the `padding` property. - - The `Row` should look like this: -
  • -
- - ```dart - Row( - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Icon(Icons.account_circle, size: 50), - ), - Column( ... ), // <--- The Column you first implemented - ], - ); - ``` -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/95dcc1451aea8412669c41eb8a1a5f23 -{% endcomment %} - - -### Part 2 -{:.no_toc} - -#### Exercise: Tweak the layout -{:.no_toc} -{{site.alert.secondary}} - - Wrap the `Row` in a `Column` that has a `mainAxisSize` property set to `MainAxisSize.min` - and a `crossAxisAlignment` property set to `CrossAxisAlignment.stretch`. - The `Column` contains the following widgets: - - * A `SizedBox` widget with a height of 8. - - * An empty `Row` where you'll add the contact information. - - * A second `SizedBox` widget with a height of 16. - - * A second empty `Row` where you'll add different the four icons (Part 3). - - The `Column`'s list of widgets should be formatted like this, - so the contact information and icons are displayed below the name and title: - - ```dart - - ], - ), // <--- Closing parentheses for the Row - SizedBox(), - Row(), // First empty Row - SizedBox(), - Row(), // Second empty Row - ], - ); // <--- Closing parentheses for the Column that wraps the Row - - ``` - -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/c3ac34ed8952724a0ecb0af1445c2af8 -{% endcomment %} - - -#### Exercise: Enter contact information -{:.no_toc} -{{site.alert.secondary}} - Enter two `Text` widgets inside the first empty `Row` : - -
    -
  • - The first `Text` widget contains the address `123 Main Street`. -
  • -
  • - The second `Text` widget contains the phone number `(415) 555-0198`. -
  • -
- - For the first empty `Row`, - set the `mainAxisAlignment` property to `MainAxisAlignment.SpaceBetween`. - -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/c5be61116652927c5d92262fce1b5360 -{% endcomment %} - - -### Part 3 -{:.no_toc} -#### Exercise: Add four icons -{:.no_toc} -{{site.alert.secondary}} - Enter the following `Icon` widgets inside the second empty `Row`: - - * `Icons.accessibility` - * `Icons.timer` - * `Icons.phone_android` - * `Icons.phone_iphone` - - For the second empty `Row`, - set the `mainAxisAlignment` property to `MainAxisAlignment.spaceAround`. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/dae36611fc9af04c4b9d0fbc3429275e -{% endcomment %} - - -## What's next? - -Congratulations, you finished this codelab! If you'd like to learn more about Flutter, here are couple of suggestions for resources worth exploring: - -* Check this [list of sample apps](https://github.com/flutter/samples/blob/master/INDEX.md) -that were created using Flutter. -* Visit [Flutter's YouTube channel](https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw), -where you can watch videos that focus on individual widgets -and see how developers all over the world are using Flutter. - -You also can download Flutter by visiting the [Get started](https://flutter.dev/docs/get-started/install) page. - - \ No newline at end of file diff --git a/src/docs/codelabs/index.md b/src/docs/codelabs/index.md index 1d7f143e4c..a0a63e4aab 100644 --- a/src/docs/codelabs/index.md +++ b/src/docs/codelabs/index.md @@ -4,7 +4,7 @@ description: "Codelabs help you quickly get started programming Flutter." --- -#### [Codelab: basic Flutter layout concepts](/docs/codelabs/extended-flex-widget) +#### [Basic Flutter layout concepts](/docs/codelabs/layout-basics) Use DartPad in a browser (no need to download Flutter or Dart!) to learn the basics of creating a Flutter layout. diff --git a/src/docs/whats-new-archive.md b/src/docs/whats-new-archive.md index 2775ed1fff..a487abf35b 100644 --- a/src/docs/whats-new-archive.md +++ b/src/docs/whats-new-archive.md @@ -19,7 +19,7 @@ notes](https://github.com/flutter/flutter/wiki/Release-Notes-Flutter-1.5.4) or [download the release](/docs/development/tools/sdk/archive). We are updating DartPad to work with Flutter. Try our new -[Basic Flutter layout codelab](/docs/codelabs/extended-flex-widget) +[Basic Flutter layout codelab](/docs/codelabs/layout-basics) and tell us what you think! ## **February 26, 2019** From 02ff717362ed6df01c5a47f75b8c7108e0719f68 Mon Sep 17 00:00:00 2001 From: datafoya Date: Tue, 20 Aug 2019 12:37:50 -0700 Subject: [PATCH 12/18] fixing broken link --- src/docs/development/ui/widgets-intro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docs/development/ui/widgets-intro.md b/src/docs/development/ui/widgets-intro.md index 8665f1d876..ed28679fb7 100644 --- a/src/docs/development/ui/widgets-intro.md +++ b/src/docs/development/ui/widgets-intro.md @@ -18,7 +18,7 @@ needed in the underlying render tree to transition from one state to the next. {{site.alert.note}} If you would like to become better acquainted with Flutter by diving into some code, check out [Basic Flutter layout - codelab](/docs/codelabs/extended-flex-widget), [Building Layouts in + codelab](/docs/codelabs/layout-basics), [Building Layouts in Flutter](/docs/development/ui/layout), and [Adding Interactivity to Your Flutter App](/docs/development/ui/interactive). {{site.alert.end}} From 33c8928be61b79a748fe9f9046ca9cfbf48f766a Mon Sep 17 00:00:00 2001 From: datafoya Date: Tue, 20 Aug 2019 15:07:24 -0700 Subject: [PATCH 13/18] adding back extended-flex-widget adding url instructions --- src/docs/codelabs/extended-flex-widget.md | 646 +++++++++++++++++++++ 1 file changed, 646 insertions(+) create mode 100644 src/docs/codelabs/extended-flex-widget.md diff --git a/src/docs/codelabs/extended-flex-widget.md b/src/docs/codelabs/extended-flex-widget.md new file mode 100644 index 0000000000..13573bfa7d --- /dev/null +++ b/src/docs/codelabs/extended-flex-widget.md @@ -0,0 +1,646 @@ +--- +title: "Basic Flutter layout concepts" +description: "A codelab that teaches basic Flutter layout concepts through DartPad examples and exercises." +toc: true +--- +Welcome to the Flutter layout codelab, +where you learn how to build a Flutter UI without downloading and installing Flutter or Dart! + +{{site.alert.important}} + This codelab covers basic Flutter layout concepts using an experimental code editor called DartPad. + DartPad hasn't been fully tested on all browsers. + If you experience any difficulties while using DartPad on a specific browser, + please create a [DartPad issue](https://github.com/dart-lang/dart-pad/issues/new) + and specify which browser you're using in the issue title. +{{site.alert.end}} + +Flutter is different from other frameworks because its UI is built in code, +not (for example) in an XML file or similar. +Widgets are the basic building blocks of a Flutter UI. +As you progress through this codelab, +you'll learn that almost everything in Flutter is a widget. +A widget is an immutable object that describes a specific part of a UI. +You'll also learn that Flutter widgets are composable, meaning, +that you can combine existing widgets to make more sophisticated widgets. +At the end of this codelab, +you'll get to apply what you've learned +into building a Flutter UI that displays a business card. + +**Estimated time to complete this codelab: 45-60 minutes.** + +## Row and Column classes +`Row` and `Column` are classes that contain and lay out widgets. +Widgets inside of a `Row` or `Column` are called *children*, +and `Row` and `Column` are referred to as *parents*. +`Row` lays out its widgets horizontally, +and `Column` lays out its widgets vertically. + +#### Example: Creating a Column +{:.no_toc} +{{site.alert.secondary}} +{:.no_toc} + The following example displays the differences between a `Row` and `Column`. + + **1.** Click the **Run** button. + + **2.** In the code, change the `Row` to a `Column`, and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/4e11c4a7ec824685f963f25d7c30ba0b +{% endcomment %} + + +## Axis size and alignment + +So far, the `BlueBox` widgets have been squished together +(either to the left or at the top of the UI Output). +You can change how the `BlueBox` widgets are spaced out using the axis size and alignment properties. + +### mainAxisSize property + +`Row` and `Column` occupy different main axes. +A `Row`'s main axis is horizontal, +and a `Column`'s main axis is vertical. +The `mainAxisSize` property determines how much space a `Row` and `Column` can occupy on their main axes. +`mainAxisSize` has two possible values: + +`MainAxisSize.max` +: `Row` and `Column` occupy all of the space on their main axes. +If the combined width of their children is +less than the total space on their main axes, +their children are laid out with extra space. + +`MainAxisSize.min` +: `Row` and `Column` only occupy enough space on their main axes +for their children. Their children are laid out without extra space +and at the middle of their main axes. + +{{site.alert.tip}} + `MainAxisSize.max` is the `mainAxisSize` property's default value. + If you don't specify another value, + the default value is used, + as shown in the previous example. +{{site.alert.end}} +#### Example: Modifying axis size +{:.no_toc} +{{site.alert.secondary}} +{:.no_toc} + + The following example explicitly sets `mainAxisSize` to its default value, `MainAxisSize.max`. + + **1.** Click the **Run** button. + + **2.** Change `MainAxisSize.max` to `MainAxisSize.min`, and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/d852e4f07d6c87600fe8e0f186c7a31b +{% endcomment %} + + +### mainAxisAlignment property + +When `mainAxisSize` is set to `MainAxisSize.max`, +`Row` and `Column` might lay out their children with extra space. +The `mainAxisAlignment` property determines how `Row` and `Column` +can position their children in that extra space. + `mainAxisAlignment` has six possible values: + +`MainAxisAlignment.start` +: Positions children near the beginning of the main axis. +(Left for `Row`, top for `Column`) + +`MainAxisAlignment.end` +: Positions children near the end of the main axis. +(Right for `Row`, bottom for `Column`) + +`MainAxisAlignment.center` +: Positions children at the middle of the main axis. + +`MainAxisAlignment.spaceBetween` +: Divides the extra space evenly between children. + +`MainAxisAlignment.spaceEvenly` +: Divides the extra space evenly between children and before and after the children. + +`MainAxisAlignment.spaceAround` +: Similar to `MainAxisAlignment.spaceEvenly`, +but reduces half of the space before the first child and after the last child +to half of the width between the children. + +#### Example: Modifying main axis alignment +{:.no_toc} +{{site.alert.secondary}} + + The following example explicitly sets `mainAxisAlignment` to its default value, + `MainAxisAlignment.start`. + + **1.** Click the **Run** button. + + **2.** Change `MainAxisAlignment.start` to `MainAxisAlignment.end`, and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/cb8abed13f90a6a0c7a0ada6f15a09c9 +{% endcomment %} + +{{site.alert.tip}} + Before moving to the next section, change `MainAxisAlignment.end` to another value. +{{site.alert.end}} + +### crossAxisAlignment property + +The `crossAxisAlignment` property determines +how `Row` and `Column` can position their children on their cross axes. +A `Row`'s cross axis is vertical, and a `Column`'s cross axis is horizontal. +Most of the `crossAxisAlignment` property's values only work with the `Row` class. +`crossAxisAlignment` has five possible values: + +`CrossAxisAlignment.start` +: Positions children near the top of the cross axis. (`Row` only) + +`CrossAxisAlignment.end` +: Positions children near the bottom of the cross axis. (`Row` only) + +`CrossAxisAlignment.center` +: Positions children at the middle of the cross axis. (`Row` only) + +`CrossAxisAlignment.stretch` +: Stretches children across the cross axis. +(Top-to-bottom for `Row`, left-to-right for `Column`) + +`CrossAxisAlignment.baseline` +: Aligns children by their character baselines. (`Text` class only, and requires that the `textBaseline` property is set to `TextBaseline.alphabetic`. See the [Text class](#text-class) section for an example.) + +#### Example: Modifying cross axis alignment +{:.no_toc} +{{site.alert.secondary}} + The following example explicitly sets `crossAxisAlignment` to its default value, + `CrossAxisAlignment.center`. + + To demonstrate cross axis alignment, `mainAxisAlignment` is set to + `MainAxisAlignment.spaceAround`, and `Row` now contains a `BiggerBlueBox` widget + that is taller than the `BlueBox` widgets. + + **1.** Click the **Run** button. + + **2.** Change `CrossAxisAlignment.center` to `CrossAxisAlignment.start`, and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/70a6eb88f13019eec349a57bc4fd5fe0 +{% endcomment %} + +{{site.alert.tip}} + Before moving to the next section, change `CrossAxisAlignment.start` to another value. +{{site.alert.end}} + +## Flexible widget + +As you've seen, the `mainAxisAlignment` and `crossAxisAlignment` properties determine +how `Row` and `Column` position widgets along both axes. +`Row` and `Column` first lay out widgets of a fixed size. +Fixed size widgets are considered *inflexible* because they can't resize +themselves after they've been laid out. + +The `Flexible` widget wraps a widget, so the widget becomes resizable. +When the `Flexible` widget wraps a widget, the widget becomes the `Flexible` widget's child +and is considered *flexible*. +After inflexible widgets are laid out, +the widgets are resized according to their `flex` and `fit` properties.: + +`flex` +: Compares itself against other `flex` properties before determining +what fraction of the total remaining space each `Flexible` widget receives. + +`fit` +: Determines whether a `Flexible` widget fills all of its extra space. + +#### Example: Changing fit properties +{:.no_toc} +{{site.alert.secondary}} + The following example demonstrates the `fit` property, + which can have one of two values: + + `FlexFit.loose` + : The widget's preferred size is used. (Default) + + `FlexFit.tight` + : Forces the widget to fill all of its extra space. + + In this example, change the `fit` properties to + make the `Flexible` widgets fill the extra space. + + **1.** Click the **Run** button. + + **2.** Change both `fit` values to `FlexFit.tight`, + and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/ba0f40356d1023066d960f6de2be1a4b +{% endcomment %} + + +#### Example: Testing flex values +{:.no_toc} +{{site.alert.secondary}} + In the following example, `Row` contains one `BlueBox` widget + and two `Flexible` widgets that wrap two `BlueBox` widgets. + The `Flexible` widgets contain `flex` properties with `flex` values set to 1 (the default value). + + When `flex` properties are compared against one another, + the ratio between their `flex` values determines + what fraction of the total remaining space each `Flexible` widget receives. + + ```dart + remainingSpace * (flex / totalOfAllFlexValues) + ``` + + In this example, the sum of the `flex` values (2), + determines that both `Flexible` widgets receive + half of the total remaining space. + The `BlueBox` widget (or fixed-size widget) remains the same size. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/82e4dd24028034ae03ba0ddc71bf59e5 +{% endcomment %} + +{{site.alert.tip}} + Before moving to the next example, try changing the `flex` properties to other values, + such as 2 and 1. +{{site.alert.end}} + +## Expanded widget + +Similar to `Flexible`, the `Expanded` widget can wrap a widget and force the widget to fill extra space. + +{{site.alert.tip}} + **What's the difference between Flexible and Expanded?** + Use `Flexible` to resize widgets in a `Row` or `Column`. + That way, you can adjust a child widget's spacing + while keeping its size in relation to its parent widget. + `Expanded` changes the constraints of a child widget, + so it fills any empty space. +{{site.alert.end}} + +#### Example: Filling extra space +{:.no_toc} +{{site.alert.secondary}} + The following example demonstrates how the `Expanded` widget forces its child widget to fill extra space. + + **1.** Click the **Run** button. + + **2.** Wrap the second `BlueBox` widget in an `Expanded` widget. + + For example: + + ```dart + Expanded(child: BlueBox(),), + ``` + **3.** Select the **Format** button, and run again. + +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/77021d2ed15f9ece850de15e73c47526 +{% endcomment %} + + +## SizedBox widget + +The `SizedBox` widget can be used in one of two ways when creating exact dimensions. +When `SizedBox` wraps a widget, +it resizes the widget using the `height` and `width` properties. +When it doesn't wrap a widget, +it uses the `height` and `width` properties to create empty space. +#### Example: Resizing a widget +{:.no_toc} +{{site.alert.secondary}} + The following example wraps the middle `BlueBox` widget inside of a + `SizedBox` widget and sets the `BlueBox`'s width to 100 logical pixels. + + **1.** Click the **Run** button. + + **2.** Add a `height` property equal to 100 logical pixels inside the `SizedBox` widget, and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/6582851e85b57180ff5321f814fabb81 +{% endcomment %} + + +#### Example: Creating space +{:.no_toc} +{{site.alert.secondary}} + The following example contains three `BlueBox` widgets and one `SizedBox` widget that separates the first and second `BlueBox` widgets. The `SizedBox` widget contains a `width` property equal to 50 logical pixels. + + **1.** Click the **Run** button. + + **2.** Create more space by adding another `SizedBox` widget (25 logical pixels wide) + between the second and third `BlueBox` widgets, and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/19ead147ab5c7668d7d32e1cfed90097 +{% endcomment %} + + +## Spacer widget + +Similar to `SizedBox`, the `Spacer` widget also can create space between widgets. + +{{site.alert.tip}} + **What's the difference between SizedBox and Spacer?** + Use `Spacer` when you want to create space using a `flex` property. + Use `SizedBox` when you want to create space + using a specific number of logical pixels. +{{site.alert.end}} + +#### Example: Creating more space +{:.no_toc} +{{site.alert.secondary}} + The following example separates the first two `BlueBox` widgets using + a `Spacer` widget with a `flex` value of 1. + + **1.** Click the **Run** button. + + **2.** Add another `Spacer` widget (also with a `flex` value of 1) + between the second and third `BlueBox` widgets. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/bfc367aefde35e02ea5283efdbf58e60 +{% endcomment %} + + +## Text widget + +The `Text` widget displays text and can be configured +for different fonts, sizes, and colors. + +#### Example: Aligning text +{:.no_toc} +{{site.alert.secondary}} + The following example displays "Hey!" three times, + but at different font sizes and in different colors. + `Row` specifies the `crossAxisAlignment` and `textBaseline` properties. + + **1.** Click the **Run** button. + + **2.** Change `CrossAxisAlignment.center` to `CrossAxisAlignment.baseline`, and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/0ff109090b99ef1873d9fad501b2bc86 +{% endcomment %} + + +## Icon widget + +The `Icon` widget displays a graphical symbol +that represents an aspect of the UI. +Flutter is preloaded with icon packages for +[Material](https://api.flutter.dev/flutter/material/MaterialApp-class.html) and +[Cupertino](https://api.flutter.dev/flutter/cupertino/CupertinoApp-class.html) applications. + +#### Example: Creating an Icon +{:.no_toc} +{{site.alert.secondary}} + The following example displays the widget `Icons.widget` from the + [Material Icon library](https://api.flutter.dev/flutter/material/Icons-class.html) in red and blue. + + **1.** Click the **Run** button. + + **2.** Add another `Icon` from the + [Material Icon library](https://api.flutter.dev/flutter/material/Icons-class.html) + with a size of 50. + + **3.** Give the `Icon` a color of `Color.amber` from the + [Material Color palette](https://api.flutter.dev/flutter/material/Colors-class.html), + and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/01688fca8c13f85d93078054af2e858b +{% endcomment %} + + +## Image widget + +The `Image` widget displays an image. You either can reference images using a URL, +or you can include images inside your app package. Since DartPad can't package an image, +the following example uses an image from the network. + +#### Example: Displaying an image +{:.no_toc} +{{site.alert.secondary}} + The following example displays an image that's stored remotely on [GitHub](https://github.com/flutter/website/tree/master/examples/layout/sizing/images). + The `Image.network` method takes a string parameter that contains the image's URL. + + In this example, `Image.network` contains a short Url. + + **1.** Click the **Run** button. + + **2.** Change the short Url to the actual Url: + + https://github.com/flutter/website/blob/master/examples/layout/sizing/images/pic3.jpg?raw=true + + **3.** Then change `pic3.jpg` to `pic1.jpg` or `pic2.jpg`, + and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/b6f3084800bd139cdb522b8858bb58b7 +{% endcomment %} + + +## Putting it all together + +You're almost at the end of this codelab. +If you'd like to test your knowledge of the techniques that you've learned, +why not apply those skills into building a Flutter UI that displays a business card! + + ![Completed business card]({% asset codelab/layout/businesscarddisplay0.png + @path %}){:width="325px"}{:.text-center} + +You'll break down Flutter's layout into parts, which is how you'd +create a Flutter UI in the real world. + +In [Part 1](#part-1), +you'll implement a `Column` that contains the name and title. +Then you'll wrap the `Column` in a `Row` that contains the icon, +which is positioned to the left of the name and title. + + + ![Completed business card]({% asset codelab/layout/businesscarddisplay2.png + @path %}){:width="275px"}{:.text-center} + + +In [Part 2](#part-2), you'll wrap the `Row` in a `Column`, +so the code contains a `Column` within a `Row` within a `Column`. +Then you'll tweak the outermost `Column`'s layout, +so it looks nice. +Finally, you'll add the contact information +to the outermost `Column`'s list of children, +so it's displayed below the name, title, and icon. + + ![Completed business card]({% asset codelab/layout/businesscarddisplay4.png + @path %}){:width="275px"}{:.text-center} + +In [Part 3](#part-3), +you'll finish building the business card display by adding four more icons, +which are positioned below the contact information. + + ![Completed business card]({% asset codelab/layout/businesscarddisplay5.png + @path %}){:width="300px"}{:.text-center} + +### Part 1 +{:.no_toc} + +#### Exercise: Create the name and title +{:.no_toc} +{{site.alert.secondary}} + + Implement a `Column` that contains two text widgets: + +
    +
  • + The first `Text` widget contains the name `Flutter McFlutter` and + the `style` property set to `Theme.of(context).textTheme.headline`. +
  • +
  • + The second `Text` widget contains the title `Experienced Developer`. +
  • +
+ + For the `Column`, + set `mainAxisSize` to `MainAxisSize.min` + and `crossAxisAlignment` to `CrossAxisAlignment.start`. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/30ccbe0fcf31cc10eafba3aea8ff0697 +{% endcomment %} + + +#### Exercise: Wrap the Column in a Row +{:.no_toc} +{{site.alert.secondary}} + + Wrap the `Column` you implemented in a `Row` that contains the following widgets: + +
    +
  • + An `Icon` widget set to `Icons.account_circle` and with a size of 50 pixels. + +
  • +
  • + A `Padding` widget that creates a space of 8 pixels around the `Icon` widget. + + To do this, you can specify `const EdgeInsets.all(8.0)` for the `padding` property. + + The `Row` should look like this: +
  • +
+ + ```dart + Row( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Icon(Icons.account_circle, size: 50), + ), + Column( ... ), // <--- The Column you first implemented + ], + ); + ``` +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/95dcc1451aea8412669c41eb8a1a5f23 +{% endcomment %} + + +### Part 2 +{:.no_toc} + +#### Exercise: Tweak the layout +{:.no_toc} +{{site.alert.secondary}} + + Wrap the `Row` in a `Column` that has a `mainAxisSize` property set to `MainAxisSize.min` + and a `crossAxisAlignment` property set to `CrossAxisAlignment.stretch`. + The `Column` contains the following widgets: + + * A `SizedBox` widget with a height of 8. + + * An empty `Row` where you'll add the contact information. + + * A second `SizedBox` widget with a height of 16. + + * A second empty `Row` where you'll add different the four icons (Part 3). + + The `Column`'s list of widgets should be formatted like this, + so the contact information and icons are displayed below the name and title: + + ```dart + + ], + ), // <--- Closing parentheses for the Row + SizedBox(), + Row(), // First empty Row + SizedBox(), + Row(), // Second empty Row + ], + ); // <--- Closing parentheses for the Column that wraps the Row + + ``` + +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/c3ac34ed8952724a0ecb0af1445c2af8 +{% endcomment %} + + +#### Exercise: Enter contact information +{:.no_toc} +{{site.alert.secondary}} + Enter two `Text` widgets inside the first empty `Row` : + +
    +
  • + The first `Text` widget contains the address `123 Main Street`. +
  • +
  • + The second `Text` widget contains the phone number `(415) 555-0198`. +
  • +
+ + For the first empty `Row`, + set the `mainAxisAlignment` property to `MainAxisAlignment.SpaceBetween`. + +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/c5be61116652927c5d92262fce1b5360 +{% endcomment %} + + +### Part 3 +{:.no_toc} +#### Exercise: Add four icons +{:.no_toc} +{{site.alert.secondary}} + Enter the following `Icon` widgets inside the second empty `Row`: + + * `Icons.accessibility` + * `Icons.timer` + * `Icons.phone_android` + * `Icons.phone_iphone` + + For the second empty `Row`, + set the `mainAxisAlignment` property to `MainAxisAlignment.spaceAround`. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/dae36611fc9af04c4b9d0fbc3429275e +{% endcomment %} + + +## What's next? + +Congratulations, you finished this codelab! If you'd like to learn more about Flutter, here are couple of suggestions for resources worth exploring: + +* Check this [list of sample apps](https://github.com/flutter/samples/blob/master/INDEX.md) +that were created using Flutter. +* Visit [Flutter's YouTube channel](https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw), +where you can watch videos that focus on individual widgets +and see how developers all over the world are using Flutter. + +You also can download Flutter by visiting the [Get started](https://flutter.dev/docs/get-started/install) page. \ No newline at end of file From ed0284d320cc60bd3194590ec7ed5c33e97bf70d Mon Sep 17 00:00:00 2001 From: datafoya Date: Tue, 20 Aug 2019 15:10:09 -0700 Subject: [PATCH 14/18] use previous codelabs file name --- src/docs/codelabs/extended-flex-widget.md | 646 --------------- src/docs/codelabs/layout-basics.md | 863 +++++++++++++-------- 2 files changed, 541 insertions(+), 968 deletions(-) delete mode 100644 src/docs/codelabs/extended-flex-widget.md diff --git a/src/docs/codelabs/extended-flex-widget.md b/src/docs/codelabs/extended-flex-widget.md deleted file mode 100644 index 13573bfa7d..0000000000 --- a/src/docs/codelabs/extended-flex-widget.md +++ /dev/null @@ -1,646 +0,0 @@ ---- -title: "Basic Flutter layout concepts" -description: "A codelab that teaches basic Flutter layout concepts through DartPad examples and exercises." -toc: true ---- -Welcome to the Flutter layout codelab, -where you learn how to build a Flutter UI without downloading and installing Flutter or Dart! - -{{site.alert.important}} - This codelab covers basic Flutter layout concepts using an experimental code editor called DartPad. - DartPad hasn't been fully tested on all browsers. - If you experience any difficulties while using DartPad on a specific browser, - please create a [DartPad issue](https://github.com/dart-lang/dart-pad/issues/new) - and specify which browser you're using in the issue title. -{{site.alert.end}} - -Flutter is different from other frameworks because its UI is built in code, -not (for example) in an XML file or similar. -Widgets are the basic building blocks of a Flutter UI. -As you progress through this codelab, -you'll learn that almost everything in Flutter is a widget. -A widget is an immutable object that describes a specific part of a UI. -You'll also learn that Flutter widgets are composable, meaning, -that you can combine existing widgets to make more sophisticated widgets. -At the end of this codelab, -you'll get to apply what you've learned -into building a Flutter UI that displays a business card. - -**Estimated time to complete this codelab: 45-60 minutes.** - -## Row and Column classes -`Row` and `Column` are classes that contain and lay out widgets. -Widgets inside of a `Row` or `Column` are called *children*, -and `Row` and `Column` are referred to as *parents*. -`Row` lays out its widgets horizontally, -and `Column` lays out its widgets vertically. - -#### Example: Creating a Column -{:.no_toc} -{{site.alert.secondary}} -{:.no_toc} - The following example displays the differences between a `Row` and `Column`. - - **1.** Click the **Run** button. - - **2.** In the code, change the `Row` to a `Column`, and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/4e11c4a7ec824685f963f25d7c30ba0b -{% endcomment %} - - -## Axis size and alignment - -So far, the `BlueBox` widgets have been squished together -(either to the left or at the top of the UI Output). -You can change how the `BlueBox` widgets are spaced out using the axis size and alignment properties. - -### mainAxisSize property - -`Row` and `Column` occupy different main axes. -A `Row`'s main axis is horizontal, -and a `Column`'s main axis is vertical. -The `mainAxisSize` property determines how much space a `Row` and `Column` can occupy on their main axes. -`mainAxisSize` has two possible values: - -`MainAxisSize.max` -: `Row` and `Column` occupy all of the space on their main axes. -If the combined width of their children is -less than the total space on their main axes, -their children are laid out with extra space. - -`MainAxisSize.min` -: `Row` and `Column` only occupy enough space on their main axes -for their children. Their children are laid out without extra space -and at the middle of their main axes. - -{{site.alert.tip}} - `MainAxisSize.max` is the `mainAxisSize` property's default value. - If you don't specify another value, - the default value is used, - as shown in the previous example. -{{site.alert.end}} -#### Example: Modifying axis size -{:.no_toc} -{{site.alert.secondary}} -{:.no_toc} - - The following example explicitly sets `mainAxisSize` to its default value, `MainAxisSize.max`. - - **1.** Click the **Run** button. - - **2.** Change `MainAxisSize.max` to `MainAxisSize.min`, and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/d852e4f07d6c87600fe8e0f186c7a31b -{% endcomment %} - - -### mainAxisAlignment property - -When `mainAxisSize` is set to `MainAxisSize.max`, -`Row` and `Column` might lay out their children with extra space. -The `mainAxisAlignment` property determines how `Row` and `Column` -can position their children in that extra space. - `mainAxisAlignment` has six possible values: - -`MainAxisAlignment.start` -: Positions children near the beginning of the main axis. -(Left for `Row`, top for `Column`) - -`MainAxisAlignment.end` -: Positions children near the end of the main axis. -(Right for `Row`, bottom for `Column`) - -`MainAxisAlignment.center` -: Positions children at the middle of the main axis. - -`MainAxisAlignment.spaceBetween` -: Divides the extra space evenly between children. - -`MainAxisAlignment.spaceEvenly` -: Divides the extra space evenly between children and before and after the children. - -`MainAxisAlignment.spaceAround` -: Similar to `MainAxisAlignment.spaceEvenly`, -but reduces half of the space before the first child and after the last child -to half of the width between the children. - -#### Example: Modifying main axis alignment -{:.no_toc} -{{site.alert.secondary}} - - The following example explicitly sets `mainAxisAlignment` to its default value, - `MainAxisAlignment.start`. - - **1.** Click the **Run** button. - - **2.** Change `MainAxisAlignment.start` to `MainAxisAlignment.end`, and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/cb8abed13f90a6a0c7a0ada6f15a09c9 -{% endcomment %} - -{{site.alert.tip}} - Before moving to the next section, change `MainAxisAlignment.end` to another value. -{{site.alert.end}} - -### crossAxisAlignment property - -The `crossAxisAlignment` property determines -how `Row` and `Column` can position their children on their cross axes. -A `Row`'s cross axis is vertical, and a `Column`'s cross axis is horizontal. -Most of the `crossAxisAlignment` property's values only work with the `Row` class. -`crossAxisAlignment` has five possible values: - -`CrossAxisAlignment.start` -: Positions children near the top of the cross axis. (`Row` only) - -`CrossAxisAlignment.end` -: Positions children near the bottom of the cross axis. (`Row` only) - -`CrossAxisAlignment.center` -: Positions children at the middle of the cross axis. (`Row` only) - -`CrossAxisAlignment.stretch` -: Stretches children across the cross axis. -(Top-to-bottom for `Row`, left-to-right for `Column`) - -`CrossAxisAlignment.baseline` -: Aligns children by their character baselines. (`Text` class only, and requires that the `textBaseline` property is set to `TextBaseline.alphabetic`. See the [Text class](#text-class) section for an example.) - -#### Example: Modifying cross axis alignment -{:.no_toc} -{{site.alert.secondary}} - The following example explicitly sets `crossAxisAlignment` to its default value, - `CrossAxisAlignment.center`. - - To demonstrate cross axis alignment, `mainAxisAlignment` is set to - `MainAxisAlignment.spaceAround`, and `Row` now contains a `BiggerBlueBox` widget - that is taller than the `BlueBox` widgets. - - **1.** Click the **Run** button. - - **2.** Change `CrossAxisAlignment.center` to `CrossAxisAlignment.start`, and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/70a6eb88f13019eec349a57bc4fd5fe0 -{% endcomment %} - -{{site.alert.tip}} - Before moving to the next section, change `CrossAxisAlignment.start` to another value. -{{site.alert.end}} - -## Flexible widget - -As you've seen, the `mainAxisAlignment` and `crossAxisAlignment` properties determine -how `Row` and `Column` position widgets along both axes. -`Row` and `Column` first lay out widgets of a fixed size. -Fixed size widgets are considered *inflexible* because they can't resize -themselves after they've been laid out. - -The `Flexible` widget wraps a widget, so the widget becomes resizable. -When the `Flexible` widget wraps a widget, the widget becomes the `Flexible` widget's child -and is considered *flexible*. -After inflexible widgets are laid out, -the widgets are resized according to their `flex` and `fit` properties.: - -`flex` -: Compares itself against other `flex` properties before determining -what fraction of the total remaining space each `Flexible` widget receives. - -`fit` -: Determines whether a `Flexible` widget fills all of its extra space. - -#### Example: Changing fit properties -{:.no_toc} -{{site.alert.secondary}} - The following example demonstrates the `fit` property, - which can have one of two values: - - `FlexFit.loose` - : The widget's preferred size is used. (Default) - - `FlexFit.tight` - : Forces the widget to fill all of its extra space. - - In this example, change the `fit` properties to - make the `Flexible` widgets fill the extra space. - - **1.** Click the **Run** button. - - **2.** Change both `fit` values to `FlexFit.tight`, - and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/ba0f40356d1023066d960f6de2be1a4b -{% endcomment %} - - -#### Example: Testing flex values -{:.no_toc} -{{site.alert.secondary}} - In the following example, `Row` contains one `BlueBox` widget - and two `Flexible` widgets that wrap two `BlueBox` widgets. - The `Flexible` widgets contain `flex` properties with `flex` values set to 1 (the default value). - - When `flex` properties are compared against one another, - the ratio between their `flex` values determines - what fraction of the total remaining space each `Flexible` widget receives. - - ```dart - remainingSpace * (flex / totalOfAllFlexValues) - ``` - - In this example, the sum of the `flex` values (2), - determines that both `Flexible` widgets receive - half of the total remaining space. - The `BlueBox` widget (or fixed-size widget) remains the same size. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/82e4dd24028034ae03ba0ddc71bf59e5 -{% endcomment %} - -{{site.alert.tip}} - Before moving to the next example, try changing the `flex` properties to other values, - such as 2 and 1. -{{site.alert.end}} - -## Expanded widget - -Similar to `Flexible`, the `Expanded` widget can wrap a widget and force the widget to fill extra space. - -{{site.alert.tip}} - **What's the difference between Flexible and Expanded?** - Use `Flexible` to resize widgets in a `Row` or `Column`. - That way, you can adjust a child widget's spacing - while keeping its size in relation to its parent widget. - `Expanded` changes the constraints of a child widget, - so it fills any empty space. -{{site.alert.end}} - -#### Example: Filling extra space -{:.no_toc} -{{site.alert.secondary}} - The following example demonstrates how the `Expanded` widget forces its child widget to fill extra space. - - **1.** Click the **Run** button. - - **2.** Wrap the second `BlueBox` widget in an `Expanded` widget. - - For example: - - ```dart - Expanded(child: BlueBox(),), - ``` - **3.** Select the **Format** button, and run again. - -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/77021d2ed15f9ece850de15e73c47526 -{% endcomment %} - - -## SizedBox widget - -The `SizedBox` widget can be used in one of two ways when creating exact dimensions. -When `SizedBox` wraps a widget, -it resizes the widget using the `height` and `width` properties. -When it doesn't wrap a widget, -it uses the `height` and `width` properties to create empty space. -#### Example: Resizing a widget -{:.no_toc} -{{site.alert.secondary}} - The following example wraps the middle `BlueBox` widget inside of a - `SizedBox` widget and sets the `BlueBox`'s width to 100 logical pixels. - - **1.** Click the **Run** button. - - **2.** Add a `height` property equal to 100 logical pixels inside the `SizedBox` widget, and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/6582851e85b57180ff5321f814fabb81 -{% endcomment %} - - -#### Example: Creating space -{:.no_toc} -{{site.alert.secondary}} - The following example contains three `BlueBox` widgets and one `SizedBox` widget that separates the first and second `BlueBox` widgets. The `SizedBox` widget contains a `width` property equal to 50 logical pixels. - - **1.** Click the **Run** button. - - **2.** Create more space by adding another `SizedBox` widget (25 logical pixels wide) - between the second and third `BlueBox` widgets, and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/19ead147ab5c7668d7d32e1cfed90097 -{% endcomment %} - - -## Spacer widget - -Similar to `SizedBox`, the `Spacer` widget also can create space between widgets. - -{{site.alert.tip}} - **What's the difference between SizedBox and Spacer?** - Use `Spacer` when you want to create space using a `flex` property. - Use `SizedBox` when you want to create space - using a specific number of logical pixels. -{{site.alert.end}} - -#### Example: Creating more space -{:.no_toc} -{{site.alert.secondary}} - The following example separates the first two `BlueBox` widgets using - a `Spacer` widget with a `flex` value of 1. - - **1.** Click the **Run** button. - - **2.** Add another `Spacer` widget (also with a `flex` value of 1) - between the second and third `BlueBox` widgets. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/bfc367aefde35e02ea5283efdbf58e60 -{% endcomment %} - - -## Text widget - -The `Text` widget displays text and can be configured -for different fonts, sizes, and colors. - -#### Example: Aligning text -{:.no_toc} -{{site.alert.secondary}} - The following example displays "Hey!" three times, - but at different font sizes and in different colors. - `Row` specifies the `crossAxisAlignment` and `textBaseline` properties. - - **1.** Click the **Run** button. - - **2.** Change `CrossAxisAlignment.center` to `CrossAxisAlignment.baseline`, and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/0ff109090b99ef1873d9fad501b2bc86 -{% endcomment %} - - -## Icon widget - -The `Icon` widget displays a graphical symbol -that represents an aspect of the UI. -Flutter is preloaded with icon packages for -[Material](https://api.flutter.dev/flutter/material/MaterialApp-class.html) and -[Cupertino](https://api.flutter.dev/flutter/cupertino/CupertinoApp-class.html) applications. - -#### Example: Creating an Icon -{:.no_toc} -{{site.alert.secondary}} - The following example displays the widget `Icons.widget` from the - [Material Icon library](https://api.flutter.dev/flutter/material/Icons-class.html) in red and blue. - - **1.** Click the **Run** button. - - **2.** Add another `Icon` from the - [Material Icon library](https://api.flutter.dev/flutter/material/Icons-class.html) - with a size of 50. - - **3.** Give the `Icon` a color of `Color.amber` from the - [Material Color palette](https://api.flutter.dev/flutter/material/Colors-class.html), - and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/01688fca8c13f85d93078054af2e858b -{% endcomment %} - - -## Image widget - -The `Image` widget displays an image. You either can reference images using a URL, -or you can include images inside your app package. Since DartPad can't package an image, -the following example uses an image from the network. - -#### Example: Displaying an image -{:.no_toc} -{{site.alert.secondary}} - The following example displays an image that's stored remotely on [GitHub](https://github.com/flutter/website/tree/master/examples/layout/sizing/images). - The `Image.network` method takes a string parameter that contains the image's URL. - - In this example, `Image.network` contains a short Url. - - **1.** Click the **Run** button. - - **2.** Change the short Url to the actual Url: - - https://github.com/flutter/website/blob/master/examples/layout/sizing/images/pic3.jpg?raw=true - - **3.** Then change `pic3.jpg` to `pic1.jpg` or `pic2.jpg`, - and run again. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/b6f3084800bd139cdb522b8858bb58b7 -{% endcomment %} - - -## Putting it all together - -You're almost at the end of this codelab. -If you'd like to test your knowledge of the techniques that you've learned, -why not apply those skills into building a Flutter UI that displays a business card! - - ![Completed business card]({% asset codelab/layout/businesscarddisplay0.png - @path %}){:width="325px"}{:.text-center} - -You'll break down Flutter's layout into parts, which is how you'd -create a Flutter UI in the real world. - -In [Part 1](#part-1), -you'll implement a `Column` that contains the name and title. -Then you'll wrap the `Column` in a `Row` that contains the icon, -which is positioned to the left of the name and title. - - - ![Completed business card]({% asset codelab/layout/businesscarddisplay2.png - @path %}){:width="275px"}{:.text-center} - - -In [Part 2](#part-2), you'll wrap the `Row` in a `Column`, -so the code contains a `Column` within a `Row` within a `Column`. -Then you'll tweak the outermost `Column`'s layout, -so it looks nice. -Finally, you'll add the contact information -to the outermost `Column`'s list of children, -so it's displayed below the name, title, and icon. - - ![Completed business card]({% asset codelab/layout/businesscarddisplay4.png - @path %}){:width="275px"}{:.text-center} - -In [Part 3](#part-3), -you'll finish building the business card display by adding four more icons, -which are positioned below the contact information. - - ![Completed business card]({% asset codelab/layout/businesscarddisplay5.png - @path %}){:width="300px"}{:.text-center} - -### Part 1 -{:.no_toc} - -#### Exercise: Create the name and title -{:.no_toc} -{{site.alert.secondary}} - - Implement a `Column` that contains two text widgets: - -
    -
  • - The first `Text` widget contains the name `Flutter McFlutter` and - the `style` property set to `Theme.of(context).textTheme.headline`. -
  • -
  • - The second `Text` widget contains the title `Experienced Developer`. -
  • -
- - For the `Column`, - set `mainAxisSize` to `MainAxisSize.min` - and `crossAxisAlignment` to `CrossAxisAlignment.start`. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/30ccbe0fcf31cc10eafba3aea8ff0697 -{% endcomment %} - - -#### Exercise: Wrap the Column in a Row -{:.no_toc} -{{site.alert.secondary}} - - Wrap the `Column` you implemented in a `Row` that contains the following widgets: - -
    -
  • - An `Icon` widget set to `Icons.account_circle` and with a size of 50 pixels. - -
  • -
  • - A `Padding` widget that creates a space of 8 pixels around the `Icon` widget. - - To do this, you can specify `const EdgeInsets.all(8.0)` for the `padding` property. - - The `Row` should look like this: -
  • -
- - ```dart - Row( - children: [ - Padding( - padding: const EdgeInsets.all(8.0), - child: Icon(Icons.account_circle, size: 50), - ), - Column( ... ), // <--- The Column you first implemented - ], - ); - ``` -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/95dcc1451aea8412669c41eb8a1a5f23 -{% endcomment %} - - -### Part 2 -{:.no_toc} - -#### Exercise: Tweak the layout -{:.no_toc} -{{site.alert.secondary}} - - Wrap the `Row` in a `Column` that has a `mainAxisSize` property set to `MainAxisSize.min` - and a `crossAxisAlignment` property set to `CrossAxisAlignment.stretch`. - The `Column` contains the following widgets: - - * A `SizedBox` widget with a height of 8. - - * An empty `Row` where you'll add the contact information. - - * A second `SizedBox` widget with a height of 16. - - * A second empty `Row` where you'll add different the four icons (Part 3). - - The `Column`'s list of widgets should be formatted like this, - so the contact information and icons are displayed below the name and title: - - ```dart - - ], - ), // <--- Closing parentheses for the Row - SizedBox(), - Row(), // First empty Row - SizedBox(), - Row(), // Second empty Row - ], - ); // <--- Closing parentheses for the Column that wraps the Row - - ``` - -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/c3ac34ed8952724a0ecb0af1445c2af8 -{% endcomment %} - - -#### Exercise: Enter contact information -{:.no_toc} -{{site.alert.secondary}} - Enter two `Text` widgets inside the first empty `Row` : - -
    -
  • - The first `Text` widget contains the address `123 Main Street`. -
  • -
  • - The second `Text` widget contains the phone number `(415) 555-0198`. -
  • -
- - For the first empty `Row`, - set the `mainAxisAlignment` property to `MainAxisAlignment.SpaceBetween`. - -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/c5be61116652927c5d92262fce1b5360 -{% endcomment %} - - -### Part 3 -{:.no_toc} -#### Exercise: Add four icons -{:.no_toc} -{{site.alert.secondary}} - Enter the following `Icon` widgets inside the second empty `Row`: - - * `Icons.accessibility` - * `Icons.timer` - * `Icons.phone_android` - * `Icons.phone_iphone` - - For the second empty `Row`, - set the `mainAxisAlignment` property to `MainAxisAlignment.spaceAround`. -{{site.alert.end}} -{% comment %} - Gist: https://gist.github.com/datafoya/dae36611fc9af04c4b9d0fbc3429275e -{% endcomment %} - - -## What's next? - -Congratulations, you finished this codelab! If you'd like to learn more about Flutter, here are couple of suggestions for resources worth exploring: - -* Check this [list of sample apps](https://github.com/flutter/samples/blob/master/INDEX.md) -that were created using Flutter. -* Visit [Flutter's YouTube channel](https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw), -where you can watch videos that focus on individual widgets -and see how developers all over the world are using Flutter. - -You also can download Flutter by visiting the [Get started](https://flutter.dev/docs/get-started/install) page. \ No newline at end of file diff --git a/src/docs/codelabs/layout-basics.md b/src/docs/codelabs/layout-basics.md index 7c8613c196..13573bfa7d 100644 --- a/src/docs/codelabs/layout-basics.md +++ b/src/docs/codelabs/layout-basics.md @@ -1,427 +1,646 @@ --- -title: "Codelab: Basic Flutter layout" -description: "A codelab that uses DartPad2 to teach Flutter layout concepts." -toc: false ---- - -{{site.alert.note}} - The embedded editors use an experimental version of DartPad. - If you find a DartPad bug or have suggestions for DartPad, - please [create a DartPad - issue](https://github.com/dart-lang/dart-pad/issues/new) - by clicking the bug icon at the top right of this page. +title: "Basic Flutter layout concepts" +description: "A codelab that teaches basic Flutter layout concepts through DartPad examples and exercises." +toc: true +--- +Welcome to the Flutter layout codelab, +where you learn how to build a Flutter UI without downloading and installing Flutter or Dart! + +{{site.alert.important}} + This codelab covers basic Flutter layout concepts using an experimental code editor called DartPad. + DartPad hasn't been fully tested on all browsers. + If you experience any difficulties while using DartPad on a specific browser, + please create a [DartPad issue](https://github.com/dart-lang/dart-pad/issues/new) + and specify which browser you're using in the issue title. {{site.alert.end}} -{{site.alert.note}} - This codelab is currently being developed and tested - with Chrome. There might be (in the short term) features that - work in some browsers and not others. If you encounter any, please - [create a DartPad issue](https://goo.gle/flutter_web_issue), - labeling the issue with `platform-web`. +Flutter is different from other frameworks because its UI is built in code, +not (for example) in an XML file or similar. +Widgets are the basic building blocks of a Flutter UI. +As you progress through this codelab, +you'll learn that almost everything in Flutter is a widget. +A widget is an immutable object that describes a specific part of a UI. +You'll also learn that Flutter widgets are composable, meaning, +that you can combine existing widgets to make more sophisticated widgets. +At the end of this codelab, +you'll get to apply what you've learned +into building a Flutter UI that displays a business card. + +**Estimated time to complete this codelab: 45-60 minutes.** + +## Row and Column classes +`Row` and `Column` are classes that contain and lay out widgets. +Widgets inside of a `Row` or `Column` are called *children*, +and `Row` and `Column` are referred to as *parents*. +`Row` lays out its widgets horizontally, +and `Column` lays out its widgets vertically. + +#### Example: Creating a Column +{:.no_toc} +{{site.alert.secondary}} +{:.no_toc} + The following example displays the differences between a `Row` and `Column`. + + **1.** Click the **Run** button. + + **2.** In the code, change the `Row` to a `Column`, and run again. {{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/4e11c4a7ec824685f963f25d7c30ba0b +{% endcomment %} + + +## Axis size and alignment + +So far, the `BlueBox` widgets have been squished together +(either to the left or at the top of the UI Output). +You can change how the `BlueBox` widgets are spaced out using the axis size and alignment properties. + +### mainAxisSize property + +`Row` and `Column` occupy different main axes. +A `Row`'s main axis is horizontal, +and a `Column`'s main axis is vertical. +The `mainAxisSize` property determines how much space a `Row` and `Column` can occupy on their main axes. +`mainAxisSize` has two possible values: + +`MainAxisSize.max` +: `Row` and `Column` occupy all of the space on their main axes. +If the combined width of their children is +less than the total space on their main axes, +their children are laid out with extra space. + +`MainAxisSize.min` +: `Row` and `Column` only occupy enough space on their main axes +for their children. Their children are laid out without extra space +and at the middle of their main axes. + +{{site.alert.tip}} + `MainAxisSize.max` is the `mainAxisSize` property's default value. + If you don't specify another value, + the default value is used, + as shown in the previous example. +{{site.alert.end}} +#### Example: Modifying axis size +{:.no_toc} +{{site.alert.secondary}} +{:.no_toc} -`Row` and `Column` are two very important widgets in the Flutter universe. -Want to put a `Text` widget with a label next to another `Text` -widget with the corresponding value? Use a `Row`. -Want to present multiple pairs of labels and values? -That's a `Column` of `Row`s. Forms with several fields, -icons next to menu choices, buttons next to -search bars, these are all places where `Row`s and `Column`s are used, - -This codelab walks you through how `Row`s and `Column`s work. -Because they're so similar, once you're done learning about -`Row`s, the codelab mostly shows you how all the same concepts apply -to `Column`s. There are inline editors -along the way so you can play around and test your knowledge. - -### Start with a Row and some children - -The whole point of a `Row` or `Column` is to contain -other widgets, known as children. In a `Row`, children -are arranged horizontally from first to last in accordance -with text direction. If your device is set to -English or another left-to-right language, it starts from the left. -If you're using Arabic or another right-to-left language, it starts -on the right and moves left. - -#### Code example - -Below is a widget called `MyWidget` that builds a single `Row`. -Try adding three `BlueBox` widgets to its list of children. - - - -### Main axis size + The following example explicitly sets `mainAxisSize` to its default value, `MainAxisSize.max`. -The main axis of a `Row` is the horizontal one (for -`Column`s, it's the vertical axis). Each `Row` has a -property called `mainAxisSize` that determines how much space -it should take along that axis. By default, -`mainAxisSize` is set to `MainAxisSize.max`, which -causes a `Row` to take up all the available horizontal -space. You can use `MainAxisSize.min` to direct a `Row` -widget to take up as little space as possible. + **1.** Click the **Run** button. -#### Code example + **2.** Change `MainAxisSize.max` to `MainAxisSize.min`, and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/d852e4f07d6c87600fe8e0f186c7a31b +{% endcomment %} + -Here's the example you just finished. Try setting the `Row`'s -`mainAxisSize` property to `MainAxisSize.min` and see what happens. +### mainAxisAlignment property - +When `mainAxisSize` is set to `MainAxisSize.max`, +`Row` and `Column` might lay out their children with extra space. +The `mainAxisAlignment` property determines how `Row` and `Column` +can position their children in that extra space. + `mainAxisAlignment` has six possible values: -### Main axis alignment +`MainAxisAlignment.start` +: Positions children near the beginning of the main axis. +(Left for `Row`, top for `Column`) -If you've set the `mainAxisSize` of a `Row` to the minimum, -there won't be any extra room beyond what the children use. -If you've set it to `max`, though, the `Row` might have some -additional space lying around. You can use the `mainAxisAlignment` -property to control how the `Row` aligns its children within that space. +`MainAxisAlignment.end` +: Positions children near the end of the main axis. +(Right for `Row`, bottom for `Column`) -There are six different values available in the `MainAxisAlignment` enum: +`MainAxisAlignment.center` +: Positions children at the middle of the main axis. -* `MainAxisAlignment.start`
- Place all children as close to the start of the `Row` as possible - (for left-to-right rows, this is the left side). +`MainAxisAlignment.spaceBetween` +: Divides the extra space evenly between children. -* `MainAxisAlignment.end`
- Place all children as close to the end of the `Row` as possible. +`MainAxisAlignment.spaceEvenly` +: Divides the extra space evenly between children and before and after the children. -* `MainAxisAlignment.center`
- Group the children together in the center of the `Row`. +`MainAxisAlignment.spaceAround` +: Similar to `MainAxisAlignment.spaceEvenly`, +but reduces half of the space before the first child and after the last child +to half of the width between the children. -* `MainAxisAlignment.spaceBetween`
- Any extra space is divided evenly and used to make gaps between the children. +#### Example: Modifying main axis alignment +{:.no_toc} +{{site.alert.secondary}} -* `MainAxisAlignment.spaceEvenly`
- Just like `spaceBetween`, except the spots before the first child - and after the last one also count as gaps. + The following example explicitly sets `mainAxisAlignment` to its default value, + `MainAxisAlignment.start`. -* `MainAxisAlignment.spaceAround`
- Just like `spaceEvenly`, only the first and last gaps get 50% of the - amount used between children. + **1.** Click the **Run** button. -#### Code example + **2.** Change `MainAxisAlignment.start` to `MainAxisAlignment.end`, and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/cb8abed13f90a6a0c7a0ada6f15a09c9 +{% endcomment %} + +{{site.alert.tip}} + Before moving to the next section, change `MainAxisAlignment.end` to another value. +{{site.alert.end}} -The row below has its `mainAxisAlignment` set to start. Try changing it to the -other values and re-running the code to see how things move around. +### crossAxisAlignment property - -### Cross axis alignment +The `crossAxisAlignment` property determines +how `Row` and `Column` can position their children on their cross axes. +A `Row`'s cross axis is vertical, and a `Column`'s cross axis is horizontal. +Most of the `crossAxisAlignment` property's values only work with the `Row` class. +`crossAxisAlignment` has five possible values: -The cross axis for `Row` widgets is the vertical axis, -and you can use the `crossAxisAlignment` property to -control how children are positioned vertically. -The default value is `CrossAxisAlignment.center`, -but there are five options in total: +`CrossAxisAlignment.start` +: Positions children near the top of the cross axis. (`Row` only) -* `CrossAxisAlignment.start`
- Children are aligned at the start of the `Row`'s vertical space - (by default, the top is considered to be the start, - though you can change that via the `verticalDirection` property). +`CrossAxisAlignment.end` +: Positions children near the bottom of the cross axis. (`Row` only) -* `CrossAxisAlignment.end`
- Children are aligned at the end of the `Row`'s - vertical space (by default, that means the bottom). +`CrossAxisAlignment.center` +: Positions children at the middle of the cross axis. (`Row` only) -* `CrossAxisAlignment.center`
- Children are centered with respect to the vertical axis. +`CrossAxisAlignment.stretch` +: Stretches children across the cross axis. +(Top-to-bottom for `Row`, left-to-right for `Column`) -* `CrossAxisAlignment.stretch`
- Children are forced to have the same height as the - `Row` itself, filling all the vertical space. +`CrossAxisAlignment.baseline` +: Aligns children by their character baselines. (`Text` class only, and requires that the `textBaseline` property is set to `TextBaseline.alphabetic`. See the [Text class](#text-class) section for an example.) -* `CrossAxisAlignment.baseline`
- Children are aligned by their baselines (more on this one below). +#### Example: Modifying cross axis alignment +{:.no_toc} +{{site.alert.secondary}} + The following example explicitly sets `crossAxisAlignment` to its default value, + `CrossAxisAlignment.center`. -#### Code example + To demonstrate cross axis alignment, `mainAxisAlignment` is set to + `MainAxisAlignment.spaceAround`, and `Row` now contains a `BiggerBlueBox` widget + that is taller than the `BlueBox` widgets. -This `Row` has two small children and one big one. Its -`crossAxisAlignment` property is set to center, the default. -Try changing it to the other values and re-running the code to -see how things move around. + **1.** Click the **Run** button. -A word of warning: `CrossAxisAlignment.baseline` requires -that another property be set as well, so you -will see an error if you try that one. -Don't worry, though—it's covered in the next section. + **2.** Change `CrossAxisAlignment.center` to `CrossAxisAlignment.start`, and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/70a6eb88f13019eec349a57bc4fd5fe0 +{% endcomment %} + +{{site.alert.tip}} + Before moving to the next section, change `CrossAxisAlignment.start` to another value. +{{site.alert.end}} - +## Flexible widget -### Baseline alignment +As you've seen, the `mainAxisAlignment` and `crossAxisAlignment` properties determine +how `Row` and `Column` position widgets along both axes. +`Row` and `Column` first lay out widgets of a fixed size. +Fixed size widgets are considered *inflexible* because they can't resize +themselves after they've been laid out. -Sometimes it's handy to align widgets containing text not by their -overall bounds, but by the baselines used by their characters. -That's what `CrossAxisAlignment.baseline` is for. You -can use it in combination with a `Row`'s `textBaseline` -property (which indicates which baseline to use) to align a -`Row`'s children along their baselines. +The `Flexible` widget wraps a widget, so the widget becomes resizable. +When the `Flexible` widget wraps a widget, the widget becomes the `Flexible` widget's child +and is considered *flexible*. +After inflexible widgets are laid out, +the widgets are resized according to their `flex` and `fit` properties.: -Note that if you set a `Row`'s `crossAxisAlignment` property -to baseline without setting `textBaseline` at the same -time, your widgets will fail to build. +`flex` +: Compares itself against other `flex` properties before determining +what fraction of the total remaining space each `Flexible` widget receives. -#### Code example +`fit` +: Determines whether a `Flexible` widget fills all of its extra space. -This row contains three `Text` widgets with different font -sizes. Try changing the `crossAxisAlignment` -property to `baseline`, and experiment with different -values for `textBaseline` as well (there's an enum called -`TextBaseline` that contains the valid baseline values). +#### Example: Changing fit properties +{:.no_toc} +{{site.alert.secondary}} + The following example demonstrates the `fit` property, + which can have one of two values: - + `FlexFit.loose` + : The widget's preferred size is used. (Default) -### Flexible children + `FlexFit.tight` + : Forces the widget to fill all of its extra space. -So far, all the widgets used as children in examples have -had a fixed size. It's possible, though, for a -`Row` to have children that flex, -and adapt to the available space. In order to -understand how this works, -it's best to take a look at how `Row`s size themselves and -their children: + In this example, change the `fit` properties to + make the `Flexible` widgets fill the extra space. -1. First, the `Row` asks all of its children with fixed - sizes how big they'd like to be. -1. Next, it calculates the remaining space in its main - axis (horizontal). -1. Then it divides up that remaining space among its - flexible children according to their flex factors. - The flexible children can use some or all of the space - they're offered. -1. At that point, the `Row` knows how big all of its - children are, and can align them using the same axis - size and alignment properties you've seen so far. + **1.** Click the **Run** button. -Most widgets are considered to be of a fixed size. -You can change that by wrapping them in a `Flexible` -widget. `Flexibles` have two important properties: -a `flex` factor that determines how much of the remaining -space they get in comparison to other `Flexibles`, -and a `fit` property that determines whether their child -is forced to take up all the extra space it's offered. + **2.** Change both `fit` values to `FlexFit.tight`, + and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/ba0f40356d1023066d960f6de2be1a4b +{% endcomment %} + + +#### Example: Testing flex values +{:.no_toc} +{{site.alert.secondary}} + In the following example, `Row` contains one `BlueBox` widget + and two `Flexible` widgets that wrap two `BlueBox` widgets. + The `Flexible` widgets contain `flex` properties with `flex` values set to 1 (the default value). + + When `flex` properties are compared against one another, + the ratio between their `flex` values determines + what fraction of the total remaining space each `Flexible` widget receives. + + ```dart + remainingSpace * (flex / totalOfAllFlexValues) + ``` + + In this example, the sum of the `flex` values (2), + determines that both `Flexible` widgets receive + half of the total remaining space. + The `BlueBox` widget (or fixed-size widget) remains the same size. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/82e4dd24028034ae03ba0ddc71bf59e5 +{% endcomment %} + +{{site.alert.tip}} + Before moving to the next example, try changing the `flex` properties to other values, + such as 2 and 1. +{{site.alert.end}} -#### Code example +## Expanded widget -Try wrapping the middle box in this row with a `Flexible` -widget that has a `flex` factor of 1 and its `fit` -property set to `FlexFit.loose`. Afterward, -try changing the fit to tight and see what happens. +Similar to `Flexible`, the `Expanded` widget can wrap a widget and force the widget to fill extra space. -This combination (a `flex` factor of 1 and a tight `fit`) -is so popular, there's a whole widget just to make -using them easier: `Expanded`. +{{site.alert.tip}} + **What's the difference between Flexible and Expanded?** + Use `Flexible` to resize widgets in a `Row` or `Column`. + That way, you can adjust a child widget's spacing + while keeping its size in relation to its parent widget. + `Expanded` changes the constraints of a child widget, + so it fills any empty space. +{{site.alert.end}} - +#### Example: Filling extra space +{:.no_toc} +{{site.alert.secondary}} + The following example demonstrates how the `Expanded` widget forces its child widget to fill extra space. -### Flex factors + **1.** Click the **Run** button. -If more than one child of a `Row` or `Column` has a -flexible size, the available space is allotted to them according to their -`flex` factors. Each child gets space in proportion to their flex -factor divided by the total of all the flex factors of all children: + **2.** Wrap the second `BlueBox` widget in an `Expanded` widget. - -```dart -remainingSpace * (flex / totalOfAllFlexValues) -``` + For example: -For example, if there are two children with flex factors of 1, -each gets half of the available space. If there -are two children with flex factors of 1 and another child -with a flex factor of 2, the first two -children each get a quarter of the available space, -and the other child gets half. + ```dart + Expanded(child: BlueBox(),), + ``` + **3.** Select the **Format** button, and run again. -#### Code example +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/77021d2ed15f9ece850de15e73c47526 +{% endcomment %} + + +## SizedBox widget + +The `SizedBox` widget can be used in one of two ways when creating exact dimensions. +When `SizedBox` wraps a widget, +it resizes the widget using the `height` and `width` properties. +When it doesn't wrap a widget, +it uses the `height` and `width` properties to create empty space. +#### Example: Resizing a widget +{:.no_toc} +{{site.alert.secondary}} + The following example wraps the middle `BlueBox` widget inside of a + `SizedBox` widget and sets the `BlueBox`'s width to 100 logical pixels. + + **1.** Click the **Run** button. + + **2.** Add a `height` property equal to 100 logical pixels inside the `SizedBox` widget, and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/6582851e85b57180ff5321f814fabb81 +{% endcomment %} + -In this example, all three of the `Row`'s children are `Flexible`. -Try changing their `flex` values and -re-running the code to see how the widgets' sizes adjust. +#### Example: Creating space +{:.no_toc} +{{site.alert.secondary}} + The following example contains three `BlueBox` widgets and one `SizedBox` widget that separates the first and second `BlueBox` widgets. The `SizedBox` widget contains a `width` property equal to 50 logical pixels. - + **1.** Click the **Run** button. -### What happens if you run out of space? + **2.** Create more space by adding another `SizedBox` widget (25 logical pixels wide) + between the second and third `BlueBox` widgets, and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/19ead147ab5c7668d7d32e1cfed90097 +{% endcomment %} + -As you just saw, when a `Row` asks one of its `Flexible` -children how big it wants to be, it gives the child -a max width based on its `flex` factor. However, -fixed-size children get no such restriction. This is so -they can determine their own intrinsic size. +## Spacer widget -One side effect is that there's nothing stopping a fixed-size -child from declaring itself to be bigger than the `Row` can support. -When that happens, a flex overflow results. You can -fix it by changing the child widget so that it chooses a smaller size, -or by using a scrolling widget. +Similar to `SizedBox`, the `Spacer` widget also can create space between widgets. -#### Code example +{{site.alert.tip}} + **What's the difference between SizedBox and Spacer?** + Use `Spacer` when you want to create space using a `flex` property. + Use `SizedBox` when you want to create space + using a specific number of logical pixels. +{{site.alert.end}} -The `Row` below contains a single widget that's way too wide to fit. Run the -code as-is to see what happens, then try modifying the width of the -`Container` to make it fit. +#### Example: Creating more space +{:.no_toc} +{{site.alert.secondary}} + The following example separates the first two `BlueBox` widgets using + a `Spacer` widget with a `flex` value of 1. - + **1.** Click the **Run** button. -### Try using SizedBox to make space + **2.** Add another `Spacer` widget (also with a `flex` value of 1) + between the second and third `BlueBox` widgets. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/bfc367aefde35e02ea5283efdbf58e60 +{% endcomment %} + -If you need a specific amount of space between two children of a -`Row`, an easy way to do it is by sticking a `SizedBox` of the -appropriate width in between. +## Text widget -#### Code example +The `Text` widget displays text and can be configured +for different fonts, sizes, and colors. -Trying making some space between these two list items by placing a -`SizedBox` with a `width` of 100 between them. +#### Example: Aligning text +{:.no_toc} +{{site.alert.secondary}} + The following example displays "Hey!" three times, + but at different font sizes and in different colors. + `Row` specifies the `crossAxisAlignment` and `textBaseline` properties. - + **1.** Click the **Run** button. -### Spacers expand to make space + **2.** Change `CrossAxisAlignment.center` to `CrossAxisAlignment.baseline`, and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/0ff109090b99ef1873d9fad501b2bc86 +{% endcomment %} + + +## Icon widget + +The `Icon` widget displays a graphical symbol +that represents an aspect of the UI. +Flutter is preloaded with icon packages for +[Material](https://api.flutter.dev/flutter/material/MaterialApp-class.html) and +[Cupertino](https://api.flutter.dev/flutter/cupertino/CupertinoApp-class.html) applications. + +#### Example: Creating an Icon +{:.no_toc} +{{site.alert.secondary}} + The following example displays the widget `Icons.widget` from the + [Material Icon library](https://api.flutter.dev/flutter/material/Icons-class.html) in red and blue. + + **1.** Click the **Run** button. + + **2.** Add another `Icon` from the + [Material Icon library](https://api.flutter.dev/flutter/material/Icons-class.html) + with a size of 50. + + **3.** Give the `Icon` a color of `Color.amber` from the + [Material Color palette](https://api.flutter.dev/flutter/material/Colors-class.html), + and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/01688fca8c13f85d93078054af2e858b +{% endcomment %} + -`Spacers` are another convenient way to make space between -items in a `Row`. They're flexible, and expand to fill any -leftover space. +## Image widget -#### Code example +The `Image` widget displays an image. You either can reference images using a URL, +or you can include images inside your app package. Since DartPad can't package an image, +the following example uses an image from the network. -Try adding a `Spacer` in between the first and second children of the -`Row` below. +#### Example: Displaying an image +{:.no_toc} +{{site.alert.secondary}} + The following example displays an image that's stored remotely on [GitHub](https://github.com/flutter/website/tree/master/examples/layout/sizing/images). + The `Image.network` method takes a string parameter that contains the image's URL. - + In this example, `Image.network` contains a short Url. -### Wait, wasn't I going to learn about Columns, too? + **1.** Click the **Run** button. -Surprise, you already have! `Row`s and `Column`s do the -same job, just in different dimensions. The main -axis of a `Row` is horizontal, and the main axis of a -`Column` is vertical, but they both size and position their -children in the same way. They even share a base class, -`Flex`, so everything you've learned about `Row`s -applies to `Column`s as well! + **2.** Change the short Url to the actual Url: -#### Code example + https://github.com/flutter/website/blob/master/examples/layout/sizing/images/pic3.jpg?raw=true -Here's a `Column` with some children of various sizes and its most important -properties set. Try fiddling around with them and you'll see that the -`Column` works like a vertical `Row`. + **3.** Then change `pic3.jpg` to `pic1.jpg` or `pic2.jpg`, + and run again. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/b6f3084800bd139cdb522b8858bb58b7 +{% endcomment %} + - +## Putting it all together -### Putting it all together +You're almost at the end of this codelab. +If you'd like to test your knowledge of the techniques that you've learned, +why not apply those skills into building a Flutter UI that displays a business card! -Now that you're versed in `Row`s, `Column`s, and the -important properties of both, you're ready to practice -putting them together to build interfaces. The next few -examples guide you through the construction -of a business card display. + ![Completed business card]({% asset codelab/layout/businesscarddisplay0.png + @path %}){:width="325px"}{:.text-center} -#### Code example +You'll break down Flutter's layout into parts, which is how you'd +create a Flutter UI in the real world. -Every business card needs a name and a title, so start with that. +In [Part 1](#part-1), +you'll implement a `Column` that contains the name and title. +Then you'll wrap the `Column` in a `Row` that contains the icon, +which is positioned to the left of the name and title. -* Add a `Column` widget -* Add two text widgets to the `Column`'s list of children: - * The first should be a name (a short one is easier to - fit into the small window) and use the `headline` style: - -```dart -style: Theme.of(context).textTheme.headline -``` + ![Completed business card]({% asset codelab/layout/businesscarddisplay2.png + @path %}){:width="275px"}{:.text-center} - * The second text widget should say `Experienced App Developer` - and use the default style (leave the `style` property out entirely). -* Set the `Column`'s `crossAxisAlignment` to start, so - that the text widgets are start-aligned rather than centered. +In [Part 2](#part-2), you'll wrap the `Row` in a `Column`, +so the code contains a `Column` within a `Row` within a `Column`. +Then you'll tweak the outermost `Column`'s layout, +so it looks nice. +Finally, you'll add the contact information +to the outermost `Column`'s list of children, +so it's displayed below the name, title, and icon. -* Set the `Column`'s `mainAxisSize` to `MainAxisSize.min`, - so the card won't expand to the full height of the window. + ![Completed business card]({% asset codelab/layout/businesscarddisplay4.png + @path %}){:width="275px"}{:.text-center} - +In [Part 3](#part-3), +you'll finish building the business card display by adding four more icons, +which are positioned below the contact information. -Business cards often have an icon or logo in the top-left corner, -so the next step is to add one to yours. Start by wrapping the -`Column` you just created with a `Row` widget: + ![Completed business card]({% asset codelab/layout/businesscarddisplay5.png + @path %}){:width="300px"}{:.text-center} - -```dart -Row( - children: [ - Column( … ), // <- This should be the Column you made in the previous step - ], -); -``` +### Part 1 +{:.no_toc} -Now you can add the `Icon`: +#### Exercise: Create the name and title +{:.no_toc} +{{site.alert.secondary}} -* Above your `Column` in the `Row`'s list of children, - add a `Padding` widget. - * Set its `padding` to `const EdgeInsets.all(8)`. - * For the child of the `Padding` widget, use an `Icon`. - * You can use any icon resource you want, though `Icons.account_circle` - works nicely. - * Set the `Icon`'s `size` to 50. + Implement a `Column` that contains two text widgets: - +
    +
  • + The first `Text` widget contains the name `Flutter McFlutter` and + the `style` property set to `Theme.of(context).textTheme.headline`. +
  • +
  • + The second `Text` widget contains the title `Experienced Developer`. +
  • +
+ + For the `Column`, + set `mainAxisSize` to `MainAxisSize.min` + and `crossAxisAlignment` to `CrossAxisAlignment.start`. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/30ccbe0fcf31cc10eafba3aea8ff0697 +{% endcomment %} + + +#### Exercise: Wrap the Column in a Row +{:.no_toc} +{{site.alert.secondary}} + + Wrap the `Column` you implemented in a `Row` that contains the following widgets: + +
    +
  • + An `Icon` widget set to `Icons.account_circle` and with a size of 50 pixels. + +
  • +
  • + A `Padding` widget that creates a space of 8 pixels around the `Icon` widget. + + To do this, you can specify `const EdgeInsets.all(8.0)` for the `padding` property. + + The `Row` should look like this: +
  • +
+ + ```dart + Row( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Icon(Icons.account_circle, size: 50), + ), + Column( ... ), // <--- The Column you first implemented + ], + ); + ``` +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/95dcc1451aea8412669c41eb8a1a5f23 +{% endcomment %} + -Your first `Row` is now complete! There are two more to go, though, -and you need a `Column` to put them in. -Wrap your `Row` with a `Column` widget so that it looks like this: +### Part 2 +{:.no_toc} - -```dart - Column( - children: [ - Row( … ), // <- This should be the Row with your Icon and Text widgets. - ], - ); -``` +#### Exercise: Tweak the layout +{:.no_toc} +{{site.alert.secondary}} + + Wrap the `Row` in a `Column` that has a `mainAxisSize` property set to `MainAxisSize.min` + and a `crossAxisAlignment` property set to `CrossAxisAlignment.stretch`. + The `Column` contains the following widgets: -Then, finish up your new `Column` with these steps: + * A `SizedBox` widget with a height of 8. -* Set the `Column`'s `mainAxisSize` to min - * Otherwise it'll expand to fill the screen! + * An empty `Row` where you'll add the contact information. -* Set the `Column`'s `crossAxisAlignment` to stretch - * This makes all of its children full-width + * A second `SizedBox` widget with a height of 16. -* Add more widgets below your `Row` in the `Column`'s - list of children: - * A `SizedBox` with a height of 8 - * An empty `Row` (no children or other properties) - * A `SizedBox` with a height of 16 - * Another empty `Row` + * A second empty `Row` where you'll add different the four icons (Part 3). - + The `Column`'s list of widgets should be formatted like this, + so the contact information and icons are displayed below the name and title: -There are just a few steps to go now. Next up is the second row. -Add the following to its list of children: + ```dart -* A `Text` widget with a street address like '123 Main Street' -* A `Text` widget with a phone number like '800-123-1234' + ], + ), // <--- Closing parentheses for the Row + SizedBox(), + Row(), // First empty Row + SizedBox(), + Row(), // Second empty Row + ], + ); // <--- Closing parentheses for the Column that wraps the Row -If you run the code at this point, you'll see that the two `Text` -widgets are placed right up against each other rather than at -opposite ends of the `Row`, which isn't right. -You can fix this by setting the `Row`'s `mainAxisAlignment` -property to `spaceBetween`, which puts any extra space between -the two `Text` widgets. + ``` - - -The last step is to get those icons in place at the bottom of the card: +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/c3ac34ed8952724a0ecb0af1445c2af8 +{% endcomment %} + + +#### Exercise: Enter contact information +{:.no_toc} +{{site.alert.secondary}} + Enter two `Text` widgets inside the first empty `Row` : + +
    +
  • + The first `Text` widget contains the address `123 Main Street`. +
  • +
  • + The second `Text` widget contains the phone number `(415) 555-0198`. +
  • +
+ + For the first empty `Row`, + set the `mainAxisAlignment` property to `MainAxisAlignment.SpaceBetween`. -* Add four `Icon` widgets to the last `Row`'s list of - children. You can use whichever icon resources you - like, but these would be a good way to show that your - imaginary developer focuses on accessibility, - fast development, and multi-platform apps: - * `Icons.accessibility` +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/c5be61116652927c5d92262fce1b5360 +{% endcomment %} + + +### Part 3 +{:.no_toc} +#### Exercise: Add four icons +{:.no_toc} +{{site.alert.secondary}} + Enter the following `Icon` widgets inside the second empty `Row`: + + * `Icons.accessibility` * `Icons.timer` * `Icons.phone_android` * `Icons.phone_iphone` -* Set the `Row`'s `mainAxisAlignment` property to - `MainAxisAlignment.spaceAround` + For the second empty `Row`, + set the `mainAxisAlignment` property to `MainAxisAlignment.spaceAround`. +{{site.alert.end}} +{% comment %} + Gist: https://gist.github.com/datafoya/dae36611fc9af04c4b9d0fbc3429275e +{% endcomment %} + + +## What's next? + +Congratulations, you finished this codelab! If you'd like to learn more about Flutter, here are couple of suggestions for resources worth exploring: + +* Check this [list of sample apps](https://github.com/flutter/samples/blob/master/INDEX.md) +that were created using Flutter. +* Visit [Flutter's YouTube channel](https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw), +where you can watch videos that focus on individual widgets +and see how developers all over the world are using Flutter. - +You also can download Flutter by visiting the [Get started](https://flutter.dev/docs/get-started/install) page. \ No newline at end of file From 84d06d3e3afbd3a3680d04a8fca88087cb15920c Mon Sep 17 00:00:00 2001 From: datafoya Date: Wed, 21 Aug 2019 09:06:12 -0700 Subject: [PATCH 15/18] adding kathy's changes --- src/docs/codelabs/layout-basics.md | 46 +++++++++++++++--------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/docs/codelabs/layout-basics.md b/src/docs/codelabs/layout-basics.md index 13573bfa7d..51d9c53024 100644 --- a/src/docs/codelabs/layout-basics.md +++ b/src/docs/codelabs/layout-basics.md @@ -407,7 +407,7 @@ Flutter is preloaded with icon packages for [Material Icon library](https://api.flutter.dev/flutter/material/Icons-class.html) with a size of 50. - **3.** Give the `Icon` a color of `Color.amber` from the + **3.** Give the `Icon` a color of `Colors.amber` from the [Material Color palette](https://api.flutter.dev/flutter/material/Colors-class.html), and run again. {{site.alert.end}} @@ -434,7 +434,7 @@ the following example uses an image from the network. **2.** Change the short Url to the actual Url: - https://github.com/flutter/website/blob/master/examples/layout/sizing/images/pic3.jpg?raw=true + `https://github.com/flutter/website/blob/master/examples/layout/sizing/images/pic3.jpg?raw=true` **3.** Then change `pic3.jpg` to `pic1.jpg` or `pic2.jpg`, and run again. @@ -442,7 +442,7 @@ the following example uses an image from the network. {% comment %} Gist: https://gist.github.com/datafoya/b6f3084800bd139cdb522b8858bb58b7 {% endcomment %} - + ## Putting it all together @@ -450,8 +450,8 @@ You're almost at the end of this codelab. If you'd like to test your knowledge of the techniques that you've learned, why not apply those skills into building a Flutter UI that displays a business card! - ![Completed business card]({% asset codelab/layout/businesscarddisplay0.png - @path %}){:width="325px"}{:.text-center} + ![Completed business card]({% asset codelab/layout/Completedbusinesscarddisplay1.png + @path%}){:width="400px"}{:.text-center} You'll break down Flutter's layout into parts, which is how you'd create a Flutter UI in the real world. @@ -461,10 +461,8 @@ you'll implement a `Column` that contains the name and title. Then you'll wrap the `Column` in a `Row` that contains the icon, which is positioned to the left of the name and title. - - ![Completed business card]({% asset codelab/layout/businesscarddisplay2.png - @path %}){:width="275px"}{:.text-center} - + ![Completed business card]({% asset codelab/layout/Completedbusinesscarddisplay2.png + @path%}){:width="400px"}{:.text-center} In [Part 2](#part-2), you'll wrap the `Row` in a `Column`, so the code contains a `Column` within a `Row` within a `Column`. @@ -474,15 +472,15 @@ Finally, you'll add the contact information to the outermost `Column`'s list of children, so it's displayed below the name, title, and icon. - ![Completed business card]({% asset codelab/layout/businesscarddisplay4.png - @path %}){:width="275px"}{:.text-center} + ![Completed business card]({% asset codelab/layout/Completedbusinesscarddisplay3.png + @path%}){:width="400px"}{:.text-center} In [Part 3](#part-3), you'll finish building the business card display by adding four more icons, which are positioned below the contact information. - ![Completed business card]({% asset codelab/layout/businesscarddisplay5.png - @path %}){:width="300px"}{:.text-center} + ![Completed business card]({% asset codelab/layout/Completedbusinesscarddisplay4.png + @path %}){:width="400px"}{:.text-center} ### Part 1 {:.no_toc} @@ -495,7 +493,7 @@ which are positioned below the contact information.
  • - The first `Text` widget contains the name `Flutter McFlutter` and + The first `Text` widget has the name `Flutter McFlutter` and the `style` property set to `Theme.of(context).textTheme.headline`.
  • @@ -534,12 +532,12 @@ which are positioned below the contact information. ```dart Row( - children: [ + children: [ Padding( padding: const EdgeInsets.all(8.0), child: Icon(Icons.account_circle, size: 50), ), - Column( ... ), // <--- The Column you first implemented + Column( ... ), // <--- The Column you first implemented ], ); ``` @@ -574,13 +572,13 @@ which are positioned below the contact information. ```dart ], - ), // <--- Closing parentheses for the Row + ), // <--- Closing parenthesis for the Row SizedBox(), Row(), // First empty Row SizedBox(), Row(), // Second empty Row ], - ); // <--- Closing parentheses for the Column that wraps the Row + ); // <--- Closing parenthesis for the Column that wraps the Row ``` @@ -605,7 +603,7 @@ which are positioned below the contact information.
For the first empty `Row`, - set the `mainAxisAlignment` property to `MainAxisAlignment.SpaceBetween`. + set the `mainAxisAlignment` property to `MainAxisAlignment.spaceBetween`. {{site.alert.end}} {% comment %} @@ -635,12 +633,14 @@ which are positioned below the contact information. ## What's next? -Congratulations, you finished this codelab! If you'd like to learn more about Flutter, here are couple of suggestions for resources worth exploring: +Congratulations, you've finished this codelab! If you'd like to know more about Flutter, here are a few suggestions for resources worth exploring: -* Check this [list of sample apps](https://github.com/flutter/samples/blob/master/INDEX.md) -that were created using Flutter. +* Learn more about layouts in Flutter by visiting the +[Building layouts](https://flutter.dev/docs/development/ui/layout) page. +* Check out this [list of sample apps](https://github.com/flutter/samples/blob/master/INDEX.md) +that were created using Flutter. * Visit [Flutter's YouTube channel](https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw), where you can watch videos that focus on individual widgets -and see how developers all over the world are using Flutter. +and see how developers all over the world are using Flutter. You also can download Flutter by visiting the [Get started](https://flutter.dev/docs/get-started/install) page. \ No newline at end of file From 13392e396c19f479e35e239de125ee9388ff9cae Mon Sep 17 00:00:00 2001 From: datafoya Date: Wed, 21 Aug 2019 11:38:07 -0700 Subject: [PATCH 16/18] stashing --- .../codelab/layout/businesscarddisplay1.png | Bin 5596 -> 57524 bytes .../codelab/layout/businesscarddisplay2.png | Bin 7870 -> 31283 bytes .../codelab/layout/businesscarddisplay3.png | Bin 8371 -> 51603 bytes .../codelab/layout/businesscarddisplay4.png | Bin 11073 -> 25052 bytes src/docs/codelabs/layout-basics.md | 4 ++-- 5 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/_assets/image/codelab/layout/businesscarddisplay1.png b/src/_assets/image/codelab/layout/businesscarddisplay1.png index 5f6d4faa3fe22dc447790fc0eb21672ec2e0b2a3..30175f73e2a059c91a5ac410d1feaeb353f508c7 100644 GIT binary patch literal 57524 zcmdqJc|4SF|2|w=NY)}Gd$trQOZMy`LiTNvP?m%&gBdNh>}#@T$%h+U9Rgouk$+3_xpGs@8g(v#zwk~^q1*R zoH)U#cTdao#EDbz6DLm2)13wWrt*^XWzBTn1dxLJB`^FWtnvE zU%9JgY$9-n)kK|*-B>;1mDpQ#mNVWOBCN*7sZpos>2IB9`Y5=dEO2e%dbCrl=sS^; z4xFWebF{X30HMA$07veqZkY?f&DuA(F(QLDU2TpRLr<%-{D12s@he!Ox_$-{zu71gf0w9`sBS7a z_^qop6-;VHlG<>jBaV)(aBMJ|>_EsuQ;H83`HrpBRzSxD(ArAGRoZ`Uis!x_yDs<< zPM*b;^BwQ^$||()O}SSXNVV4o9h1?Z_6<+3ig=a139JGVY(&`aRqL37k~b=Jl^0mY zH2DsOuma5Bdl1jM0l6F$nlgYk3ne#(+Nx0InPKo1a`0xeD*>MlZ&O^!_QjGxK7GPt z=9c#6vq5WBgq?;{t4AYwM{KvQ{1aplUN^Z{mpl(Akx+{iBg_s27Yrg4%eR*W{fu!i z+xRm5d@NpR)5^1TiSJL#clmPzWEg(jC8`SjPk9x%Ppc!m5IB7r>v}zbcK|*SAmYQ#bAhp&`VoIbd9t^0O}=5`b4!KWI59 z(k8pbcf8H#H!r)Bzn1JOSuOxP*9TtL96yU3{H|pv!IGFq8)gt9rnB%}%gdZmLCE3(B#Et*ggyS8BE-+CtkRip2z$n)k-GEhOYr}-o z3Dd3+JpAFRTBo>_`Vi}sy4gYA^guiu%mF4}*H4W%WUJGlRZH|rC}q20n0mRdFZypZ zj=H{&L@|c1gvxFavW$tb^pd7}&^6q_Z5N@{*uf?3j0kjj&Z=Aa>wPf z)L~9B3&Gij;m2e+DCl`3jVs$XAog>fUHQaZw#aXf`7QyoyY{RmB4=AwhEaDQ+An!N zZ~vPp7UDJ;yp)o=Tht(txDj#h#_P_YPX+%TGEvBEa zZr*i~^d%YF2D3WK7?k&rTQeSuHz(QXOzb1&*9 z($NT|9H8KvX>}UiE8BCX^#{2E$x=FGYPz>Eo>(1J!c|H({d$A7Mh02f&->Szd(F{Z z2&dbq>E$JeRR5*h^-&Wl-`Z(F_uC!VT*3CDc_BU!wu#Dbqql#YYDU{5@8H^YutG*} z1`MEMuM>4!uZw-#|BF`j#pnA}L@|5sj>dMffn=G(@c}B}`&}m5ZUNWs);U7;0n{Ep zb6M{sk~);5JZ)2Rq^(zbLlB_?WUqoXNr-L?xU2fPz)C83vcEjbtE2f#Y0r6O9#UF@ zMB~)tP)rN&!BFJ5{-moKc`^}A6LllJPs!i@z;pbu&Vi-LRo&<`VtNU}31u03ec}oR zwZbX=-jPA;a=aq8^qmp!gd2uq-mWOtvzmIoP@(phYox=kd`HGS{u7P_2b8dD(&IU_ z^~#gQrr$vkQ^F8YULXeJTR$P*8EZwa9+7b%m0u^B>6&wXC7*9!$qlvuVtr%}?=}m5 z+EeRpwF9Bta%>!{Z4V2cUBec5Qp2StR0#pwsUp+GX*lli!})+|QdIHH&A*rA*3h{u z43}h;jza2uono7mez!iSk4ZQAbw(<%6Vw(P)20)vZQqw>?~+)3(PKdoFYxd$|04K5&I_%4H`<1b6}omy?&J{G8q;=oSJgHdMu`CaJ->lp3!2->wd6Qq zCsXu6`Di-<=ea0mdWAZpf1(-g@70MyllK^CtP~kzE8TxdgkSp_Drz(#dAJgqx zT!r^!;K%(2+?is7bn+G^h&-g#LHvdgoSHU|Os{*)C=paNO$4>dD>B<$*MX=$Cf~6g z7f!UjJw8>q`Fc?|kU13CGh^DK)j(34zgvu)Np!<@BmB_wa7QQUg9*km z?yag&`O8cI69wg8?P;fGKAXY4D(l{#o-(8{$+N<~hld*^&CYNHW7M}h{-fmc*8Z~TF9t5yZTNvTmtf#JPex$++giO`)a^bAY42OCLc z>#tK4IsQ{+0du9|>f82gKUzyvHlDR_IQ^c55NCsrRlV@;_Qyc4zM>%9i~z?h`5^p4$6gSgdz zHNW?=`D!e^)G2A8v@B=3V@aD7uO0M6O7pdZtOV-2II2DC0+FKtix|fvg?zdk7TV`m zYYDmJNh%3FC{eW6RMOU%q+OOy0P2@Sv@i?ke70cZezoE}`-OLy&DwrRzlm(27h$U` z_fpkX>N`jSUe!n2e8)A_n|-!Lrm~M~ziYR8_#@EH>GoecUkQeRC2Xi?A4_F(k zae{Z;=w$S{v_ah8kvu*Kfw70V_|!R9F*e=pjo`BdiZ|-}lb$oY!t?@w!d4;*qScAx zBR2JpIb2@Rd>AX1HFC|h!*^#u9<_)jK%ZPezC~^;Zhh!DBEVpKbHTWS-yf^@wtxL_ z)5=Jr@CL8fH2f?=(vgNDRqHn!wda9~A`rGR>9DX)&`trN<)t{^i{bBW8aUvSZRR$b z7USEmB14E=zS9A1=il~TFFEZYjITh(!H(9FUsIuns{>!h@n!(LmB=-&V>?K*D8l?a zoq-MC2J8SrHOH+!*On*W-ihW~ahu2Hy`%we+UNQDX`|}%9HIUY9B}=LzF#s=VBWP) zg{&c6=R`-HNTs?eRnI^;Rwy(Oto zFs|cEFK_TDudq{x7=F4^VrQW!#i$(Rk80ry5a=3q;*<$|I}o0T{^=Vb&FsB;9;_?q zI^fwLDs4s3?w9ULsoPN41+LQ^AMv4)R|C#krLi|%QpEnlcF?AGQ)TtaHn=vXgl#ol zWMpM_v-JmUk4cYC#O$*|3=6tL_Ai8(-#5;j5PV-lXMmYf-z9e!q1f0zg-*6|N9tSK z=gpt?CSI~mC3e1G zM@T*Xn9w(?df_0}RoQ7dksxUm6MMnlQ|Musr0Gjt_OF>hRt$AeO}et&tz3|RU~o^> zeVAuB^@X~z<3!*uZwhoHFc)*T!ZJp%l_&G(qlIivrCc5a?sT^N0TiDitIm;j>v=4| z3;_ZEtm9?;jX*8Sr2Pwusb|KYe?N6=DD2SCU@uFVvst+EXcJ!E%fJ22i=Bp=G+TdS z(lvB0(Rp9;mzUD6*Bkhie^E}}Oz(;=G`yESEo9;=uUu(Wg$8tqf;V*tTK$wWKWX^8 z?qvcvS<>fX^G3?{gOG)b?xbs1)1+U{VNg5bl%7fnJD>M4u{ZhFV^VausEPaeRg!RM zn^c#0kfQ@G_T?>`zJ&CzO6N}UYD2Xz>4R6Zf(78}2%Ly0ceD`Qh^_g8fk~~xIgTv3 zZ|Pms}p7_X;-LF*^tbAB@tPni+-Blw&O^er*TMO@QYFGrix2U=f!q=UpT6;sX*%_Dx zpSI+RVteO$*J3EK^nJMz6giA0f{@4(IbK9&T`<#aK_nS#Fd)OPs&4eJyoY}{S`9qvi4UH=Y^c!7li77cK3qCJe?%8 z$=E8u@&Rv&fu_r)?9QlQ*rIY2-@K@0EKQAA{zAv~&}b>gjtBT~MH?$+qr|33zIMI_$OJrYo+=10VA$ zC^ULYyd-qiSD_+B}tPPU%vMOm0dZQznKh8GfK2y+oy@x)FB_KbtyTmaQt>TVL3p_41P* zG0oSqSIxjrf0mhG0`8556Kgm~aDv`=809Qb(;J1HbJulZ;jGZvr@Qbio#U?ffi@p$ zB=9eDz3gJTKAm0K^V_s)`<)HdBAocv5d8U6kz9S!_L4A-x~dua(CQahrlmuIQU@7L z3Yn-z_B~_&KKbc`jHg9h9ga&GwaEX&eB+g>RQU?OCPLDc_? zedTzSTd*XABr?hWvTa&=gWj|b7%wUepOUI7M&2COB8b&GqfMR~{=DJ-#zY4y^H_I~ zzo8r)V}#w&$#4Q_td&Pzb_g84PwH*zUW)anE1H~fq|(B8M2aMr6|dhD2S3Q5@RKIw z=Qn|w5A4yJA(3YFqM{pUN$F3=8VCazMKTgUS#nH4^19W$QECMIS-!mw?-pVI6Rypo~^ zev66j!-9!Dy|u5ywuvr}`9*KYLHA>_Mf z_o_766I@q0e0sUsAq{L4CX&nV`Z@CMW!zKAXtO8A7d%Jg-!o_lhE}e4LvDvru-rxI z_f0w8%*CdrID0Crt(aR${mC|T-N|F|kL9tkjn0+|{!9xxwm+2b&0rd~IrFn<>&3^Ng+sUnnpP%M2&v|Lr8kr1oc;;Z={Bntu z-`^#Mm++{uuT$SAm->2wgItolJ0vPQ9@K;aWtp|a%)q|lZLkA|L!3){b3iG#Rj)8} zCcTX_P4s)AWSpxVIvj}1l9`mL)-V?$mpdot*sDZewOy4&o91?nBJz}>*;Vx5oyFLs9S=HE z0~2OOdh~{(@DpIrj_%x5KblR%<)gk`-$B#`W|5~fw>`Nn!>tEnD044I426i60>4a8 z6>}+RsjEWKSA^sx0q!s;_kjVl>ZGpNw%ZMjK_mQ}06Z&&Vq@zSvdA5LzDzFs+?aI6 zE>F?vd+*j-<$3h34&EV2$5W=#$86M#daFtRYQ*00v)#Gr#KzC%x@5XDLZj*7#Vqm4 zmHEz_>8wZBbvRh}ZhCFRU$c{sr?kL6!@0fMyqCJxf&Bd>5mkJc+r>lnv0^8ydlaY57b19I zq+Zp%nqaY6pBddxCm4m{+|L=VS|o`6eI$qFvKgrrNPltudNI4qyjo9hlx(voj_ zouvbKNvr4vCcrltWWv6;T}{{kzcdd1E#osDDB&@d4qFe{ZS+1=0cvyy%sG8MrzcsZdmZ^}>C*1F=7#scGdW_}0o49RddJWI3qy`cF!eVK*)e&NK z6jJ7U&2Jv9A}ORXVWL*-vTy(|#CWUKG#+2-SJSwb2BW4H0d1}}j!JTq?oO$_g@nqE7bTlCm14}Sw>Ojy**4?Vy? z-ndP_km@_Cn3YC3XnoP&L8HbXcr6ww^jH@`E-lQ+yf!|PjMjGO5yb>R`n>9@$z93X zUVQ<1V}))^MDw*qTBVFfqql)Y;O82VeVIywN-$(qT@hMouM*4<3Q7B1vQ@1w2J_z< zs(k$X<;A1>3Rizoxgbqw@7u=F=1hnuhrVKhU66jtB9L9H>>5=Sfb~_beKSEH!EFe& zACR`(@O~dU&_7H7M^|+jq_A~7W-$9*4toqw^u|rX3 z`oC5tBx3QVpF+&wf5JmFWmxaWKsDhB=wZE2a>wttLOBNvhLUCX3$srZB4ADnY@O$U z0@RS6MkhYQ@CiHev!{PED>iGVJDT6*;IHWh0E%t~&*WNW3-jn(8cv9f!G z)}{uR6Z4~c31f_R)++0CEV`IUj2ciBXDZ0`YqeWa#WEe=7#X8cbs-FQN7L7w95>Vm zE|Y9w(&mat1aX%Wi%SQ0l0^fsWhD`mYH5<6oi-@V^>BlZ5u#p}y`=Gi%@_M!cjO3Q zcj_8Hj3}m{t65xjRo3KLB~HF?Db09AD`dyCsIL@6-)A)ue; z_D{OnxwMw8Wi5gas=YaNp>d0C&K|yu3en{?gd)iDBie_;u*K3To)EJx%(QXyS2b zZ#C8?`Q+Q=VD!r{O0_8I6F(?;qoEQZ4#fqdm3I7oYIBV7{?)N(VENnqSTP0U zFegcOMy}W%{VAK?iMJput9Q_AQ{rX#ha-SMS*KJl$kio-#umT@2R?CCU(KaW;{^c_ z!}yMpQIhTXq-x=@0DMgk3dx;^dHvx0$hIyduE58pa}TpugxS2F zdgmmf2Xvvc7ZuiaZpuZlpE{`cWi$6=z%`68D9`Y-<4 z;L6Nkhq2z8gJY#hbO$^x`o-f%X|&U{u2X~hP%eHl!>3q*L6cQSN3WV|) zN_6Fm_=8$}-*kF38PdT1ryi6&Bb-K4{b)oi{0X~qdU@rZ_}hLF1)!;A%TwL(9g{vh zZg$}hdrR7Q-q>76zseUcp%M1wGKt4eE2X?rF!i7#^w(?J`0L3+Z8gX>Y=E15te{@B z?tnfthv_DEW{3(4B_0k*QweHTO#16pphvc?UlhFo5U1_WnEou#%r{$X`ZEEs->xNr zx|;&6EVZSdO3b&hcSTz^Gjn$>eTW;la`2}dy@xlLTz$AJhrf^+BNk4XyXdojkm}Mr z<>N+vG3$pS#8=VR(c8pLf!Mxhrcne_AwBHmn;AeO3*S13Ap#Izy#c98t_({u2{Zij zUcwQufxGdkPJ$NAL*|8;i>6&u7Sik1!p@G96-Lmwy2S#yoz8VC108b}9&JoWx(zQm zEqQRO`an4s9js}z1@voX$PmXh`>@zI@qxQ4S)y*)cGuVnJlOK)Qky|#p2_uI5R6V`_g#ug(Z(%{#w8zLh)U=zedYla|l! za4S;HuB_vUmT~ioy4}LKWDWk17i0JmYVreAHM0+2>Y-JZ2t=Olx}QD$Rr=7^k15IN zZAB?j2RTE8FG;&VOTIKg1FIyo?*|LE_xyGx5}XK{3lTl_vLT%IfZC@ozOzD|{{S1j zyQg52y>GuSlL96&$rbnf>fih3&6XthG_Y|SpWVy4DW9gAbF%4L(Lltt&`$|bRc^oQ zgj51`6H|fU^8iZja?*sZ1PsE0HvtlmU?M93?-zzIr)$J1e}ZUxu<2gSi(CDa?l8se zcKw?v?`EQkGcSgNb=nuH68x^|O<09sx+WBtagi6_y6+3ky2rqtZ>f$v|0hY&RnDYF znyb#08i=VbuqKoa0$C>Q+~in1HN`!&b|4I`$hXZi8i+;-z`r7J;T#SVdQkDJ@h7qf z`{jw~V>uTA4WHoFDI@8B_lDBdh{xW5 zGGwgVK+aZe3cNfIa;4+4 z0K6^*^tq!&P|$9Itaq7u&W1g!NCB}_eY-nm-Y|Rl;z{+08?F1ce|EMA zi;sqQ;9sYBKd;`ity?W``L0=aoyOy9`dYK=XL%yZR6}7{Dv)}r7`B>RVb|_bM@q~i7k2r=1UrA0a?;x@>cEzan zlaBx%w4Bi$())5Ci=uep{(Px6fETt)1mKw2`AELGX>?nc55aYy?)f7MtNGa|y`Gyu zUzKEk(Td`l2l0oUm}8g&bsJz__T^1I?fS1<#>jT$-TBcJny+8mO zS?f}UiS{Qvl_MaH8j8pvt0pdUvIrzfkn^Ji9Dn)^h z3H3Lb&Y9KIVe z05js-#Q}~!(3lv|MrKCrE1q>p6;!=J($+tiNmFgXL=yT&Caoi`_( z5;laHpvP@1Dln$mtoI)|Ed|~gZrb{u&dBQpyK6v?x#K&6zdy{q4P8;oVGbR|9ajz*vsPjMIV ztu2_w?aQ%>DOq@5e4prp-9b96XXC6zBy^AG)a@H2!e$-?BdVJ_sUqIDYU=j9ZM$d6 zV0_Hw8;yE)gtE*AP9kJ1Hm{!6Nm=~lxQLFZ7K^w06TOSo1EsycSn*08o?`rCx+f0W z0;AT87Udq``~Q0Vfxwk7zG}*vn69_{S;fIHVFl36wR>uBv9y~7cZe40-H9lNp|vXS zHGC*yxtOEgw3{EvJ2jm?k_^hLLlLx9*V~D64Y7HCu?K?~zn|e@Hy>zzjyvbIUOIBC z()?SRz|&!ZTf*%Qr{kH;k0DV_TvEN$~u*H z0^%7cj}GxAba8aN7>S5YPdC*4ZGynLrJ##1`{otQaNc4$UldKVPFnW#HIWfJl`0LC zgP8R8b>|%OB3EH}uJFqyWR}Mv{~B9@zfzX3b);CisuM3=-`Z`uK(+bjbJHuL;IrZJ zsQd?I&r`+BN0MGBWcHNdIt-6fgy_Bd(lo1E**wD>Uh3s3pC`4uf_@+C(KAyOMi0%+ zaz#m=n<$RG)yIE%U(KO$UydU^oP)Q2sd5iXi>!qeNBRkr1kyQ9x?xb4Rk5XoLFmbe zEG2sTbX8>Fe)|^(bE3eV2}winBkf`ISoCm7CCe1 zp6R-URjlYh20DA*GvSZfu#VM<1Mqv@o?6l9igw^Wv^gLXo_%+(%*26x9q-8Xmi+` z@u9{`jGr~q+-Cb82#r(^-RVjYEZ(r8UH&F>2DNMm4Y#*}L2{)IwRD7D+>0f+=NLB) zNTk!9bb?TIVkTF{?a(3GC$uhy9E{}gYS{p?5Ly3NBcP_IpOcnRjMmNDsZ6%)>AnmA z%4zpzoT_qh>@CgZC4k?_{8rj#oooHmd$4=l=$3J4q9@`g5h{&iN36RCq*VXh4R@XJ zLhO0xcP}Tfolu-99p%PMm8GV8&Ur zm^k=^5pupvpEVr9+HU@~ZvU$TX`oZ{=;jNVZ!XM!o2I8(yA#o4BJf8>d4UV>oHSQF zunz*eE|vp>gjp1`U7cU`?kKw1WCD)Zxe8}6iE=_`ZU^h!X|D76%(k)MHyL_-Sg|vx zFmQYKU5NhSEy>t;({G7)-(9v8Qs+kS)3XZRSMU#ELo(DZH4n@5 z#PM~-PsHC^2&ecHdszyrr8Db?#tINHx9dB5ih&>(LR_01fSDHeb$r$@8LCqH0_ z8+Kv)D|sz$=oyj90;=bKy9WhHz7*;|JQS7!>m4$j%Yj%aS{d#jA+n`Vl zRKUT<(!Ez6=0Fct8=fz>j)y(H{8M$W!oCM4M20W3ZaCi4h2}ou zVZ=EJ-KC7-GkrXCC*VH&?11AbbkHwjKhzP?O ztxHmO!!dC-z2jRf&SQ#cjlz|l!*6t>z9oLI()i6H7v}S{1<<`XwUh6dKD4Oecqd&Q zU@`nu2LQ&Qur~w0qYd71NQrNbDCCNncypHK|A^T{TG>e^zj@~s-$$d{Tl>;~E zu+ISsgyd%$=s;-^6Ejf(xFP&u6cNawHXT1~#pPTHHJ{A|-fF7k2*8PUUJR{^%Bns$ zOJw(MyrH~l*Ckl0Wx>6H)lkUB0TDp^3XGniCXE5oZCRu^Hi)JzWe~C?} z{u~JT@zYq{wJzzrP?+BHc>)RqO0f}8_9?+!5;Vc+KpK%T^2uHYgB) zzc9UU3Ez4J?_T%i+4=K2FN$lvrGI~AeETQkc&~Dw*P^WUu$YS`YWOOqQD8Fa?eEz9 ztHGxD>9&{^<3MHi%+EcN%yXK&_(VnJMB3meQ9(>2AD)5B=U}rcS?0T(@%VNUsK}d*l;&H14b$kQ zY7!;ZI`Ya@L!Eu6QF`?Ltz|at)0?kOF_p64ie{AZL?6_s0-H7U4)K!qJXjNP05H`i z9|jfIDix(d@0pK1LwN0|4#uV;`%8853$%>f?vEaKUF+jrIhTb@S&ohuOhUlu-kXPY z8O8|054y8AThuh)UYUFr-{Hn@=EFvEw#pF>{}uo~;_>?w-6Z=~j4=l^mt~@J`4z-y zH>FEwr1%(UXEVrE+=W&hs^Tm7=VUM_E3wC);-jLNb<*?%tzx+*@A?ZG$F4C*`8?!m zYgztX4|KrTvy!{668-Nf0S(67&S$^u5!Lw+X>rn-JYwbT!8?Vj17CMU;-a3$GL0uf zOyMc-QU)y*zCqmYiUs~DG8R7m7ErKXdAvN8na=pZFU_>k`tG~=`I>X*$8Jbn^4E@V z+1~n5k;8Vu(ZYTsq~~_7iDhQ?rPNC%=i~D~{yN95873~vcILb4nebcp&wXq&IbE-7 zaw%M+KEWjR@z;@`V@5rkfl{&<=yvn-vXiHWYqyeim-StG=6O*H1( z*HJM@l0}+lUvo9dd86saGvAym@{Mf1g}*B-r5TglzLM&5X9?8^S*L?*iJ*wPryDAA zhTAyViZ^H#h6TTB^(Id4iZ0%DND}XP6)P>$Q=BAqU}#eOr(dM&h2i2_8jY%!{p+nt zRkkeCwSn7PHyKh0Q<_I9p@z9lhbJ@Yb+R8xzhm&Y_k{*ZuOo{bV%~7w&mrA=AM-wA zd|%LhfJiu>Q8tiUme3yQ3YJrF=Mf9+-THds5%hbw&K6gGZ_dgzZTESCD{5w#d5V+T zS}=mbniisM0>k!~+z?WqX3o}R+*K$to`~v?!B<*MUgymPS1a(2Rr{No6)QadWTqo# zpv=wY8=df3Q5%Bs5z5l2GZWGl6MwAip4vHl=k7VITgl$}{2cQ>^Ar6OiRxZKBUxCv z=#C+sXhz{Q+FrDZ*VK&O4vq9~N9Eo%quWe@XPr}T3E7PV4`4s-7%g8OUd&}+?P3}c5F;NI(Ol(iOht82~bw&UlW#L$D`%#D=unqPN080Q*0 z{B7JvE;moP+k2iodrr5Tiv*2YP*Yc2(rv1*ppK_DFW? zz{JEP7P#F;odtNN*81Nj7u-}Ls9Ps72ROtC=)Ft%O@M9x_fdeGKZC&`ep;>gy89YJ zGnnb+0nNp~+&T#AiM^S-InwFwYsqM;P8Q(w{&gn4RTU$ji?&-@vU(HvZ`T?oz%wx$ zZ3j_+$GZZf`jX{vPq^v6aJ^y?I#6$d4G<=PAi4&4h5 zJ+6QsRNO$xPd{(<%sEdLoB#PBa5lftM;qvJ?&nSUK?@i2n!adlb`aaW44))TMXIbj zjsc{g{S= z8aoI85z=y$i)&3FH^ayNs|prBuBM~iCZ0L2kJ1{AP1vn#5^$@=+z#!2m|KfaGK z7}U=Xkm{PF?0gLkUxWuBFDfrnCGKt)4uQ^8l_J3Gm9MDaz_ODT%0GUZWYwtID^DSV z#_P(dHF=WUe=VVX;9};%+F(iflmJtQ>K9LP?eo8{jD;)V?Vzkbz1XKz``Qr`Hw9S=*{wvqB5!x znDSsS>+Rkxgo)}xlu$V}R5O8&fL?}4N`ted=n>T(GbM5T$pIkj*Mis$ous{D9I3l= z)+<8U@yQ_o{Njqv{d+AFy3~$$)KK}Y8j+R_kJuMV1qrI;^@lk@*s?Jy76UpN_I`u6 zx|*X|OgF{K06Lo1FK~Cemk;#E1yW}tS)?}e1h`bvZJrZH%`2`TO zUsM(KysxKKq$`|dU~b)Pao@;i`p=a%e%Vc@JWvHc>)i>gW^wJ#ukJX&w$KpDm+_Ks zPE(7M>I!pQ^Ga?5D%kq8mAbURq{jTeO{64yCCYX}Xr*M!?}AK|3U&U-w#?>VAYQ}V-aPbF3n!?-`C(*qDsLD@}WEO-1=X#Z%{@{ zR2za;l+f0PK&x{GpJFQwQ^K{?sY(P!02KWCfj9rD_Ls4m_!$b7( zVMN3Pb@RZejtf-pjWfq*a=jdXcYRz^s|ad0$zOR8JT+1d2vME;gV6ts1QRgOC&h0! z7%(eV@ag-uuG+!Ru!%jEUm!qePhd4m2&F8_Up;+rk~#3M->8Xh_bI-Ay;>mt8A5r$ zFZ+bkNAnReOfbLVEr0~EJ|x4BgI#v%Xkw!}mTq{JCGgqoexL($JikG_^B;?0gD@Pg z?A1;fccV5319NeJsnT-g%h|&G1p+g$^047Rr%yxT?#}g{Z%Plr6=swFyuL*A4Sgv1 zG7ccHv9d7mKv$Q?Eb(Uo^yP*l)l8W>seIyKmAY*j0A2I-QGV~OPFhP~-32Hr|LgX^ z;?AOU!72T4Gpa}D(j}LeCn|vJ6b2a9yqrZIJWUN8^v$hf!FgT8UuRGWuYSXCrOQ?R zB`h_5IoanTnB#N>^UtSC2TN>-1E8}HG-GIJmH_L-V}ND~9+)LhV-9kCzKf4h*Y6L^ zIiR~l$q$;Ip0mjN+FF|E>dFAPPb;}c>-GVa`@<4Hne_5K1!sOb3qHYNRZ`!BIj2MD zk_1R^_tBq}&G)&8Ri<3E;z-FW`HwwP09i9(_&l{~yN7!%aa;R}0yQ6aU^OhSe~n+u zB&JbT25RJhM1(d6>~%1=TTU}?KE_c4-5510@bRGRq`-X!<<#6J9-QR*-bW;OVFBnm zt0vW0sZbf3>V$cZaY?846!8VEbAO)itOZa!0S25OPQ14RkT|NF!~R9*nKChDf!%bc z{4YSuxjCT^uvcwS4W?7|5TTGHcB^k)$}qtGXYj}8_hXD5#GxEWRi*pQc=wung_5T$ zyZ{%)Hr;9BUqtxvVK5gHb(AO{r^0tkJ_Mj`_VK+`T%~|3XO3peB_-Mp%90ei5Zx-7 zC!k5~d|`Xlj=XbxFr4>lMIsuOew9~Lmp`nVTC;pv;C&9L#}m=bf1RaJyMc;(6HXOW zJ-ILO)+Uwn?8=OL!nu2qxm(Z&8rMs0L>UHufi)ihZqw4-l9;BjRZ%sF>}xG!Gcb)- zT2pL>-{bbvo!0=V6MZ=`r9Cb?f5O1MFM}A9!cKLq@(jpnZK8qXU%@y)&3YB5n3X>V z&8|6EUi?gj1Y^{P#biYQKn8(R>=Fr~T3LZ?GCT9tgBp!3siDtp_(CkY-Z~czc)bQ@ zS$+mCP(31sYvP5k?$EoLn1ANOCq|l4x8-eC%Tcji03^VCe`x9b85dGUw;vpny)6@A zcEg3w`NaokW?7f0n?l`G7qnuxpc7yM18}+fX$||_QNYk87vSY|(TzOb*wIie$+Meq zQer0^y`mYJWGmCD_ zj5OJdm^uCAxU`{AfaR}cIrUA5cRLE(wlg?As!#>Nq$fMg;XRN(;+5MQUZF}CeYDwa z%++}MMehInprr4aZtq_vK|b4Ao`j}O$r$=@7VY=lH@JWcV1x{ z6=B5nk?r|j$F)A#QP5~1uX&E&xV2vz!dkLE>pd6rCYDK=lpoEGF zj<#QC8dzUud46d|IZ!^*s+0o##1yPpb2bANby9l~(P}s#(U2#?6L0cnQOy8jw5nUL zQ>%_c>633m&XMf{X8i;po4J+aU1jpE-7PVc+V49@CQsf}2^1!BYw7U3rn>7_Qy(oM zU{`($#osBI+tKM;0h+tlwcOq!aL-C|`NbM>^$Asex%zOBo7EfKw^TDVmtBcOZtz2nesIufudp9}r_7JjdN&6b94 zBqvVZXSrnIrJeg_N@M|&v-A6qiXR5wi0xoq^Zn#!UVNS6WROdym=?sElQTyRMgkH{ z&k=n|&3mqyaN9h#JI&LQ$CmBEb8|vOUl7t=tsmJ|m69A)4SkCKitZ1PXm7EH$ZQ0+ zrjvtvtBqlLf~ zM_f^CZZ5>9Et{Nn2Y^5+Rl#awJz3d{yI;sT3tq_~1WOf^`&v6s`^xzyRX8W1Md-V@ zYB&1rc(7$P3Y=?uMDyuArVZ(B2l}#lwUt;s?il!_S>Pu7VsfE~&8zuupXk`6!u-#5 zXPGyTy6B^UQpSY(1qEY3fZbMP@2XQK7H2&#Pa{x`?4i%liQZ(OXb6Hq`CaQRf5TU1 z0~g~O7KE;SyPcFKw>wD$B2(~8FXw8W-f|*RLIc>4$7<|fe z*}~I4prMK@!G$45sEQdzg}MUtq!bz%;94e}o7Of2Gn?>->% z-+$8H5emTeKxU^B#1;1Z5`~@gE5q;&1=Q%s$4V?S#PQ1R!`sZ2PVO5(baR=7rHEAl z14UvRrj-*y0J#z)xH8Jz zYO)Sq>ackvgAszslWJX#vj4qSyM>G-674j$9LpH zaQ@%LOU%d{jUdmPrh(nT4|{$Hkrq^8?Q)gR#*_A@hQzCVrl=~I7JL(75^(}K3q+rC zz-LpE`&G`5`>2VL9SrWboiinZcA#A<;=*jAbL>b>tIU_@zkfo?99BY78S~sX^WjD+ zgwad{BjL+a*!E64)i~wn%^m%|WB2~CvBuTdPS`m7oUKSPFGe!IpwXOs*di<)bXjqV1Vi@Emk@E7T#55E5odv6ujR@Aj| zR%lC+0>ulZSaEk+q_|Vu9a1znez@%qir9q)I0 z*t?RpTlTceey$AOUM@4He3mqh8o5grR)t4tcD6@~p!y7^X`Y7ic#X#1`qqj8UAQ%9 zTvGhYrNU45*e4hNusP~8rc3-k8m6N`^wU?j;{F{G01q=b?i^ zK!E$bbEl^Nm1AV#Ah%I=Pw(j=KbHH%3K6wK&tenT9@mw~I{9e9y{!7$b*n$B#a0Iu znh|Z^N7j%j-Vb4vB$GOX0+Hb@qD7g2*MB@s#7z~L=uAttU7&|F)6>y4)?xkhmWwHB zV|~!O9F_a}2>VA7HmY=pYVBkKd)IMF?XuqMi-@%ThqR4R%cy&?WI}k4gE8uf|{5-WF`r^v3&X|LHBwMpR|bsVoioO!_dH$iDvQ&(Q90EN6!i z1*f>XPa;e@m|~WXq&kJ9vXE+F_?oBQFV~b-ClJ9S^|VU3Gz23+*<5R-KosuV_8y;( zwVE;*cq#JGlSw@p? z+>vK8&=Owxc7SvMm=k^FTIu*8xW^`Lz=EFww zr<0N0Qyjj0wd=bQf<3nt0haIf>%XH~VmX2q>yY3jL+r5M7h}$r4u{d1TTjaN=)aVm zSQF)h+T7qLmZ@w!5{0Hn%%o}WiCqUtTmh^gyE2haQ9ywkdg)BsPtt+FjX6KG07GRK zs7!Mzi~p_AX{D2R_63iMRoEb0R|$B}^?CRV+sKBTmC zIE5xiTVGFW<;x*$+tGP-zGw+TWH|O#V@qeZbr;EyZKw5% zkED?9K5!b&IOGsJ4DY%!4!u5|wsJE2O6o>`<-JF=X<(^y4v_iZG1C{Q^a=uD>N0J}B>+MlltFh?*snqRMOA>wIRz0x&&^ z8^&Zwt}Z-ZO$_bLgA_RXozM{i!m>;h#lxX7p~W8hwJ@qo^M`LLTOnD4=S%)^^T#3| z-%y{%#c1qu*FjwTcL41S3~BRMV<)vr;l+?5oY_mjY7|-7tagRxo zdeoU;!kt>_<~FZ18HQDQl)$#v70=sP#aX=_<6Km?LM3;2dTgMCNscBcNiVt6Pg<+( z;k0diYE7@V3dVj5tZsv=O6OtO$XobJKPOT&`*xjhMp@W*Z2i4`)^r5ptekRVpObK8 zSc5ZN{!kOc*>dAyjHbMu!hufoZIYms%FWV}X`F0&^qeP|ly{zp;4CaG9AaivOz~?9 z*?5g0Nbm-anqI;IrpFgfbVro%#(`@Ze0lcbGW>gRE=LzdB|TOkY2D&N5|@R^2Efx= z=UhKp-mJ$Cs4csYd8aG|AJ&i7*fO5`8lEyE@Ralt)zEqoO}w6!51dw$c%QIkzx)ST zewTr?dH&X;w_r=7>xWXIOa!Q`FqW!+W8Bp%-dS|PEV~BKYhRycCsDWPl~T{@<^I?$ zi{Sf$b7Sn;W2W&=cT(;6`ZBVFX32zRnr>2^{)M6z`3T&iMJ5sm!A6`>=KFoSu(_S= z2qpm{gJebWm#p+9i`2}xL>M`Fe2QwmjYNa$8#76#4$HOoQSy19`+b2+GH=n{eIc=U z(QRq?cR|~@%IyYY`Yw^IxaS0U!Cq;?-3AA#%r8I~k1Z|%Dps53_t$c87{a36EMvH{ zw-_cD&bJSLg<2qb={h<=XeQ!~AXRnzfzMMZJHq}^X&3i|4ePP*#3li`416ibrR#&) z(1!8}N8czBL8p)o9AQx+UfqUV^1@1yGiXh&kPu<2z>4+~q@RPLKG1}3dWx7X>!th7 z%|!M@NGj;_2o4h>KMfz7XtoYG3w|Xk+w*JYK1BYs{7^x1REQi>TINLBfYmRqJ5L0B zZw)@8Viu4^!y6J%V`}bB;)R<+4^22@{|u6@4flCGly%X-l$;QO2B-87arm*(VOmT~ zea!B2qRTISP4oLgoThXu#hqCOwIv* zv*Lh_kP%wb{@43~tE;$9UQ*V3zHpw=g+oDIul+&z)QnYEeS@Q@p7r6$ZyiWMt}~YU zIh4Ni4)RYf=D>6-;e3`z^5v$FO-#+(le);WUH8}+)5{NyIU;fUEAPrLxiH5F`d;^_ zolZ9I+oiXXPKdIwm;)Q&JD*M0S@D2nbk8VdWt~Sqv+P4lo&hd-fksa#d^Y(&*A1hx zM=0^58wO8+vfZ9Rbz9eGio%&|hcL zJH+XvjkuKXt*aEWg-)Q;9!cctf{4&lvZMKNZp4TQ*;C(6gNQf2z8}sY51I{|$~6cZ z<%A`@nuuUn4Q=YdiY{hin)rh?8N)<%8sw% zU9T+r)|}ZuFKDUD$_DqR0LtQMA ziz%iZx;87?$M`K7Lq*`up3Nr(gr>fj5<+bG?FAw*6b<{Jvq z1iMpfFvscB=o}4w;KBq8X z!jsiJU0fH*1}0ghM$Z{#3b8TYJ!z}n+Q*{`RlnPXTvxJv+PN{7%T|8}301PBkkMa> z+>^5$sPAQ0~BfR2ju6|%Y{8QreA5=nY>u! zn+Y2n696W7p6}+?i%AnE%LSEbLH`Vk!iGWbfmy*4L(9s+DE#?p0joxbkp<2VUFRN| zXj7L8KAZib(sHn+YOVX!Lo#B=`Ln9KEMwMonM+BWh134DE<$@aPTQX=<2sNts29DtF{=&F0zaQC5<0(sAbP9zg>u}IH@5E37M zGc^~)IHN!3lfa3_BkN-K=oN_95F~V74(}YSM-+1rICj=zqz2<$EMQX$7{h!+74NsC zdmJM8S$_59okf>4(}0?^iOpA5@lgvU0#>PC)$YN*1;Zi_H?Pl{P&cqAWgBOxz!%y! zKvkL8=ucyVe&#*6c#b4%ZU~RYg?eJ>f*gGKiT39pe>V*iFZqGL^iG4dU#O7aLh8zc z!Ti@2Fv0YtCcfX?BsNME!H@<=|3d5)Dq2qh=5$Wh$e%%K@D-$@Oj@(Qt0ej<%cs`#>viOQun{)PE)_r~#vpb$o8(cV7 zJJ`STGzhVTeE9uQ_yr{n4((>zWEixGy~nuqSSV{IEC_$cr4(glFNeNU=qp3hYGhK9 zQrTj-%D?itBy@3X9+;=1#4<*Y8gGzxAVRpUMm;`4!Mov8y~f=vhjl$^Y;01wgMBfr zHP&fyG*=f=8*P++9H@P3ltXGH{r$~7B({*8V{!x4FUgw3(fJyBeNU00VGyASJ$u?z z7EWlJA+636kZ=-*D=Yv~|24zlBXmwofrU=RLxYPqdzwqMYPx2M}s!V6#5lkYH5{u?L z(Q@9a!cYnSFeh;(F?BBFrEA-H9sc$O%&PrcCop*97HxV+n#xmcQB`Bj z5f?}c{;^fO9!}pjtu(hH`GMd%=5`)WQL<;U7yF&G+zI*eSyzv zvDoPZ4|Z|LH(@}35*FOpDSCPlSos0*kM1{4DmOfQEym@j!)f6}=92nXWTbL&7&@aDBvHy6DB2rnOI; zW`H}-2Jk&sonk2|q=bo*6e=7zP&r`vY$MwA%_{sf8W@0E-3fLn`{1_Fd*ekSrP0s| zk!R?Co6QuWI?sd(9XrWL*nOcvE&EzmCUK??M3v^wy#d>nfY(U;a3fC``J+zN!iR?{ z`Ulw3(Gg}{y+1{C_VzQbD zpot~*w-_`?`T{bM!P4rF1{Obs=q*4+@K6i>Gziy)MYfg)abz@K4o3&@NT&su6*A8F zx)qHuZJ?z)3zfmK4a57q)o+Y3H56o-Lc!Uw)-;8i27B+Q9OC=RS{{+xj5^6OjT5h< zaEaAe6{_(6(8x^<``spaHaCNIc;7aheE>vOzVc)Zez`$!b`yIO+koyR;+`u=O3sem z3VF6V2FhgZ!IwSDwC}m)c3QZUIBS%QEg|5^V1FN_Lg2iaV!g-`jwjL!v#u!`GRh+e zw#hQYg^@meWU?=C!n56IXP_(zC;r6NGO?kpyL^DZ{!~t}feLav=nh;Wc2jaqa1gHxP)rM8!jeGtBdcqbfZ=XOt_MNbZe1F>ID?h{EEYWG~6k} z;MIYtoFIXfa!gP2p%@5N9qq4-+q^Bf1syhpGV2_3inV>H_>#NY3z^-ipBG``8I`e zTKjFAd~lX{Zl+ADnA1%CHjQd-){6gNWb7fp2%XQTHWW@LB4b?;=R~oFX^l5bEDUko zE2S?>=zX?45_!Mp=-+@IN}0&qy>lC;7R+_+cqe!S66d}cH=KvrvAe%Elomt0OYW3| zsbd*iKi_}m@3zx)Ros%v=N0^md6E&xC0Tt+M6z8M6dQ73;51rk*kVe$DRH8j`^r4o z6@cwM%kFDlcLNFZM3`AF@QGjSQiulROq zJ%}qNCstdnChhG~V1u219gh1ai6up<6>ZwK@YQDomRii)As5GRS`VqN(k&S{Bo_iv z>fAOOm8}>LqNRvJ$P9h7|IX8*jM}ea(crMdMK#t+`3WZ7CYT)NJs`&0Xzmcw`$D

a-Vs3-fcAu`S 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

Q>5FAC&Y$o8m%hK3>p2cp;cp-AOUO=| zp(W*e_?E+s6+r8_3w2G|(e)p(OCKOKb!A>9cOVTQS05G8E zzkg`V5c!y_G67+&wQ8Kc;AiUwe*5iO4C-D|u{&%Qr@b+LCN%ZXl5nS&R2EqFo>V)Y zNC<6WXax&ijq-sCD(?hyf*_FP^jOK{# zx^BQhYyx%-dy&%Q`)T#2eNfJ=Em`k}uEj|vs>|B_l5&soQ(NaQfS9p{2p{!GGE4eP zAh8zC?wyJ2S;Nld6cbfi^dVOHf#*<}i9Y2q+pAI7Mgn_wus5CWxJdVgR^le=Ym>IH z6748^@5@-=tTETjrzOfCO>;7p+$T)eCCXch5Q$rC5hK25S=#$jgRtK-BS!g}v5Ndu z-Bcj7`hiTMt^oTGWC#Le^>&E@$-RQg*xPm*kD!puJ6miEWT$7R`{yS z_E82q_O(8XMW-=a$C~R@MLT0j_bH#RgPawDZj-rkW_9a@R9Uu#(H0$j0|g&! zzm6lld-$+ZGz{%z z@9~F?DE@YHst~f5q(F0q|I$ICVhJ^ZU7jxneMgA~~v zM)`pMh<`El5J_`n`@O**T(lp*X&Ly$(P$5QUMdLQz-pcT<-;s_J5RKQOn501G6gg6 z=sJOFdgv*Fb#prjw1x&hDNuclPXVo)C>EDv2=RhE{BOU@KPMnkXuY1LM z3o`bD?L4Akiizatq04@j=a4Dts(QJ0qt{h&lV%vygZRD|rprJQuuWXvx~aIUGFxGD zKZ*XG5j{gsub6#>D&L8A7Ak$Y^G^RbT~%>e{jdcV!@&UGX;1UGt2F9shJ~kx@*2pr z@T0zU1ise7k%>uE7F?#mp5fe%5RxYPB|f8jR*kZ~%I(K`;72w+rk55M!txwf+(_)N ztXEpd%rS?99I?qEa61$$fah^q)pE=7(IKg0HgdvN!%|@_ve1ue=5?zQJ1!4=63*z1 zRbl9x1^U?@JUTbH3~UP2({;JH@h6THrP8S%r7p(D0}b2OEZ4g8$^|osU1zl@C|sC2+gteK)DUKBLx8 z%4}=z{K{d~LMEcfv-N?_70Pzoo|W&#L5L%d&m3O0n_NWVfRWK6?bvXhXcJ>G z-Z?yBjYoc#akW53!oc@A;cR0I!Y?Ss<9O2c&wH<(S;F52Z1kiYWrD~Mm}bS6Ez!zI z|00j+;pTvmC_T({4H|K_2~#I~@M$hUJ&%v?vCG~VNRNe!0q$8+=$OZ|Py<+`AcQA$Js z6;7Mc?^3$D1$4^(uFk4P+X?I#VFdB~Uv499cp)|Qf}c@e>O>p4)rKM>yNiF0tr1#P&;Sil*(<2e!A8TrJYO%$bhr~D=+UGc|tphvBQ+KoVPO;18ao~lZyq?49{WnMf~RGI-;OV0E=?qcK^QKB+zZ z)9iJQT92F^``~dLTl8AM^Yfs%zYPh$7^yx1x=?o+2pG&Q0dej=ZUg&t}xpdN_O$l1et=5kVAqxIUe?Ks7wm$Dn; zNf?yi&z#f$ooi;n)urkg=7bq;qyG+@^%!(eYkc;1RG{-n$U|^k=SM;$SK>_V>4&|? z9U;sw9>1vG%7&JySb%uZv|L|TI0h@YHnC-AR=aEsj@y8P@4Yk?8f@Z;T-ca4J?zfu z$XegyTrGlCRgAU!uSiWc@g*wP0rQ#Kdj^YhsR8drT<4_1-p54>$~|X=n~3p0#{nu* zEFfDgOr~CU^u-;^W$-^lD-?6H#>=h-!P?aNv99jk4{cizj*oXGS==ZAP870YRm90n z24l^w2T*ubLa-DyHQS<}&bdJ+nQSjoy_3W_t_hrpJiYi%Q~^C|7{vFgxwcWCiqB4- z8}=!~coD|L{UF7kAuq{(H7I48=ic#!)J|<*DA68`M4_d?aQ!`A9W z$URDuy|jdEt;b$YG3x8eIE27H1X5mYdehPToOy5U##iuQ9s!iAss?P=i*m&XOZDy= zjdHy@$Xu1f^i6qC9-3il#8y8zzeV9tuh0O$FCZ(Z{~??KxUifWdBXg5l4pXxJ=Uji|7}dq zOvhQ}^8rv6XyUxhzU2(8E6w+-TK%W+^n>hmZ-UcCs;Zx{1LnN&OrvV=iQJtuz@8Gs zcC!|u)t-flx6B6}!2>pmTa;x&xhvfdQ?DY^A0@ z7Nzq2(Z!Y-gNUFBDBj`cH1g*zty)(}AE7fIO&uli17c2|vBWmXHbRGOaYCV8IR+eu z3$i}AI?FAi+O%Z{3Ow-b)de9f{ELV8kiOZtd0Y64qv}R|!VwRan+Q*-<)n>IXfZ}@*o7k)CuCG^qSUysh#3iE{r|yB8|DjOG zWT)a7Suo1Robjcw=1^rjff-v1jY%+kgFH2P62#zA?b0vT|@dOl`PH9F;;|t$fZe#li0PJGE2Raj(*#vm^53=L26Kni z)4E0{lU6uPD&fg4ajho7^-ib}t>xsX#{G998o`OagV3QWU* zycVvD2SIO-+?PD)a*u2%Y2&Cb^xmTw>Gka9Ni!-`{s$K++VAyXNKGU3o-wO-cIo2kcoxJlv0s5v#oMnMd z#=|V0#e}e#Znvi{VBVyfCqOqWgWx8X!VDh2T@MPWtEPd0) zvLxzx2^r*mah9<&CwvvH&HeD)SMUriTzeD#AQb=ZXx;av^PcS3Nz7He0h(5NNQw$u z;8i%+-g5DxgF2;VAJLeG><31{aZ+*K*nCe7P=3?k<*57s_`R~is&U~*zxF_?@!6>) zM|Dh}u-_P0tKmo%-_z>#dvJe@`w)i3> zwHPRIam(NEf6Vjp=MjC8e7GXZsoS{dOsXtUO-J5gEBWiQ!gp^PDk+7Q36T-$Q#^~4 zYp*PKU?*jEt<1Kj71i5LEDxN}tEvfspmO1AW;SSZ`Uto(d<$qi4& zx_rlFhc@mJD972hG#M-%HTK>QFa4d_2*Tf0Bul>e7zG+BV~#3FM5xb?SB&$*?|x9V zv!4DUbwIvJgN#0Jc9DrqPyp+TG5l^2Kt<)rIq9Lr5okHZ?SjS70d7xF|K~8+dfOn9 zLh@cfl=l}?VP48D+mV5Snr+{MAcGyn`gQk%=~*s1`bmV+oRGy1il*1saJIs1CMEm* zgsRKwPMl@DP2k_abLk#1CM1a z2qDL*?Wlvimt}+d`l9C<=dwj9+NBW|Cx7&#i{N|`cTmDq?H+r4t4P`IFbX$tvDK2|zxUkIuwlFB)@8mrRRMt@2RF-~>uC zKA?{f+-CYAeyVO1B`++lU9~&i=XX4tIPB?TI_1DNkv|mS^SkmHCMJ*yY+JU{pFJ?g zUs~`@sqQSkEYW4hlE}?z`IncyHq(6ndxW9xQxEGB=l(pFBZ1EuTcG4B$e}2er@*-D zZglg0>VD5?p7sXE_eI_%>`b-Y#6R_XO)i>iL4VB;f@T+ar^%;9PEz6|;v%e{idnv)pKmn1CbCGalOD3J$L5aJrK8(k~4kF^~vlqYcAQ}+*NWC#+Z6{vKW0k#9bC4GVt`!(U7qU z!p*K^cF<<_$`9Kv+py8otha`5wIc$F$N!jN-cIOwk1~#5>wEPGz2q3TFv3`Cti?XO zf|C#>&AdCh4{>TM(POT|nC)&)mPF0Fef>z1teLHQM1QjPtfRyA?garG`{h<`{r*|@1U1WKnBbA5|a$*oV@!h(`F>a-rrKK?4hO z{oskg234k#{+m9z{?`k_@{y~w;j*7;5yFHQD%8ld{k%kX>pMPB(I^3Ve4PjfB@*GF zT#u2C(U={*y~p49dYHCbcJKCSIdaPTF_JUbyik68&?XUWxraNhV5Q_zD>qwV(8&tE zo*{K~jjN5lPW%{>6V5YZZ{RKy`&3Kj&FsZY)oNTN-tV{`q1>7;jxQftph!yI;Wm)F zj_(I{2CQCvkSx8F|GZIqwa^qFuNlE|?~*{$n?&(mfBadI%_PFngF}i*vo!$2{f3El zKY+u*pyU_Dc%9q*=m(L)B#;gm(!cocr)uMB-$)fUGFntdDdV_ti#K9Jgp2CkXTtj_ z(M&-Q9Mc>{foqvJau*4|=~f;^;-+xB&K#YdyWvO#MO@l>Sn3wc5R=KKbQu`EFd$H( zG)6|r^!nEH&SHx@3C9K?)Rks?)u8v?VUc6qqZn$?ldKXvrGA zblp|d$mPlrZF&#I+8JIC#C7Jnhfonh<=lf-_76+ie*4v9GrHj)U?Pf$(5(Om$%?7g zWWLGg^fgil&A)+1EXv;~Ri_9H z1|9HLn^arnzsQ*jb6v*G%}HDl(QWrn9JgPm-oB53La}G zj@+#LDB^bL8{ogkZcd`4AyUtFWA~QJd8l~5dRw~TSi|+`(wwSo2B{Hpq&b(`rpCCw zKmWTxhoH~5-xr<3?O@P1%rp=2#_G9L&HXy^P5O#gM)r#L`cwQq>P4*|Y9u~)40dV* zijFe?@sa;#{wNZET}%9E<;j46(3W^G`*f$Z=UWkj& z+w5EGCaahn8E5j-aO2#JF`LU*=o`!;Q;#zFvXq`%mEo*$w;Xxbc2J+M0J+a`-k-NC z)erPqbx*FhFJ19p{zFq4Ad#Pn`zYzC#porLz$UKoeOfPP-aN03@{piXE&F z`wv^i_72HMmb8@C6oCu%!sM&U@Y1hL$4d_!dmKq2P<~VKH!Qyabd3doZ%G!o>xkU- z(7>Om9!q`y=!!D>?MC%!5;(7BhU{L(Bm=vQov=Cdzu++2_a|IPjUBN~IORMc7^YZ@ zZ@yNtT)lTD^{B+Ma=^CXpZ@+gvLnu4rATq>Rh%+;2Q>H#fCI@_yJXU~PPz$eTz6ne zD399@Vfj@mrqSy#nWOk$pqXS!rru1JQ881Yy&JnKj(Zt({J7qj?1=o=0?ON!00&?h z8I^EnL&_i_P+-yI-=E6y0XUX!yYqS(xIe#VdUx3T7tntElh|{`IW`7oXlMm{;Ozd_ zNi9hV*v|9+{1x>bx?rz9YFGq?q4A38T`B*AH55jjI__-Uq3i(}BrxlD%g(2-Z*Um{ zzl#9fxq;15fPaI7O=^k7@7PG|)@YRs512NAQHRno6{by2$MUuLd9>{djY;Y4-u217 z#RL5dcw%{1V;w*`z{TkN*OGyq7XIwAKy)wF?QM4Mmh+7)37UVAhJdN~K;A*;dGw7f z*Kc7wq_c(}Hk!@vyJwa|@NbFF7Vh@b9tw{}}uK!(1flQ_POV%|l?*(c}zZ$vkhm2HKWJ-C#ClMJiQrR#7`u?L?j% z!w-NqgsRRqpC*sd{ftrCvRA?wfKr2h`+GqT1V8mJ8(9Py#L4#cJ_CN7FEn}52mG@V z22=!aWB@>v`T&;FR`Ld5 z>U8x{oZkS}^73H;Rp-}P`>e<`BXe=?)}sllXx4Xlx7NqC`f0M)m!CKNh0iR%<3wTg zt@#2hANH1;>q~owfs81`4gk4f)RIE?RBsn&QLerOh#r8cYk+ENPE&F*k1GLGfYo3s z$I5%>PaNQ`8(^G+#BT>lzx%PA6XeFbhSJg31$d`=qzXxLlqAYu%W9(Rz)&&d)9Uz4~@$S@hmV7dQJMLQn z7yj{qzO@V0iS3b;&)F-RHr}rkrf9v|+v*KoO#5iJIzuP9z^i?F!x5P2j2$?b3O z11k3yXdv#_6W4wVNm5)p2lz1@4f3Gxw-Q$rBAiBL5m+-5)p!d@0tA-}1JHp8Zy{te z04Sy#xHV7a1^{5>>0$wavn>oQeLQlG3qXSqq^;+lxAJ4(05GDTy>J!a3#tcRpKtb3 zW-9`e7HER>?pzeZ>w%{Ux4L+9{H`77=wSt5(ue^Z2u8}0({G>B+;7D?5j<|mX&m#< z!=LJ8-QwC+1Q^P?L_d{?rE%z%kn-9@mmpu4&#X!=l#Lqv#2k)Ukmna1)Zg0X>HdGAY_HTpfxNe`&nDnWc zK(W%RDN%1@owRovoCWQIhK&GxDOO&O#qp~g+_ipOX$83G{@3nyLRP5>>>-ta%lI%I z5oweokF(!)`6-@lf<@mRzFX7ZwdlLNc8`qAFRGE_eAj?zSRVl@mn`c zUxGRX9!(6eTRd6N>Q1wOb>{)+w>n!WZ^$wA=H%^Sa|bF4qwW)l<&~Bv2sr_uDq>)2 z?9OJ#;D-8DxA2JA_RWmc+r$dsxd=)D7%)X|O`sfoi}W;aoX6(d-(pLf%(M8_b%2{f z^KJ(f%g5XIYPNL|AdMv`P#>avQ9zt6(9HFz(ORW%A(G16I8OZc)a}BEvB>Pdv(Xp{ z0HdmXl1W;&Zc#F~;5?V7$!}H(@2}iag=)r-U{6!m&j!W-vF~Bjqs_OxjlaTr!{}Ro zf`-RUN0$%xcgvmwRvhzt=a#Z11~iz6!9xRFJ?ElVq~gVM!Z>&Cnb~rKmfFvH`P8r> zu<6OMc3>r0H5uCwOCNooaF}AeIaBVfit|Sg)nraJ{(^>m0C|#oNUtR+#Dpc?DhLATz0fOBRh z78F%pRTqR1C;`?CVEp9yPsgMVHD&+za`_Z^Uf`xV$sIhK2tL`^XHSJKJV%}+!2XGwZkdL_q6|{$ zeayPsFz?1S!B&O%pnGCX?1hp1kX{J}=RQ9RSdMp0kgigQ;%#6GC?FszlDt^_k)Fl~07Z1#wxaFByn|1+C%)F2TP`!iCdL`#@ zaBHE0@0?AXL*CyUSi)B0%ii@1s1%9?1Ev$nPnqn*Uo8$tOj$SJO_k+o zdA+NAn82S8n${FuB)>(V<-eEc1JHUcB*=ihCe-jU5WH5q%dce1n`vhX7M&qQ@_T4q z>vhnx5?}rap8pxSH}nv~leJ`|)H}YxDd&(O2fAF~#`iZ3!qmnQ&r|#(?W5rJ()-{9X#t9BN-0P-6$Dl{X6&7`qz5xE+ zT9)6GfaI&r+Q~sHVhvEKcCn#UYp+{RM5_6TC6M%?&e`)nCjSlTq-bZkM_@L=WCU1n z_1atYgxOe|)Z1=8){iKt37MV)t6~v+5mWu=ao}vlkoiSFW3W`<$t>(6&Dt=ji%y2P zr+qTf3&R=C_C^bqw%Y|810WJ_rOg9%3J_KB)wyeWk__YMf5#3^=ohkH>Dda0xUVhj z-1-8+ADQhX?*+$~0309{$8dPq$NOS~?B+js2x+3odYk?g;NPM|Z>6ZWN`)0+e6sM? z$;@CO#?wm_fYkj3P=sxUpS@&Kz(znl^UfPux6(A^Fw$zGdRFOsS(nhND*$mTmIAW7 z|5_fve}JXWflE4M(nhDMPk~k>dD*;O+$%q{v?TG@^VV2vdYRkBK5hN^vivD1co$m+ z0A$7Dy)=Nn_e22FH5#f^@K4_LkBy@LnWi{h#3yqA3ucw9NLfby4$lzWjd6LQVk)!O zxT+?bV*MQIm4)Z^aNP<^UoqrdBf-Rax%Qt#=O5!h`9cvE2@08F9;gh;c8&KMNb>uS zsLL!>>Wq8z z0bJ03W&mZ>_M~B!PlbFNfLHD8G@r~lcLRmew@mre0mIKnFcfC2nSBtSZ;M)%Pg?WxQB3c25vE$$iE z^xw0+!v&(YR5=YGRfGeS%5FdvW@FCQRVZRMo*g&DU+%28=p}#ff=Zt*c&5oey6+py z)4-npvGr(O4q;)ru$spy86~Dvo=Nqe3AY=5N@F{ZN>{0+u(6Zs2vc2OFK=z*t|YGn z#HH%>1x60IB69{13XRCOI4@nG_s5-p)D6hlZYSiQnR%$-b8)m?M1h>W`3l%h6p%_+ zY>qLeo?+*=8@=#0a9oi>!T><5;PHQqAqe|+nZ@}ckgujll!?;fu^*}dwmf!ERs}tD z#WFlwU_tR&iTz*6?L8pMUdyB@GPB>l%GZ$Gdg19Q$f;F$TOS*XGT0MsLUf*cJYii+8N zHD2@$kZq*O3{92kbpv7ciaOQ*cwHzOvs*Vti4V)PTmZaC*X4e@tW(cE5LD8?Gkf)I zg8k$!F5NSb;J@|*ZZ-9vNf0A%zfBN|{>2yu7L%w`4_`k$fRd{@G9i-s+X3t(&{;J9 zkMSg&K*Gk5FEUSBMnvYxmGR;!(UL$Osm3hpI#+*7Pd%Ubk9+-R7^`9f3_2^~MdsLB zfapCaxF5(OyI;Z&v+_X(@Z@4lAMKTPKZq$?b$Et{%g-C|S;Q5_B*5zWx9|aq`i3;- zsV3kRk4jl6PXR`1a~fJ4fTG^gKSw=1u6a?7@%v%`-MIT6KKHZNQ{&>B*{lECw8(Sv zZ;#lmT8=AH5d!w$%%vp4F%5cPXGB|_>k9{6y_7G6 z7J#IvsGkmPM(a{7#}$zNzY1!y&O@9dAlNW^juz)F2V$#X#Q#&9Hg-NsI7?IhJRn2vf-z3KeQz z(J<)w9d*@vUGMdNeCErUPv>0!bAHQx-@kM2f9yOZ@r{(NkM`<%U-<;EgxBT&E8jKL zdeX6~inPau*hY>g#On7nvVCP}!s?qUUVBn^r{M;;sWw8>`{SNr*TuZ-vklVs@7vpd_ahZ5P~eMO#PJLdFqdWV(n>a-S5oE@3(DYgcmYM5s{6C}pnrN?-o}M? z8K_(Uhsp8Ain|c_5$DX=`?U|NXRZ%;s)WB?>ge|(0&-C9Zb0+cyI#3;$9p(|pxIf6PyEo}+RdwQVogkfzGW1@of;NZNGPH}s zYQW`(BI|iD|EA52e22YRans}E;m(IOzsn-eybDoNPoAKtzt7G9}{Y)7L zkax97%BO?*=V-h?QdJ`N{3C% zt#G(lUHJXXV*EN=xWC^}n`+QzJnHD_b7R29T@D>+K7cOF>ZOCm^;Z@N%lQhPsJMba z$Nj8crmE-B=gGom^)Jh{SC{b1RC>WcIsV;1o|p~IFh znPv-dPJbpsp5Iv1Inx&Ecfw2eJ9R&<7{xEjUlun>rTS{rDfV;^S;^pk;7@q_)I!!) z_v;BoeJtYQO6%Z`#BZKWz1y@=@i)!TZA9?XW(ljnTDBT=DMx|?Q%sqh8jh&K7x-z1 z^Nr};JQF*c{m%E^#{>iW8y20j(xw(Nd+t+A*ZF69Oj%w>`_hzlKoG$>~QIEredU(db8qpjqHv=tA`g>L8k;*7kie%}{p%p3b zF)bnXmoJlz>AxBQ0V9@v({DE}6MN@g+@8vtp)nHrSCziQEz+? zK?qJP{Vfshw*;#b_UO%K`cA*N(g5e;%?NZETgcEN2$**h&Zc$J`Q zn6~2}hTZ-^@L9t4LtJxvD;{|cu89HJm8F!_pA}v7k@h;|zDo2^v`W>LXq0B+WBvHV zYsp*21eF{vCL{(LsByA95@mJ>_tNPK+Z&<($P}iMjH&>2GG@%m4r|1bPtMWPLN8nN1%M`u=uT|F67n*+AhA#&P!c){I zFb%Cnt9)c9j7HZ^yi|x^pG5U=mWW|Gi4Wcz+~(C`ldM~d&^o^tFkW%J%nAj535hUx zg}1BCufT2PK9j2rubbkL*=Pc(aW3yPz>yhU55xPHIGm@>jUEC=b72-s)NM*3a2K>c zB$gGr=wuJH0&(zfqiHzZNk0aKZp#s~?yrKiUqJqg>zCU$xQ}Ta_Go+6Yet5Spldla zhfhT1svL@=?dhb|6@pvaEd=0R9iT1VVLrHvtO4}e`NI7|T+bgSKgREWQ$V9u%-X?p@q!X?? zib2NZtUirmqh7vbHJA0gNjJ?4gI^v-YOC}xyjz!K6FdIN-ZwGH`i6VXLmg&nAkvOH zfD;-?C!Ycbp~P?n%fKa-r>^5>D=I*xZVy_UGd*;5+U1_*mQfbdib2x=vyX|kElHY{ z!Ds{8q=7n{7X=(=u`R)mV1yVZU7SDorhh%u#_~Jh8Lsw}tXVxpiW%pF+Guw(B=UI8@l%1L|}&*Cfk&^bg>yma%z(k8_fcB*x68!prUMfD;Ul8}`o zXKKrNPr=8FS&>GuX*GYX1rtgNWz&(s%bBvjhrG`nj?aCXJKK>>8lfT9VgJ|vP8T^KjS^rn>5Rgy^tc81(Mekv;B!mQAjU$arRY#_93O;AdT>3?=E zPSASGi-6gKGF{SlCB#Y3&-6sMFMgqWAJI$-7Vt~Yi|Yg^wNQ9|sC0(h!$goOZ)rGh z{F*_f)k$|>36ebn;s1BLhJSbh^?!Hy5GEK(zrBf1|L6vT*zy%sC`WF6{zMg`utFr{g z&eg_Vg5c~%LIVH@f&yviY>&tA5uBY|JQN5@(7zB0r12jz9Lo0>1piP8dQ0DkPt6r) z&nGK!RYDSq1o83lA#ipM3dZW1|FDy0N>E2U-c11x_xARd@RpHq#odQX$;->bC8gog z(&8k9xQCAm9zzg!@!mw*ioT@vUwH(NV*%8$=6r$^p$-aB&xgNU>s zzn1rkKX)pRHmZ+i9`ZUJP2LOeKNz~+{9ESe;CMdZr{c6-qJ7J+SC2SaDAHvghN0%A z96vYKsYJ1ezes;jS~?%_`&Z+^aKqP>+k*~QsAcZo7g-X>4SFMGM$6{@W4%au^HpVO z^kdS$bDUFscNUxrIPwl$E6i`PAnpq z1#k&*x|~SKL*R2N%Ea}v+;)m57w9^8uiP?e<;T8NGyk|cgZ)wsg{EdstD0SG^RU8Z zrvK5jaq4+XhhvI*j4f38aNMMM@{Y&Q< zS(x(OEc2eh7QJ$sDIkkj-%7Aq;(dG)6bn0LHoFC}yM`pKZuXsX!?%7>*4w5l2;|$* zQd7}j1j%iju8r;!u8&W@vLTLGMp+p=oIZ{sUgyq?z~1$KIwwr zNHPCSYTjE@Qa_B&mI@LLf-}ya_=T&mE7F-1&El{MQ{{PVc)lBYqXy6H2EDmFK>Wic`9D?YEpELq)wtf-HTMY%Gy${|Od~<`SxG~E z?GMeL>MI_MwnKhRGNI!^5L4qGWjMc!r*8haqc~CV;Jwl@`u-IWY#=Jtsn=a@7!pN* z^^D}#u8$QCbg|y!YBiF2KXiS*aWRZjTD&UtuGh3w57)(4YTSeLHeb#!BUZ^gD;p)jb$$jbhTC#Qeq7HiCzA*e|SxvtI>0wo% zmFv^RY(98x)``=(Dt=2`?{&+$Z~bLZJ9inWuo^s{_gT#%l^|iXO?vTawx5d=NPc61 z{nj@-gY<;LnwbZpzDccx?(Z^Pn@@#?MZRbkL7PpA45Y)qWImLBdia#n`=E``d6WDAF{kZ zTd=??d}btHm(r)w=6Rl%4-Lv`X1AE61sM(+u?X}FvOn|}oG-egJguoG38A;9FI{Y> zQ!b`b=UB8d4$kRh`7S#nHx&qq-q3U`t#j90AF-%I%LVqQuKDPm8obl zWxb2P>6GFic{F`LCn!Q{16!9Stqi#fo(8DSBkfXCm?gX(^6-60?4_fjgCCtpRx(%PsCMBosot6z57)k1l=K);g(m1cx7jUzY=4(f`^jt8dGe+CYxSpN+x*kw!b+vH z08Xaf)@Yp?h$WQ)@Ia`Y3o#j^?qcffKoNN@e?}fRpmSdJ2BrrHEKo1WK>hf>o*1j7 z&ir7*&0bf&ScoRa#+*{^oq25}+fSNM)IGOIHYSTIwqa=vx>>vU=+xdS9fkeUcc6S# z=2EwQ!r@2rO5&!n1jYdf`r3E1i_7$j>5CYxl;w7%IG7LEvaYS*Oso-Do(P6qL``W% zr`YlBtGRp0eGD|dfn0`qZGImI$R`Rl?{{-b(buV(KPhgGvT5MLNxJE?jkS%HX7&cP z7}?1n6JkQ0YK*U+0N?D!T|c!?f4%yg%%ynEpwwM&%pEV3^b}u9LCevJ36VEuj}l*9 zq2hPJB!|R&2)0|>)9LEAEQ-~uNQqsNXxPe={#JD+q%utLdgEO8aA2yf~zr8;e zrn4HWxMK~Y6t^G#Xnt>~uiyO2iakwtoIHUV2a+fRoT2O_-31JwvvjJ|p$TaG1l3ER z2OSfnstBmK9H)jTeETg;n6kq0s)wPhAich)30;=YgGk)qBKHT<4i!@g^s^nWVN5DA zqn4(;$l=bEf=;fjc*$P=+zjV}+^Jo9H;2>hV)*!y;G=L4<98_D1qqEQj=&*KA`H>s zK)&0yF|u43tPX~EF9-r;P>a1)h*yR+hLx>_%=tgGsqI|JwnZ+Xo`ImuPC^@&W&Kg=7ka_L zd@=07Y_=KBVk){J@29h*PN3QYr)0f%IH>A@Z}~3=nMy|Iu|W2#?*a3WFT>J{YV93} zwALPSKtKSP{Ze8_E5H8OC5LEwxdlLvID#)6IHbl_uz4h&wKla-nPyi=t-(#&xg0*Z znVQKO(Dr(GNqk}^`_SrlV~MG@-Lz{kF_a!Xct`30mK%gp?aiYUk!`Xq7pTlaT+MYv z-=DZAI{b9lp!8v~*RQwCHg2``q@98}nGQQ$6sz!~gf6I@rQ+c0v#hzQ>3q>5uovEI zLo~pLZft+hKRv%vMEJP4Er3O~(sC~AdCC)8Fu8oV-0v<=oIf#8M;YSsfM(vTn0}>d zLVn8MIXA6ti*&vm^v;^(E(AY1y(sYoI2fMku@+t^Y`0xKDZ#78V$8QLupX(WEkk3I zj^kY8P?pj%L8QkbKE51dbUTSEkMU!sG}CGY(Dir&@l;`29V(YOYXd!Co{K`)1MNJs zE<18_X@upBDB#nBCM=hLEAbws-BIk9}he7GTZ$OG7t?WVO7w z*_1#BZOM#fH9iF_g4T}tWbG7}BKn*feK(?ayapNoKz2E|=Mv#Ez9*uBH?qL5+7T{N z6g=4C1&D5|<4)cavPWTo-6_3{Q(7SZ9nCdDVFCeZ#Rvt8B>a+f8)d->BZO#8wL))@grbDnGqnw-R_vULa6(T~8~& zrz-~y5opxBz^P$vnXmct0!8r}2Us6$z5{cIz{3d4tos{JCq){KRlArNs66LG*GIK@ zw+pl*wu(eknJHCYbI%BWFX#1LgSh&QW@#&s&Uu~&La{_u6Rjuv-%Fo=tv%EGEqk2D z$7%G^)aJ$v--W95H91(FTy9WKMprnalx)xz8fW$rDqA{BQ`ky>#hbA;d1ed zmvJg|l`GVyah5f7^jxtw4?T(*u)cfkPo7kWfu}}>Lq6~;W5q;0Iatf8rim4eg#(Cs znG-cI%QojH9erznl~=Cs%5i&GDlg&?7fk{0>vP>sHn%FtS%s2GO8Vy!1UrvV*A#=f zs9FqS0{4XKBl6nrUMTbN|8h8a@A%yn09hxXF}V-RNMC-1?Giodiy%Ur@uJ(0;}bk6 zIz1td0)6)VgJET!=^9QkagK(_^2(G;BMPl&B$`+`Qax!k;O|Z@79|ps7FwhO{*h!A zwzz*XS_YG??lt6!@>^7fK2!6W7M1<%^){R1JA~f4y5%SSw%TkEN1u2cPem^~8Z(svZ#Rlev_l)(L*)`yh3n z_CWb*_b>jPZHD$%5hTNz8x@`1Z53@k-~1qF0(fID)Y47&WqZ6iSx9*F8KALY@`akm)wE%IOmpbl>czGusAY!)AkHl8vzBMQP?uSo86v2RZ` zs*DL=I?5K~aTEuloEVleHCb(viX-yKV4ZF*Z<`=(U@w8UF9+aR8@(@a>jt$4^7WON zfkkv+v8f6J{g+$8?xNL$(gOq$DoJ|cu{Ck0vnnrjo4meLs6%aYNrMT8ksd${|LS~Z zeONCgSb2v}2Lc@v!GP!oMnhm*u^)Np<$0463uq;cQ*($xk>kYFS!W@Hu_k^g{CXxM z3*a%A%3@Fo<8vDTr0x}Yiv8qSG9|wLWKC-P~P^{#UhVp*A413i=fmEaL?tU03 z9t*dBz0gymwH{WgaQc*Q8=r48AX;w%%v?XjFB1AD-Hs9 z+}~|lQIKhsFQB~8&s%+EdzrP1BG{0vgd92-6(l?CgT14`5dU_PA~6^>_N5s|+y^e- zd7RQ`yjq0Jd}GiwD7M}gD$G6+o*WP$F515lKgH2$SsY%r8VdtHH&Ry8Z_WmNYI zwkTTYZ&+}_%;5P!nmRE1YM0%-&Q-(Z7rdNZw)sBo6C8|n>6}4?2ZN;>PkCl1u)s6) zEk|wIH?MF?Tet6G6%lJ>SS&l!7@4`8MH<$L!>v)m4kf6g_%+9ILTz-;y@OfMy=P-9 zm}BxjnaEQ2^Ps2Q-?=Z&zTF`X+a9)9PhdM7i84PwvDLoblWgYDp1%I@+wTiGIv9w> Tl8w!uU#=((1NCxM>)`(b@nt`^ diff --git a/src/_assets/image/codelab/layout/businesscarddisplay2.png b/src/_assets/image/codelab/layout/businesscarddisplay2.png index 30d80e6ef6a2cd6f73751f8dc358796ce0b6b444..c9eb876e633ab4a54593e5c6e9c850b79ad67171 100644 GIT binary patch literal 31283 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

fLXn+j^P~6l4T7KYpRSB(sBJ8HeF@A* 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 literal 7870 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 diff --git a/src/_assets/image/codelab/layout/businesscarddisplay3.png b/src/_assets/image/codelab/layout/businesscarddisplay3.png index 2fd40c589527d99fd768f41ba9a3b4292c4bfc5f..4aefb89c452065498d54f0e92372f004b9cd8983 100644 GIT binary patch literal 51603 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 G1^*AfQ`64? diff --git a/src/_assets/image/codelab/layout/businesscarddisplay4.png b/src/_assets/image/codelab/layout/businesscarddisplay4.png index c436947ef9a6bbceb0fcec7413541636b8f11bc2..c92fa30f493558bf116fadb6c902b41667458c89 100644 GIT binary patch literal 25052 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 K3VHH3ef|fN$%x

&C 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 Date: Wed, 21 Aug 2019 11:42:27 -0700 Subject: [PATCH 17/18] Stashing --- .../codelab/layout/businesscarddisplay0.png | Bin 14359 -> 0 bytes .../codelab/layout/businesscarddisplay1.png | Bin 57524 -> 0 bytes .../codelab/layout/businesscarddisplay2.png | Bin 31283 -> 0 bytes .../codelab/layout/businesscarddisplay3.png | Bin 51603 -> 0 bytes .../codelab/layout/businesscarddisplay4.png | Bin 25052 -> 0 bytes .../codelab/layout/businesscarddisplay5.png | Bin 5202 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/_assets/image/codelab/layout/businesscarddisplay0.png delete mode 100644 src/_assets/image/codelab/layout/businesscarddisplay1.png delete mode 100644 src/_assets/image/codelab/layout/businesscarddisplay2.png delete mode 100644 src/_assets/image/codelab/layout/businesscarddisplay3.png delete mode 100644 src/_assets/image/codelab/layout/businesscarddisplay4.png delete mode 100644 src/_assets/image/codelab/layout/businesscarddisplay5.png diff --git a/src/_assets/image/codelab/layout/businesscarddisplay0.png b/src/_assets/image/codelab/layout/businesscarddisplay0.png deleted file mode 100644 index 209f3b3e2df7caa14ffbe9ee166ee44a51976c2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14359 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 NDJmyYD`XJ#e*i!wQtki% diff --git a/src/_assets/image/codelab/layout/businesscarddisplay1.png b/src/_assets/image/codelab/layout/businesscarddisplay1.png deleted file mode 100644 index 30175f73e2a059c91a5ac410d1feaeb353f508c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57524 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

a-Vs3-fcAu`S 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

Q>5FAC&Y$o8m%hK3>p2cp;cp-AOUO=| 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

fLXn+j^P~6l4T7KYpRSB(sBJ8HeF@A* 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 diff --git a/src/_assets/image/codelab/layout/businesscarddisplay3.png b/src/_assets/image/codelab/layout/businesscarddisplay3.png deleted file mode 100644 index 4aefb89c452065498d54f0e92372f004b9cd8983..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51603 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 K3VHH3ef|fN$%x

oJg=g&Y6?0993#b@AsN{4RN&5P#HV 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 From 366c6bb1ee7fbf39b67f4570758eb27e221fd5af Mon Sep 17 00:00:00 2001 From: datafoya Date: Wed, 21 Aug 2019 12:03:55 -0700 Subject: [PATCH 18/18] fixing url and images --- flutter | 2 +- ...esscarddisplay1.png => businesscarddisplay1.png} | Bin ...esscarddisplay2.png => businesscarddisplay2.png} | Bin ...esscarddisplay3.png => businesscarddisplay3.png} | Bin ...esscarddisplay4.png => businesscarddisplay4.png} | Bin src/docs/codelabs/layout-basics.md | 10 +++++----- 6 files changed, 6 insertions(+), 6 deletions(-) rename src/_assets/image/codelab/layout/{Completedbusinesscarddisplay1.png => businesscarddisplay1.png} (100%) rename src/_assets/image/codelab/layout/{Completedbusinesscarddisplay2.png => businesscarddisplay2.png} (100%) rename src/_assets/image/codelab/layout/{Completedbusinesscarddisplay3.png => businesscarddisplay3.png} (100%) rename src/_assets/image/codelab/layout/{Completedbusinesscarddisplay4.png => businesscarddisplay4.png} (100%) diff --git a/flutter b/flutter index e4ebcdf6f4..20e59316b8 160000 --- a/flutter +++ b/flutter @@ -1 +1 @@ -Subproject commit e4ebcdf6f4facee5779c38a04d91d08dc58ea7a4 +Subproject commit 20e59316b8b8474554b38493b8ca888794b0234a diff --git a/src/_assets/image/codelab/layout/Completedbusinesscarddisplay1.png b/src/_assets/image/codelab/layout/businesscarddisplay1.png similarity index 100% rename from src/_assets/image/codelab/layout/Completedbusinesscarddisplay1.png rename to src/_assets/image/codelab/layout/businesscarddisplay1.png diff --git a/src/_assets/image/codelab/layout/Completedbusinesscarddisplay2.png b/src/_assets/image/codelab/layout/businesscarddisplay2.png similarity index 100% rename from src/_assets/image/codelab/layout/Completedbusinesscarddisplay2.png rename to src/_assets/image/codelab/layout/businesscarddisplay2.png diff --git a/src/_assets/image/codelab/layout/Completedbusinesscarddisplay3.png b/src/_assets/image/codelab/layout/businesscarddisplay3.png similarity index 100% rename from src/_assets/image/codelab/layout/Completedbusinesscarddisplay3.png rename to src/_assets/image/codelab/layout/businesscarddisplay3.png diff --git a/src/_assets/image/codelab/layout/Completedbusinesscarddisplay4.png b/src/_assets/image/codelab/layout/businesscarddisplay4.png similarity index 100% rename from src/_assets/image/codelab/layout/Completedbusinesscarddisplay4.png rename to src/_assets/image/codelab/layout/businesscarddisplay4.png diff --git a/src/docs/codelabs/layout-basics.md b/src/docs/codelabs/layout-basics.md index 6ae32965ab..13a5455d53 100644 --- a/src/docs/codelabs/layout-basics.md +++ b/src/docs/codelabs/layout-basics.md @@ -432,7 +432,7 @@ the following example uses an image from the network. **1.** Click the **Run** button. - **2.** Change the short Url to the actual URL: + **2.** Change the short URL to the actual URL: `https://github.com/flutter/website/blob/master/examples/layout/sizing/images/pic3.jpg?raw=true` @@ -450,7 +450,7 @@ You're almost at the end of this codelab. If you'd like to test your knowledge of the techniques that you've learned, why not apply those skills into building a Flutter UI that displays a business card! - ![Completed business card]({% asset codelab/layout/Completedbusinesscarddisplay1.png + ![Completed business card]({% asset codelab/layout/businesscarddisplay1.png @path%}){:width="400px"}{:.text-center} You'll break down Flutter's layout into parts, which is how you'd @@ -461,7 +461,7 @@ you'll implement a `Column` that contains the name and title. Then you'll wrap the `Column` in a `Row` that contains the icon, which is positioned to the left of the name and title. - ![Completed business card]({% asset codelab/layout/Completedbusinesscarddisplay2.png + ![Completed business card]({% asset codelab/layout/businesscarddisplay2.png @path%}){:width="400px"}{:.text-center} In [Part 2](#part-2), you'll wrap the `Row` in a `Column`, @@ -472,14 +472,14 @@ Finally, you'll add the contact information to the outermost `Column`'s list of children, so it's displayed below the name, title, and icon. - ![Completed business card]({% asset codelab/layout/Completedbusinesscarddisplay3.png + ![Completed business card]({% asset codelab/layout/businesscarddisplay3.png @path%}){:width="400px"}{:.text-center} In [Part 3](#part-3), you'll finish building the business card display by adding four more icons, which are positioned below the contact information. - ![Completed business card]({% asset codelab/layout/Completedbusinesscarddisplay4.png + ![Completed business card]({% asset codelab/layout/businesscarddisplay4.png @path %}){:width="400px"}{:.text-center} ### Part 1