Flutter容器

发布日期:2026/08/11标签:# 编程

基础容器

Container

多功能组合容器,可通过多种方式定义大小,有明确的优先级规则:

明确宽高 > constraints > 父组件约束 > 自适应组件大小

装饰系统:通过decoration属性实现视觉效果,但和color属性互斥。

属性类别关键属性作用说明
布局定位alignment控制其 child(子组件)在容器内部的对齐方式。
• 例如:Alignment.center(居中)、Alignment.topLeft(左上角)
尺寸控制width / height / constraints设置容器的宽度和高度 / 为容器设置更复杂的尺寸约束(如最小/最大宽高)
间距留白padding / margin按照比例分配剩余空间,实现自适应布局,常与 RowColumn 配合使用
装饰效果color / decoration为容器设置一个简单的背景颜色 / 为容器设置复杂的背景装饰
变换效果transform对容器及其内容进行矩阵变换
子组件child容器内包含的唯一直接子组件

Center - 居中组件

将其子组件在父容器的空间内进行水平和垂直方向上的居中排列

  • Center不能设置宽高,Center的最终大小取决于其父组件传递给它的约束,Center会向它的父组件申请尽可能大的空间

Align - 对齐组件

作用是精确控制其子组件在父容器空间内的对齐位置

  • alignment:子组件在父容器内的对齐方式
  • widthFactor:Align的宽度将是子组件宽度乘以该因子
  • heightFactor:Align的高度将是子组件高度乘以该因子

Padding

简单的内边距组件

线性布局

Column

属性类型作用说明
mainAxisAlignmentMainAxisAlignment控制子组件在主轴(垂直方向)上的排列方式,如顶部对齐、居中或均匀分布。
crossAxisAlignmentCrossAxisAlignment控制子组件在交叉轴(水平方向)上的对齐方式,如左对齐、右对齐或拉伸填满。
mainAxisSizeMainAxisSize决定 Column 本身在垂直方向上的尺寸策略:是占满所有可用空间 (max),还是仅仅包裹子组件内容 (min)。
childrenList需要被垂直排列的子组件列表。
  • Column本身不支持滚动,如果内容超出,需要使用ListView或者SinglechildScrollView包裹
  • 明确尺寸约束,父组件的大小直接影响Column的最终大小各子组件的布局行为
  • 避免过度嵌套,过深的嵌套会影响性能并增加代码的维护难度

Row

与Column的差异就是主轴方向不一样

弹性布局

Flex

作用是允许沿一个主轴排列其子组件,灵活地控制这些子组件在主轴上的尺寸比例和空间分配,像是两种线性分布的结合体

属性类型作用说明
directionAxis.horizontal / Axis.vertical主轴方向,决定子组件的排列方向
mainAxisAlignmentMainAxisAlignment子组件在主轴方向上的对齐方式
crossAxisAlignmentCrossAxisAlignment子组件在交叉轴方向上的对齐方式
mainAxisSizeMainAxisSizeFlex 容器自身在主轴上的尺寸策略
  • 子组件:Flex的子组件常使用Expanded或Flexible来控制空间分配
  • Expanded / Flexible作为Flex的子组件通过flex属性来分配Flex组件空间
  • Flex布局受其父组件传递的约束影响,确保父组件提供了适当的布局约束
  • Expanded 与 Flexible 的区别:Expanded强制子组件填满所有的剩余空间,Flexible根据自身大小调整,不强制占满空间

流式布局

Warp

属性常用值作用说明
directionAxis.horizontal (水平) / Axis.vertical (垂直)设置主轴方向,即排列方向
spacing数值主轴方向上,子组件之间的间距
runSpacing数值交叉轴方向上,行(或列)之间的间距
alignmentWrapAlignment子组件在主轴方向上的对齐方式
runAlignmentWrapAlignment交叉轴方向上的对齐方式
  • 注意:Column / Row / Flex内容超出均不会换行
  • Warp组件更像是Felx组件加了换行特性

List.generate是一个构造器,用于快速构建长度固定且每个元素可以通过索引号确定的列表

层叠布局

Stack / Positioned

可以做到将多个子组件按照Z轴进行叠加排列

属性类型作用说明
alignmentAlignmentGeometry控制非定位子组件在 Stack 内的对齐方式,默认左上角
fitStackFit控制非定位子组件如何适应 Stack 的尺寸
clipBehaviorClip控制子组件超出 Stack 边界时的裁剪方式
childrenList需要被层叠排列的子组件列表
  • Positioned组件是Stack的黄金搭档,对子组件进行精确定位控制。Positioned必须作为Stack的直接子组件
  • Positioned通过方位属性来讲子组件“钉”在Stack的某个角落或边缘

图文组件

Text / TextSpan

属性类型作用说明
dataString必需。要显示的文本内容
styleTextStyle文本样式,可设置颜色、大小、粗细等
textAlignTextAlign文本在容器内的水平对齐方式,如 .left, .center
maxLinesint文本显示的最高行数
overflowTextOverflow文本溢出处理方式

如果需要在同一段文本中显示不同的样式,可用Text.rich构造函数配合TextSpan来实现

Image

图片分类:

分类作用说明
Image.asset()加载项目资源目录(assets)中的图片。需要在 pubspec.yaml 文件中声明资源路径。
Image.network()直接从网络地址加载图片。
Image.file()加载设备本地存储中的图片文件。
Image.memory()加载内存中的图片数据。
  • 注意:Android/HarmonyOS/iOS使用Image.network需要配置网络权限

基本属性:

分类类型作用说明
width / heightdouble设置图片显示区域的宽度和高度
fitBoxFit控制图片如何适应其显示区域,例如是否拉伸、裁剪或保持原比例
alignmentAlignmentGeometry图片在其显示区域内的对齐方式,如 Alignment.center
repeatImageRepeat当图片小于显示区域时,设置是否以及如何重复平铺图片

TextField

常用属性作用说明
controller文本编辑器控制器,用于获取、设置文档内容及监听变化
decoration设置输入框的外观、如标签、提示文字、图标、边框等
style定义输入文本的样式
maxLines最大行数
onChanged输入内容发生变化时执行的回调函数
onSubmitted用户提交输入时的回调函数
  • 使用:使用TextField必须使用有状态组件 使用TextEditingController管理输入内容、onChanged可以监听数据变化 decoration属性下的InputDecoration来定制如 边框、背景、提示文字 obscureText设置为true可隐藏输入内容,用于密码输入框

滚动布局

常用滚动组件

组件特点使用场景
SingleChildScrollView让单个子组件可以用滚动,所有内容一次性渲染长表单、设置页、内容不固定但是总量不多的页面
ListView线性列表,通过 builder 可以实现懒加载,性能优异聊天记录、新闻、常见的单列滚动的数据列表
GridView网格布局列表,支持懒加载,可以固定列数图片墙、商品网格、应用图标列表
CustomScrollView复杂布局方案,通过组合多个 Sliver 组件实现滚动电商首页、社交 App 个人主页多个滚动紧密联动
PageView整页滚动效果,支持横向和纵向应用引导页、图片轮播图、书籍翻页

SingleChildScrollView

包裹一个子组件,让单个子组件实现滚动

  • controller:给组件的controller绑定ScrollController对象
  • 子组件:只能包含一个子组件,要滚动多个组件,通常嵌套在Column或Row组件中
  • 滚动方向:通过scrollDirection属性,默认为垂直方向,也可以设置为水平方向(Axis.horizontal)
  • 特点:一次性构建所有子组件,如果嵌套的Column或Row组件中包含大量的子项,可能会导致性能问题,建议使用ListView
  • 控制滚动:绑定一个ScrollController对象给controller对象,使用animateTo / jumpTo方法控制滚动

ListView

  • 作用:用于构建可滚动列表的核心部件,并提供流程滚动体验
  • 方式:提供多种构造函数,如默认构造函数、ListView.Bulider、ListView.Seperated
  • 机制,采用按需渲染(懒加载),只构建当前可见区域的列表项,极大提升长列表性能

默认构造

适用于静态数量有限数据一次性构建所有的表项

builder模式

  • 作用:处理长数据或动态数据的首选和推荐方式
  • 方式:接受一个itemBuilder回调函数来按需构建列表项,通过itemCount控制列表长度
  • 优势:按需构建,不会再初始化时将所有列表项都创建,而是根据用户的滚动行为,动态地创建和销毁列表项

separated模式

  • 作用:在ListView.builder的基础上,额外提供了构建分割线的能力
  • 方式:需要同时提供itemBuilder、separatorBuilder、itemCount三个属性

GridView

  • 作用:用于创建二位可滚动网格布局的核心组件
  • 方式:提供多种构建方式,GridView.count、GridView.extent、GridView.builder等
  • GirdView的默认构造方式写起来繁琐,很少使用
  • scrollDirection设置滚动方向横向 / 纵向(默认)

GridView.count

基于固定列数的网格布局(最常用之一 )

GridView.extent

基于固定子项最大宽度/高度的网格布局(最常用之二)

  • 通过maxCrossAxisExtent设置子项最大宽度/高度来计算横向或纵向由多少列

GridView.builder

用于网格项数量巨大动态生成的情况,需要接收gridDelegate布局委托属性

  • gridDelegate:
    SliverGridDelegateWithFixedCrossAxisCount:固定列数 mainAxisSpacing 主轴间距
    SliverGridDelegateWithMaxCrossAxisExtent:最大宽度 crossAxisSpacing 交叉轴间距
  • itemBulider构建函数
  • itemCount构建数量
  • childAspectRatio是网格项的宽高比

自定义滚动容器 - CustomScrollView

  • 作用:用于组合多个可滚动组件(如列表、网格),实现统一协调的滚动效果
  • Sliver:Flutter中描述可滚动试图内部一部分内容的组件,它是滚动试图的“切片”
  • 用法:通过sliver属性接收一个Sliver组件列表
  • Sliver组件对应关系:
    SliverList ⇒ ListView
    SliverGrid ⇒ GridView
    SliverAppBar ⇒ AppBar
    SliverPadding ⇒ Padding
    SliverToBoxAdapter ⇒ ToBoxAdapter
    SliverPersistentHeader(粘性吸顶)

参考:

!image.png

SliverPersistentHeader - 粘性吸顶组件

给delegate属性赋值一个继承SliverPersistentHeaderDelegate的对象实例

设置固定属性pinned为true

  • maxExtent:展开时最大高度
  • minExtent:收缩时最小高度
  • shouldRebuild:是否重建
  • build:返回构建Widget

整页滚动容器 - PageView

  • 作用:用于实现分页滚动视图的核心组件
  • 方式:提供多种构造方式,默认构造方式,PageView.builder等

跳转控制

  • 控制器:PageView绑定controller属性,对象类型为PageController
  • 切换方法:controller.jumpToPage / animateToPage