Flutter学习笔记(23)--多个子元素的布局Widget(Rwo、Column、Stack、IndexedStack、Table、Wrap)
如需转载,请注明出处:Flutter学习笔记(23)--多个子元素的布局Widget(Rwo、Column、Stack、IndexedStack、Table、Wrap)
上一篇梳理了拥有单个子元素布局的Widget,今天来梳理一下拥有多个子元素布局的Widget。
Row
Row组件常见属性如下:
mainAxisAlignment:主轴的排列方式
crossAxisAlignment:次轴的排列方式
mainAxisSize:主轴应该占据多少空间,取值max为最大,min为最小
children:组件子元素,它的本质是一个List列表
对于Row来说,水平方向是主轴,垂直方向是次轴。
首先来看一下mainAxisAlignment属性值都有哪些
enum MainAxisAlignment {
start,//将子控件放在主轴开始的位置
end,//将子控件放在主轴结束的位置
center,//将子控件放在主轴中间的位置
spaceBetween,//将主轴空白位置进行均分,排列子元素,首尾没有空隙
spaceAround,//将主轴空白区域均分,使中间各个子控件间距相等,首尾子控件间距为中间子控件间距的一半
spaceEvenly,//将主轴空白区域均分,使各个子空间间距相等
}
Demo示例:
import 'package:flutter/material.dart';
void main() => runApp(DemoApp());
class DemoApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Children Demo',
home: new Scaffold(
appBar: AppBar(
title: new Text('Children Demo'),
),
body: new Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
new Text(''),
new Text(''),
new Text('')
],
),
),
);
}
}

Column
Column组件常见属性如下:
mainAxisAlignment:主轴的排列方式
crossAxisAlignment:次轴的排列方式
mainAxisSize:主轴应该占据多少空间,取值max为最大,min为最小
children:组件子元素,它的本质是一个List列表
对Column来说,垂直方向是主轴,水平方向是次轴,使用上和Row大同小异
Demo示例:
import 'package:flutter/material.dart';
void main() => runApp(DemoApp());
class DemoApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Children Demo',
home: new Scaffold(
appBar: AppBar(
title: new Text('Children Demo'),
),
body: new Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
new Text(''),
new Text(''),
new Text('')
],
),
),
);
}
}

Stack
Stack/alignment:
Stack组件的每一个子组件要么定位,要么不定位,定位的子组件是用Positioned组件包裹的,Stack组件本身包含所有不定位的子组件,子组件根据alignment属性定位(默认为左上角)。然后根据定位的子组件的top、right、bottom、left属性将他们放置在Stack组件上。
Stack既然是允许子元素堆叠的组件,那么定位堆叠位置的属性值有哪些呢?
alignment属性值:bottomCenter 底部中间位置、bottomLeft 底部左侧位置、bottomRight 底部右侧位置、center 正中间位置、centerLeft 中间居左位置、centerRight 中间居右位置、topCenter 上部居中位置、topLeft 上部居左位置、topRight 上部居右位置
Demo示例:
import 'package:flutter/material.dart';
void main() => runApp(DemoApp());
class DemoApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Children Demo',
home: new Scaffold(
appBar: AppBar(
title: new Text('Children Demo'),
),
body: new Center(
child: new Stack(
alignment: Alignment.centerLeft,
children: <Widget>[
new Container(
width: 200.0,
height: 200.0,
color: Colors.blue,
),
new Text('这是一段文本')
],
),
),
),
);
}
}

Stack/Positioned:
上面的示例是通过系统提供的定位来给子元素进行堆叠,但是实际工作中,上面的几类属性值往往不能满足我们UI的需求,UI可能会要求子元素放在任何你想不到的位置,那么这时候就需要用到我们Positioned来进行定位了。
Positioned属性值:top 子元素相对顶部边界距离,left 子元素相对左侧边界距离,right 子元素相对右侧边界距离,bottom 子元素相对底部边界距离。
Demo示例:
import 'package:flutter/material.dart';
void main() => runApp(DemoApp());
class DemoApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Children Demo',
home: new Scaffold(
appBar: AppBar(
title: new Text('Children Demo'),
),
body: new Center(
child: new Stack(
children: <Widget>[
new Container(
width: 200.0,
height: 200.0,
color: Colors.blue,
),
new Positioned(
top: 20.0,
left: 50.0,
child: new Text('这是一段文本')
)
],
),
),
),
);
}
}

IndexedStack
IndexedStack继承自Stack,它的作用是显示第index个child,其他的child都是不可见的,所以IndexedStack的尺寸永远是和最大的子节点尺寸一致。由于IndexedStack是继承自Stack,所以它只比Stack多了一个index属性,即对应child的索引。
Demo示例:
import 'package:flutter/material.dart';
void main() => runApp(DemoApp());
class DemoApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Children Demo',
home: new Scaffold(
appBar: AppBar(
title: new Text('Children Demo'),
),
body: new Center(
child: new IndexedStack(
index: ,
children: <Widget>[
new Container(
width: 200.0,
height: 200.0,
color: Colors.blue,
),
new Positioned(
top: 20.0,
left: 50.0,
child: new Text('这是一段文本')
)
],
),
),
),
);
}
}

Table
Table表格布局,每一行的高度由其内容决定,每一列的宽度由columnWidths属性单独控制。
Table组件常见属性如下:
columnWidths:设置每一列的宽度。
defaultColumnWidth:默认的每一列宽度,默认情况下均分。
textDirection:文字方向。
border:表格边框。
defaultVerticalAlignment:默认垂直方向的对齐方式,top 放置在顶部、middle 垂直居中、bottom 放置在底部、baseline 文本baseline对齐、fill 充满整个cell
import 'package:flutter/material.dart';
void main() => runApp(DemoApp());
class DemoApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Children Demo',
home: new Scaffold(
appBar: AppBar(
title: new Text('Children Demo'),
),
body: new Table(
defaultVerticalAlignment: TableCellVerticalAlignment.bottom,
// 设置表格有多少列,并且指定列宽
columnWidths:const <int,TableColumnWidth> {
:FixedColumnWidth(40.0),
:FixedColumnWidth(40.0),
:FixedColumnWidth(60.0),
:FixedColumnWidth(60.0),
:FixedColumnWidth(130.0),
},
// 设置表格边框样式
border: TableBorder.all(
color: Colors.blue,
width: 2.0,
style: BorderStyle.solid
),
children: const <TableRow>[
// 添加第一行数据
TableRow(
children: <Widget>[
SizedBox(
child: Text('姓名'),
height: ,
),
Text('性别'),
Text('年龄'),
Text('身高'),
Text('备注'),
],
),
// 添加第二行数据
TableRow(
children: <Widget>[
Text('张三'),
Text('男'),
Text(''),
Text(''),
Text('学渣'),
],
),
// 添加第三行数据
TableRow(
children: <Widget>[
Text('李四'),
Text('男'),
Text(''),
Text(''),
Text('学酥'),
],
),
// 添加第四行数据
TableRow(
children: <Widget>[
Text('王五'),
Text('男'),
Text(''),
Text(''),
Text('学霸'),
],
),
// 添加第五行数据
TableRow(
children: <Widget>[
Text('小梅'),
Text('女'),
Text(''),
Text(''),
Text('学神,需要重点培养'),
],
),
],
),
),
);
}
}

Wrap
import 'package:flutter/material.dart';
void main() => runApp(DemoApp());
class DemoApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Children Demo',
home: new Scaffold(
appBar: AppBar(
title: new Text('Children Demo'),
),
body: new Wrap(
spacing: 3.0,
runSpacing: 20.0,//纵轴方向的间距
alignment: WrapAlignment.end,//纵轴方向的对其方式
children: <Widget>[
new Chip(
avatar: CircleAvatar(
backgroundColor: Colors.blue,
child: new Text('A'),
),
label: new Text('文本一'),
),
new Chip(
avatar: CircleAvatar(
backgroundColor: Colors.blue,
child: new Text('B'),
),
label: new Text('文本二'),
),
new Chip(
avatar: CircleAvatar(
backgroundColor: Colors.blue,
child: new Text('C'),
),
label: new Text('文本三'),
),
new Chip(
avatar: CircleAvatar(
backgroundColor: Colors.blue,
child: new Text('D'),
),
label: new Text('文本四'),
),
new Chip(
avatar: CircleAvatar(
backgroundColor: Colors.blue,
child: new Text('E'),
),
label: new Text('文本五'),
),
],
),
),
);
}
}

Flutter学习笔记(23)--多个子元素的布局Widget(Rwo、Column、Stack、IndexedStack、Table、Wrap)的更多相关文章
- Flutter学习笔记(22)--单个子元素的布局Widget(Container、Padding、Center、Align、FittedBox、Offstage、LimitedBox、OverflowBox、SizedBox)
如需转载,请注明出处:Flutter学习笔记(22)--单个子元素的布局Widget(Container.Padding.Center.Align.FittedBox.Offstage.Limited ...
- Flutter学习笔记(8)--Dart面向对象
如需转载,请注明出处:Flutter学习笔记(7)--Dart异常处理 Dart作为高级语言,支持面向对象的很多特性,并且支持基于mixin的继承方式,基于mixin的继承方式是指:一个类可以继承自多 ...
- Flutter学习笔记(36)--常用内置动画
如需转载,请注明出处:Flutter学习笔记(36)--常用内置动画 Flutter给我们提供了很多而且很好用的内置动画,这些动画仅仅需要简单的几行代码就可以实现一些不错的效果,Flutter的动画分 ...
- Flutter学习笔记(10)--容器组件、图片组件
如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 上一篇Flutter学习笔记(9)--组件Widget我们说到了在Flutter中一个非常重要的理念"一切皆为组件 ...
- Flutter学习笔记(12)--列表组件
如需转载,请注明出处:Flutter学习笔记(12)--列表组件 在日常的产品项目需求中,经常会有列表展示类的需求,在Android中常用的做法是收集数据源,然后创建列表适配器Adapter,将数据源 ...
- Flutter学习笔记(13)--表单组件
如需转载,请注明出处:Flutter学习笔记(13)--表单组件 表单组件是个包含表单元素的区域,表单元素允许用户输入内容,比如:文本区域,下拉表单,单选框.复选框等,常见的应用场景有:登陆.注册.输 ...
- Flutter学习笔记(16)--Scaffold脚手架、AppBar组件、BottomNavigationBar组件
如需转载,请注明出处:Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解 今天的内容是Scaffold脚手架.AppBar组件.BottomNavigationBa ...
- Flutter学习笔记(24)--SingleChildScrollView滚动组件
如需转载,请注明出处:Flutter学习笔记(23)--多 在我们实际的项目开发中,经常会遇到页面UI内容过多,导致手机一屏展示不完的情况出现,以Android为例,在Android中遇到这类情况的做 ...
- Flutter学习笔记(25)--ListView实现上拉刷新下拉加载
如需转载,请注明出处:Flutter学习笔记(25)--ListView实现上拉刷新下拉加载 前面我们有写过ListView的使用:Flutter学习笔记(12)--列表组件,当列表的数据非常多时,需 ...
随机推荐
- 【原】深度学习的一些经验总结和建议 | To do v.s Not To Do
前言:本文同步发布于公众号:Charlotte数据挖掘,欢迎关注,获得最新干货- 昨天看到几篇不同的文章写关于机器学习的to do & not to do,有些观点赞同,有些不赞同,是现在算法 ...
- 个人永久性免费-Excel催化剂功能第41波-文件文件夹相关函数
对于日常办公过程中,每天面对的操作离不开文件.文件夹的操作,当然可以用资源管理器.Everything之类的管理软件来管理.但涉及到批量操作时,在Excel环境或许是个更好的方式,前面很多的内容中不断 ...
- Java NIO学习系列五:I/O模型
前面总结了很多IO.NIO相关的基础知识点,还总结了IO和NIO之间的区别及各自适用场景,本文会从另一个视角来学习一下IO,即IO模型.什么是IO模型?对于不同人.在不同场景下给出的答案是不同的,所以 ...
- PHP ErrorException 积累
ErrorException [不定时更新] ErrorException1: Undefined index: allocate 描述:PHP默认会对未声明变量进行提示,这种默认的提示是可以进行忽略 ...
- python课堂整理12---递归
一.递归特性 1.必须有一个明确的结束条件 2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少 3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据 ...
- spring 注解验证@NotNull等使用方法
@Null 被注释的元素必须为null@NotNull 被注释的元素不能为null@AssertTrue 被注释的元素必须为true@AssertFalse 被注释的元素必须为false@Min(va ...
- netty使用EmbeddedChannel对channel的出入站进行单元测试
一种特殊的Channel实现----EmbeddedChannel,它是Netty专门为改进针对ChannelHandler的单元测试而提供的. 名称 职责 writeInbound 将入站消息写到E ...
- mule优缺点和MEL
优点1.开源 https://github.com/mulesoft/mule2.丰富的connector ,可以通过不同的形式来连接各个系统JMS.Web Service.JDBC.HTTP等3.c ...
- 20190803 NOIP模拟测试12「斐波那契(fibonacci)· 数颜色 · 分组 」
164分 rank11/64 这次考的不算太差,但是并没有多大的可能性反超(只比一小部分人高十几分而已),时间分配还是不均,T2两个半小时,T1半个小时,T3-额十几分钟吧 然额付出总是与回报成反比的 ...
- 四、Python基础(1)
目录 四.Python基础(1) 四.Python基础(1) 1.什么是变量? 一种变化的量,量是记录世界上的状态,变指得是这些状态是会变化的. 2.为什么有变量? 因为计算机程序的运行就是一系列状态 ...