前言
弹性布局允许子组件按照一定比例来分配父容器空间, Flutter 中的弹性布局主要通过 Flex 和 Expanded 来配合实现.
Flex
Flex 组件可以沿着水平或垂直方向排列子组件, 如果你知道主轴方向, 使用 Row 或 Column 会方便一些, 因为 Row 和 Column 都继承自 Flex, 参数基本相同, 所以能使用 Flex 的地方基本上都可以使用 Row 或 Column.Flex 本身功能是很强大的, 它也可以和 Expanded 组件配合实现弹性布局. Flex 继承自 MultiChildRenderObjectWidget, 对应的 RenderObject 为 RenderFlex,RenderFlex 中实现了其布局算法.
Flex 接口描述
- Flex({
- Key key,
- // 弹性布局的方向, Row 默认为水平方向, Column 默认为垂直方向
- @required this.direction,
- // 以下同线性布局
- this.mainAxisAlignment = MainAxisAlignment.start,
- this.mainAxisSize = MainAxisSize.max,
- this.crossAxisAlignment = CrossAxisAlignment.center,
- this.textDirection,
- this.verticalDirection = VerticalDirection.down,
- this.textBaseline,
- List<Widget> children = const <Widget>[],
- })
- Expanded
可以按比例 "扩伸" Row,Column 和 Flex 子组件所占用的空间.
Expanded 接口描述
- const Expanded({
- Key key,
- // 参数为弹性系数, 如果为 0 或 null, 则 child 是没有弹性的, 即不会被扩伸占用的空间.
- // 如果大于 0, 所有的 Expanded 按照其 flex 的比例来分割主轴的全部空闲空间.
- int flex = 1,
- @required Widget child,
- })
代码示例
- import 'package:flutter/material.dart';
- class FlexTest extends StatelessWidget {
- @override
- Widget build(BuildContext context) {
- return Column(
- children: <Widget>[
- // Flex 的两个子 widget 按 1:2 来占据水平空间
- Flex(
- direction: Axis.horizontal,
- children: <Widget>[
- Expanded(
- flex: 1,
- child: Container(
- height: 30.0,
- color: Colors.red,
- ),
- ),
- Expanded(
- flex: 2,
- child: Container(
- height: 30.0,
- color: Colors.green,
- ),
- )
- ],
- ),
- Padding(
- padding: const EdgeInsets.only(top: 20.0),
- child: SizedBox(
- height: 100.0,
- // Flex 的三个子 widget, 在垂直方向按 2:1:1 来占用 100 像素的空间
- child: Flex(
- direction: Axis.vertical,
- children: <Widget>[
- Expanded(
- flex: 2,
- child: Container(
- height: 30.0,
- color: Colors.red,
- ),
- ),
- // 占用指定比例的空间, 实际上它只是 Expanded 的一个包装类
- Spacer(
- flex: 1,
- ),
- Expanded(
- flex: 1,
- child: Container(
- height: 30.0,
- color: Colors.green,
- ),
- )
- ],
- ),
- ),
- )
- ],
- );
- }
- }
来源: http://www.bubuko.com/infodetail-3340142.html