Flutter基础组件(一)

Flutter官方提供的UI组件有非常多,摘取常用的UI组件记录下常见的属性和用法。

基础组件

组件类别 组件名称 描述 常见属性
文本 Text 文本组件,展示文字内容 textAlign:文字对其方式;
maxLine:最多显示行数;
overflow:文字截断方式;
textScaleFactor:文字放大系数;
style:文字样式包括大小,颜色,背景,字体,装饰等;
textSpan: 同一Text不同部分文字效果
按钮 ElevatedButton
TextButton
OutlineButton
IconButton
悬浮按钮,有阴影;
文字按钮,没有阴影和背景;
边框按钮;
图标按钮
icon:接收一个Icon组件,展示图标;
label:接收一个Text组件展示文字(IconButton除外)
onPress: 接收一个点击事件处理器
图形 Image
Icon
展示图片,可以从assert目录,本地文件或者网络上加载图片
图标,可以加载iconfont
image: 设置显示图片的提供者;
width/height:设置图片的宽高;
fit:缩放模式;
repeat:重复模式;
aligne:对齐模式;
icon>color: icon的颜色
选择框 Switch
Checkbox
单选开关
复选框,可以有三种状态:null false true
value:当前的值;
activeColor:选中状态的颜色;
onChanged:选择状态发生变化时的回调
输入 TextField
Form
文本输入框
表单,可分组校验和操作
controller:编辑框控制器,获取内容以及相应操作;
focusNode:控制焦点;
keyboardType:键盘类型;
InputDeraction:输入样式文本背景颜色提示等;
form>autovalidate: 自动检验输入内容的合法性,一有错误即刻提出,否则需要调用formState.validate校验;
form>onWillPop:拦截返回事件;
form>onChange:每个子项发生变化时回调
指示器 LinerProgressIndicator
CircleProgressIndicator
条状的进度指示器
圆形的进度指示器
value: 当前进度,不赋值时表示模糊进度;
backgroundColor:背景颜色;
activeColor:已完成颜色(动画)circleProgressIndicator>strokeWidth: 圆环的粗细

布局类组件

Flutter中组件类型大致为

Widget 描述 用途
LeafRenderObjectWidget 叶子节点的组件类型,没有子组件 通常用来实现基础组件
SingleChildRenderObjectWidget 包含单个子组件的组件类型 通常用来实现包含单个子组件的组件
MultiChildRenderObjectWidget 包含多个子组件的组件类型 通常用来实现包含多个子组件的组件

布局类组件都是直接或者间接继承了 SingleChildRenderObjectWidget 或者 MultiChildRenderObjectWidget;

组件类型 组件名称 描述
约束布局 ConstrainedBox 给子组件增加约束,如minWidth,maxWidth,minHeight,maxHeight等
约束布局 SizedBox 给子组件一个固定大小的约束
约束布局 unConstrainedBox 去除父组件的约束,由子组件自己决定大小
线性布局 Row 水平方向布局,主轴为水平方向,纵轴为竖直方向 MainAxisAlignment表示主轴对齐方式,CrossAxisAlignment表示纵轴对齐方式
线性布局 Column 垂直防线布局,主轴为竖直方向,纵轴为水平方向
弹性布局 Flex 允许子组件按照一定比例来分配空间,结合Expand组件使用
弹性布局 Expand 通过flex属性来分配空间占比;Expand组件只能使用在Flex(Row,Column继承自Flex组件)组件内
流式布局 Wrap 可以自动折行,direction方向,spacing,runspacing表示主纵轴间距,runAlignment 纵轴对齐方式
流式布局 Flow 用于自定义流式布局,需要自己实现FlowDelegate,指定大小,但性能好,灵活
层叠布局 Stack 堆叠布局,类似Android中的FramLayout
层叠布局 Positioned 与Stack配合使用,相对Stack的四点的位置布局
相对定位 Align 相对位置的布局,有两种实现 Alignment 和 FractionalOffset,区别在于原点位置不同
相对定位 Center 居中对齐,如果不设置widthFactor和heightFactor,那么会撑满父组件
信息组件 LayoutBuilder 获取父组件的约束条件,从而动态部署子组件

装饰类组件

这类组件通常是用来给子组件增加样式,间距,裁剪,旋转等功能

组件名称 描述 常用属性
Padding 给子组件增加留白(间距) padding:设置四边间距
DecorationBox 装饰性组件,可在组件绘制前后增加装饰,如背景,形状,阴影等 decoration:装饰类
position: 前景还是背景
Transform 变换组件,可变换子组件的位置,旋转,大小;不影响布局只在绘制阶段生效 transform:变换矩阵
Transform.translate:位移组件
Transform.scale:缩放组件
Transform.rotate: 旋转组件
RotatedBox 旋转组件,会变换子组件的位置和大小,在布局阶段生效 quarterTurns:旋转角度(90度倍数)
Container 容器组件,包含其他各个装饰组件功能,如padding,decoration,transform等 margin:容器外间距,不属于decoration的修饰范围
constraint:容器的大小限制
fogroundDecoration:前景修饰,与背景修饰分开了
ClipOval 子组件为正方形时剪裁成内贴圆形;为矩形时,剪裁成内贴椭圆
ClipRRect 将子组件剪裁为圆角矩形 borderRadius:圆角半径
ClipRect 默认剪裁掉子组件布局空间之外的绘制内容(溢出部分剪裁) clipper:自定义的裁剪器
ClipPath 按照自定义的路径剪裁 clipper:自定义裁剪器
FittedBox 自适应布局,去除父组件约束,根据子组件大小和适应参数绘制 fit:适配方式
aligment:对齐方式
clipBehavor: 裁剪方式
Scaffold 页面骨架,包含appbar,bottomNavigationBar,drawer,floatActionButton等 appBar:标题栏;
bottomNavigationBar:底部导航栏;
drawer: 抽屉菜单;
floatActionButton:悬浮按钮

可滚动组件

Flutter 中的可滚动组件主要由三个角色组成:ScrollableViewportSliver

  • Scrollable :用于处理滑动手势,确定滑动偏移,滑动偏移变化时构建 Viewport 。
  • Viewport:显示的视窗,即列表的可视区域;
  • Sliver:视窗里显示的元素。

可滚动组件的通用配置:

  • scrollDireaction:设置滚动的主轴(横向还是纵向)
  • reverse: 是否反方向滚动
  • controller: 用来控制和监听组件滚动
  • physics:滚动响应动作,如停止滚动后的动画效果,滚动到头后的效果
  • cacheExtend: 组件缓存和预渲染
组件名称 描述 常用属性
SingleChildScrollView 可滚动组件,只有一个子组件,不会按需加载,用于组件内容不是很多的情况下。 primary:表示是否使用widget树中的默认的primaryScrollController
ListView 沿一个方向上线性布局的可滚动组件 itemExtent:子组件的高度或宽度,可提高性能
protoTypeItem: 子组件原型,不知道itemExtent的情况下使用
ListView.Builder: 列表项构造器,列表子组件比较多时使用
ListView.Separated: 可在列表项中添加分割线
ScrollController 滚动组件控制器,可以获取当前滚动位置,控制滚动等,组件dispose时需要调用dispose防止内存泄漏 offset:当前滚动位置;
jumpTo:跳转到指定的位置;
animateTo:执行一个动画效果到指定位置
addListener: 添加一个滚动监听
NotificationListener 监听滚动组件的滚动事件;可以在滚动组件与根组件之间任意位置 pixels:当前滚动长度;
maxScrollExtent:最大可滚动长度;
extentBefore:已滚动长度;
extentInset:视窗内长度;
extentAfter:还可以滚动的长度;
atEdge:是否到滚动边界
AnimatedList 与ListView相似,当时在添加和移除列表项时,会执行动画效果 State.insertItem: 应用插入时执行动画;
State.removeItem:应用删除时执行动画
GridView 网格布局 gridDelegate:控制网格如何布局
PageView 页面切换布局,可配合Tab使用 allowImplicitScrolling:是否允许缓存页面(前后各一页)
TabBarView 页面切换组件,封装了PageView tabController:用于监听和控制TabBarView的页面切换
TabBar 导航标题栏组件,通常和TabBarView一起使用 tabController: 可以和TabBarView使用同一个controller
tabs: 具体的每个tab内容
indicator: 指示器
CustomScrollView 将多个滚动组件统一起来,共用scrollable和viewport,包含的子组件必须都是Sliver类型组件 slivers:接收一个sliver对象的数组
NestedScrollView 嵌套滚动组件 headerSliverBuilder:构建外部滚动组件,必须时Sliver; body:内部滚动组件,与NestedScrollView共用controller

滚动组件的缓存

设置addAutomaticKeepAlives 为true时,ListView会自动为子项添加一个根组件AutomaticKeepAlives;Flutter提供了一个AutomaticKeepAliveClientMixin的混合,可以在根组件的state中混入。

class _PageState extends State<Page> with AutomaticKeepAliveClientMixin {

  @override
  Widget build(BuildContext context) {
    super.build(context); // 必须调用
    return Center(child: Text("${widget.text}", textScaleFactor: 5));
  }

  @override
  bool get wantKeepAlive => true; // 是否需要缓存
}

弹框组件

组件名称 描述 常用属性
AlertDialog 提示确认框 title: 对话框标题;
content:对话框内容;
actions:对话框操作
SimpleDialog 选择框,用于列表选择 children: 接收SimpleDialogOption,用于处理选择
Dialog AlertDialog & SimpleDialog的基类,可用于自定义弹框

showDialog 是Material组件库里用于弹出对话框的方法。它的返回值Future为弹框操作的返回值。

Future<T?> showDialog<T>({
    required BuildContext context,
    required WidgetBuilder builder, //构建对话框内部UI
    bool barrierDismissible = true // 点击遮罩是否关闭对话框
});

ShowGeneralDialog 提供了一个弹出非Material风格的普通对话框方法。

Future<T?> showGeneralDialog<T>({
  required BuildContext context,
  required RoutePageBuilder pageBuilder, //构建对话框内部UI
  bool barrierDismissible = false, //点击遮罩是否关闭对话框
  String? barrierLabel, // 语义化标签(用于读屏软件)
  Color barrierColor = const Color(0x80000000), // 遮罩颜色
  Duration transitionDuration = const Duration(milliseconds: 200), // 对话框打开/关闭的动画时长
  RouteTransitionsBuilder? transitionBuilder, // 对话框打开/关闭的动画
  ...
})

showModalBottomSheet 提供了一个Material风格的底部弹框方法。

Future<T?> showModalBBottomSheet<T>({
    required BuildContext context,
    required WidgetBuilder builder,//构建对话框的UI
})

showDatePicker 提供了一个Materail风格的日期选择选择器

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容