首页 > 其他分享 >Flutter布局(1):线性布局(Row、Column)

Flutter布局(1):线性布局(Row、Column)

时间:2024-10-11 16:00:38浏览次数:8  
标签:MainAxisSize Column 布局 crossAxisAlignment 对齐 MainAxisAlignment Flutter Row

所谓线性布局,即指沿水平或垂直方向排列子组件。Flutter 中通过RowColumn来实现线性布局。

主轴和纵轴

对于线性布局,有主轴和纵轴之分,如果布局是沿水平方向,那么主轴就是指水平方向,而纵轴即垂直方向;如果布局沿垂直方向,那么主轴就是指垂直方向,而纵轴就是水平方向。

一、Row组件

1.1 Row介绍

Row 组件用于将所有的子 Widget 排成一行。从源码中查看 Row 的属性:

Row({
  Key key,
  MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start, // 主轴对齐方式
  MainAxisSize mainAxisSize = MainAxisSize.max, // 水平方向尽可能大
  CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center, // 交叉处对齐方式
  TextDirection textDirection, // 水平方向子widget的布局顺序(默认为系统当前Locale环境的文本方向(如中文、英语都是从左往右,而阿拉伯语是从右往左))
  VerticalDirection verticalDirection = VerticalDirection.down, // 表示Row纵轴(垂直)的对齐方向
  TextBaseline textBaseline, // 如果上面是baseline对齐方式,那么选择什么模式(有两种可选)
  List<Widget> children = const <Widget>[],
})

部分属性详细解析:

mainAxisSize:

  • 表示Row在主轴(水平)方向占用的空间,默认是MainAxisSize.max,表示尽可能多的占用水平方向的空间,此时无论子widgets实际占用多少水平空间,Row 的宽度始终等于水平方向的最大宽度
  • MainAxisSize.min表示尽可能少的占用水平空间,当子 widgets 没有占满水平剩余空间,则Row的实际宽度等于所有子 widgets 占用的的水平空间;

mainAxisAlignment:表示子 Widgets 在 Row 所占用的水平空间内对齐方式

  • 如果mainAxisSize值为MainAxisSize.min,则此属性无意义,因为子 widgets 的宽度等于 Row 的宽度
  • 只有当mainAxisSize的值为MainAxisSize.max时,此属性才有意义
  • MainAxisAlignment.start表示沿 textDirection 的初始方向对齐,
  • 如textDirection取值为TextDirection.ltr时,则MainAxisAlignment.start表示左对齐,textDirection取值为TextDirection.rtl时表示从右对齐。
  • MainAxisAlignment.endMainAxisAlignment.start正好相反;
  • MainAxisAlignment.center表示居中对齐。

crossAxisAlignment:表示子 Widgets 在纵轴方向的对齐方式

  • Row 的高度等于子 Widgets 中最高的子元素高度
  • 它的取值和 MainAxisAlignment 一样(包含startendcenter三个值)
  • 不同的是 crossAxisAlignment 的参考系是 verticalDirection,即 verticalDirection 值为VerticalDirection.downcrossAxisAlignment.start指顶部对齐,verticalDirection 值为VerticalDirection.up时,crossAxisAlignment.start指底部对齐;而crossAxisAlignment.endcrossAxisAlignment.start正好相反;

1.2 Row演练

我们来对部分属性进行简单的代码演练,其他一些属性大家自己学习一下

class MyHomeBody extends StatelessWidget {
  const MyHomeBody({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      crossAxisAlignment: CrossAxisAlignment.end,
      mainAxisSize: MainAxisSize.max,
      children: <Widget>[
        Container(color: Colors.red, width: 60, height: 60),
        Container(color: Colors.blue, width: 80, height: 80),
        Container(color: Colors.green, width: 70, height: 70),
        Container(color: Colors.orange, width: 100, height: 100),
      ],
    );
  }
}

效果图如下:

Flutter_layoutWidget_G.png


1.3 mainAxisSize

默认情况下,Row 会尽可能占据多的宽度,让子 Widget 在其中进行排布,这是因为 mainAxisSize 属性默认值是MainAxisSize.max

我们来看一下,如果这个值被修改为MainAxisSize.max会什么变化:

Flutter_layoutWidget_H.png


二、Column组件

Column 组件用于将所有的子 Widget 排成一列,学会了前面的 Row 后,Column 只是和 row 的方向不同而已。


2.1 Column介绍

我们直接看它的源码:我们发现和 Row 属性是一致的,不再解释

Column({
  Key key,
  MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,
  MainAxisSize mainAxisSize = MainAxisSize.max,
  CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center,
  TextDirection textDirection,
  VerticalDirection verticalDirection = VerticalDirection.down,
  TextBaseline textBaseline,
  List<Widget> children = const <Widget>[],
})

2.2 Column演练

我们直接将Row的代码中Row改为Column,查看代码运行效果:

class MyHomeBody extends StatelessWidget {
  const MyHomeBody({Key? key}) : super(key: key);
  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      crossAxisAlignment: CrossAxisAlignment.end,
      mainAxisSize: MainAxisSize.min,
      children: <Widget>[
        Expanded(
          flex: 1,
          child: Container(color: Colors.red, width: 60),
        ),
        Container(color: Colors.blue, width: 80, height: 80),
        Container(color: Colors.green, width: 70, height: 70),
        Expanded(
          flex: 1,
          child: Container(color: Colors.orange, width: 100),
        )
      ],
    );
  }
}

效果图如下:

Flutter_layoutWidget_J.png


标签:MainAxisSize,Column,布局,crossAxisAlignment,对齐,MainAxisAlignment,Flutter,Row
From: https://www.cnblogs.com/linuxAndMcu/p/18458608

相关文章

  • Flutter布局(4):层叠布局(Stack、Positioned)
    层叠布局和Web中的绝对定位、Android中的Frame布局是相似的,子组件可以根据距父容器四个角的位置来确定自身的位置。层叠布局允许子组件按照代码中声明的顺序堆叠起来。Flutter中使用Stack和Positioned这两个组件来配合实现绝对定位。Stack允许子组件堆叠,而Positioned用于根据......
  • Flutter布局(3):流式布局(Wrap、Flow)
    一、简介在Flutter中,流式布局是一种常用的布局方式,用于实现动态调整子组件位置和尺寸的需求。Flutter提供了两个流式布局的组件:Wrap和Flow。其实,Flow用的实在不多呀。二、Wrap组件Wrap组件是一种流式布局,它会自动调整和换行子组件,以适应可用空间。属性Wrap组件具有......
  • Flutter布局(5):对齐与居中布局(Align、Center)
    在Flutter中,布局是构建用户界面的重要组成部分。Align和Center是两个常用的布局组件,它们都用于在父组件中对子组件进行对齐和居中。本篇博客将详细介绍Align和Center的用法、属性和适用场景,帮助你更好地理解和运用它们。一、Align:精准对齐,掌握位置Align组件用于将子组......
  • CSS布局
    1.CSS中包含以下定位机制(1)普通流。每个块级元素都换行显示。(2)相对定位。将一个元素从普通流所处的位置上移动。这种移动不会影响周围元素的位置。(3)绝对定位。绝对定位的元素的位置相对于包含他的元素。完全脱离了普通流。不会影响到周围任何元素的位置。使用绝对定位的元素随......
  • WPF 等距布局
    本文告诉大家如何使用WPF的自定义布局做等距布局实际做的效果很简单,因为在开发我容易就用到了等距的控件。等距控件就是在指定的宽度下,平均把控件放在水平的地方,这样相等于StackPanel的水平,但是没有做水平压缩。在这个控件,无论在水平放多少个控件,都会在相同的高度把他们放下。......
  • JVM系列(四) -内存布局详解
    一、摘要熟悉Java语言特性的同学都知道,相比C、C++等编程语言,Java无需通过手动方式回收内存,内存中所有的对象都可以交给Java虚拟机来帮助自动回收;而像C、C++等编程语言,需要开发者通过代码手动释放内存资源,否则会导致内存溢出。尽管如此,如果编程不当,Java应用程序......
  • 2024-10-11 自定义渲染之arco-design-vue table的columns的title ==》使用DOM插入子元
    嗯...不知我没找到arco对应tabletitle的自定义渲染的正确方式 但我已经找了1个小时了,既然没找到就自己插入吧业务场景如下: 给表头插入一个必填的符号*,就这么简单的需求。代码如下:constelements:any=document.querySelectorAll('.arco-table-th-title');elements.f......
  • CSS Flex 布局教程
    简介弹性盒子是CSS3的一种新的布局模式。CSS3弹性盒(FlexibleBox或flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列、对齐和分配空白......
  • 仓库布局对拣选效率的影响
    根据国外研究,拣货过程中最耗时的部分是移动,平均占用拣货人员的55%的时间,其次是纸质单据填写和其他活动(20%)、查找货物(15%)和搬运货物(10%)。出于这个原因,围绕改进拣货流程的大部分工作是在减少查找货物及移动时间。精明的仓库管理者利用80/20规则来提高拣货效率。既20%的产品......
  • OBOO鸥柏:布局于为展厅展馆元宇宙产业提供LCD液晶显示终端
    新华网快讯,于10月7日消息,有投资者在互动平台向OBOO鸥柏提问:您好请问作为中国专注于商用液晶显示屏领域的科技公司,公司有哪些工业/商用显示产品应用于展厅展馆场景单位?能否着重介绍下贵司和展厅展馆合作如何保障如何破局?鸥柏科技(OBOO鸥柏)总经理朱琦飞回答表示:公司旗下品牌“......