Code前端首页关于Code前端联系我们

Flutter行列基础教程(线性布局)

terry 2年前 (2023-09-23) 阅读数 78 #移动小程序

线性布局是指子组件在水平或垂直方向上的排列方式。 Flutter 中线性布局是通过 RowColumn 实现的,类似于 Android 中的 LinearLayout 控件。 RowColumn 均继承自 Flex(弹性布局)。我们稍后会详细解释Flex。 。

主轴和垂直轴

对于线性布局,有主轴和垂直轴。如果布局是沿水平方向(如:Row),则主轴显示水平方向,垂直轴则显示垂直方向;如果布局是垂直方向(如:Column),则主轴表示垂直方向,垂直轴表示水平方向。线性布局中,有两个定义对齐方式的枚举类MainAxisAlignmentCrossAxisAlignment,分别代表主轴和垂直轴对齐方式。 Flutter的Row和Column(线性布局)初级教程

Row

Row可以在水平方向上排列子组件,定义如下:

Row({
    ...
    TextDirection textDirection,
    MainAxisSize mainAxisSize = MainAxisSize.max,
    MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,
    VerticalDirection verticalDirection = VerticalDirection.down,
    CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center,
    TextBaseline textBaseline,
    List<Widget> children = const <Widget>[],
})
复制代码
  • textDirection:表示子组件在水平方向左侧或右侧或右侧的布局顺序。 left ),默认为系统当前Locale环境的文本方向(例如中文和英文从左到右,阿拉伯语从右到左)。 ?子部件实际占用多少主轴空间,Row的宽度始终等于主轴方向的最大宽度;而MainAxisSize.min表示占用一点主轴空间,例如,当子组件Row不占用主轴的剩余空间时。 Row
等于所有子组件在主轴方向上占用的最大空间。 ? xisSize.min,那么这个属性就没用了,因为子组件的宽度等于Row的宽度。仅当 mainAxisSize 的值为 MainAxisSize.maxMainAxisSize 起始方向 文本方向 对齐时,此属性才有用,例如,当文字方向 取值 TextDirection.ltr,然后MainAxisAlignment.start left Alignment.start。 文本方向值为当TextDirection.rtl时,MainAxisAlignment.start表示右对齐。而MainAxisAlignment.endMainAxisAlignment.start正好相反,对齐。 。我们可以这样理解:textDirection是参考系MainAxisAlignment
Major Axis Alignment 枚举值 Destination
start 将子项放置在主轴的起点
middle♸ middle 位于中间♸ 结束将children放置在主轴的末端
spaceAround将主轴方向的空白区域均分,使得children之间的空白区域相同,但是第一个和第一个的空白区域最后一个子项是 1/2
spaceBetween 移动主轴方向向上 均匀划分空出区域,使得子级之间的空出区域相同,并且第一个和最后一个子级接近第一个和最后一个孩子,没有间隙。
空间相等沿主轴方向划分空白区域,使子级之间的空白区域相同,包括头子级和尾级子级
  • 垂直方向:显示子级的方向垂直轴 。默认为VerticalDirection.down,意思是从上到下。
  • crossAxisAlignment:表示子组件在垂直轴方向的对齐方式。 Row 的高度等于子组件中最高子元素的高度。值与MainAxisAlignment相同(包含三个值​​​​​​​​start、end、center),不同的是❀的参考系 为 VerticalDirection,即 VerticalDirection 当值为 垂直方向时取。 CrossAxisAlignment.start表示顶部对齐,VerticalDirection采用VerticalDirection的值。当向上时, CrossAxisAlignment.start显示底部对齐;而 CrossAxisAlignment.endCrossAxisAlignment.start 则恰恰相反。
    CrossAxisAlignment 枚举值 使用
    start子项显示在交叉轴上的起点
    center♺显示在轴的中心
    center♺❀ end孩子在交叉轴的末端显示
    基线在交叉轴的方向上,这样孩子们的基线与
    拉伸对齐,这样孩子们就可以填充横轴方向
  • textBaseline:线基线。
  • child:子组件的排列。
  • 示例

    Column(
        //测试Row对齐方式,排除Column默认居中对齐的干扰
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text("Hello World"),
              Text("I am Zane")
            ],
          ),
          Row(
            mainAxisSize: MainAxisSize.min,
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text("Hello World"),
              Text("I am Zane")
            ],
          ),
          Row(
            textDirection: TextDirection.rtl,
            mainAxisAlignment: MainAxisAlignment.end,
            children: <Widget>[
              Text("Hello World"),
              Text("I am Zane")
            ],
          ),
          Row(
            verticalDirection: VerticalDirection.up,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Text("Hello World", style: TextStyle(fontSize: 30.0),),
              Text("I am Zane"),
            ],
          ),
        ],
      ),
    复制代码

    效果如下: Flutter的Row和Column(线性布局)初级教程

    看图说话:

    • 第一条线,中间对齐很简单;
    • 第二行,因为mainAxisSize的值为SizeMain。Main。 行数等于两个文字宽度相加,所以对齐没有意义,所以会从左到右显示两个文字
    • 第三个 Row 设置为 TextDirection.rtl,因此子组件将从左到左显示,并且在 ♻ 中的中,这是按正确顺序排列的。 sAlignment.end
    表示左对齐,所以最终的显示结果就是图中第三行的样子;

  • 第四个测试 是垂直轴的对齐。因为两个子文字的字体不同,所以高度也不同。我们定义verticalDirection的值为VerticalDirection.up,即从下到上排列,此时s♻cross❀的值为CrossAxis对齐.start 表示较低对齐。
  • Column

    Column可以垂直排列子组件。参数与Row相同。不同的是子组件布局方向是垂直的。主轴线和垂直轴与Row 正好相反。读者可以类比 Row 来理解,我们举个例子:

    import 'package:flutter/material.dart';
    
    class CenterColumnRoute extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Text("Hi"),
            Text("World"),
          ],
        );
      }
    }
    复制代码

    操作的效果如下: Flutter的Row和Column(线性布局)初级教程

    看图说:♹确定mainAxisSize 来自 Column,使用默认值 MainAxisSize。Flutter的Row和Column(线性布局)初级教程

    将在垂直方向上占用尽可能多的空间,在本例中为屏幕的高度。

  • 因为我们将属性crossAxisAlignment定义为CrossAxisAlignment.center,那么子组件Flutter的Row和Column(线性布局)初级教程

    就在Flutter的Row和Column(线性布局)初级教程

    中 垂直轴方向(当前水平方向)将居中。注意水平方向对齐是有限的,空间实际宽度的总宽度被Column占据,实际宽度取决于子组件中宽度最大的组件。在本例中,Column有两个子组件,而显示“World”的Text具有最大宽度,因此❀❀ Text("World")的宽度,所以中心对齐后,Text("Hi")会显示在中间 Text("World")

  • 其实都是RowColumn只会在主轴方向和最大垂直轴的长度上占据尽可能多的空间。子元素。

    如果我们想让本例中的两个文本控件在整个屏幕的中心对齐,我们有两种方法:

    1. 定义Column的宽度为屏幕;您可以通过 ConstrainedBoxSizedBox 强制其更改宽度限制,例如:
      ConstrainedBox(
        constraints: BoxConstraints(minWidth: double.infinity),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Text("Hi"),
            Text("World")
          ],
        ),
      ),
      
      SizedBox(
        width: double.infinity,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Text("Hi"),
            Text("World")
          ],
        ),
      ),
      复制代码

      set ♶ 双无穷大,你可以使宽度占据尽可能多的空间。

    2. 使用组件中心,例如:
      Center(
        child: Column(
          children: <Widget>[
            Text("Hi"),
            Text("World")
          ],
        ),
      ),
      复制代码

    特殊情况

    如果行位于行,或放在里面,那么只有最外面的Row才是最外面的空间,并且尽可能多的RowColumn所占据的空间是合适的尺寸。以Column为例:

    Container(
      color: Colors.blue,
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisSize: MainAxisSize.max, //有效,外层Colum高度为整个屏幕
          children: <Widget>[
            Container(
              color: Colors.white,
              child: Column(
                mainAxisSize: MainAxisSize.max, //无效,内层Colum高度为实际高度
                children: <Widget>[
                  Text("Hello world"),
                  Text("I am Zane")
                ],
              ),
            ),
          ],
        ),
      ),
    ),
    复制代码

    运行效果如下: Flutter的Row和Column(线性布局)初级教程

    如果想要内部ColumnFlutter的Row和Column(线性布局)初级教程

    外部

    ,可以使用扩展组件:

    Container(
      color: Colors.blue,
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisSize: MainAxisSize.max, //有效,外层Colum高度为整个屏幕
          children: <Widget>[
            Expanded(  //使用Expanded
              child: Container(
                color: Colors.white,
                child: Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  mainAxisSize: MainAxisSize.max, //有效,内层Colum高度占满外部Column
                  children: <Widget>[
                    Text("Hello world"),
                    Text("I am Zane")
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    ),
    复制代码

    效果如下:Flutter的Row和Column(线性布局)初级教程

    作者:zane
    链接:https://juej583a3/5b63f3a/5b63f3a/5b63f3a/5b63f3a/5b63f3a 来源:Nugget
    权利版权归属给作者。商业转载请联系作者获取授权。非商业转载请注明出处。

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门