如需转载,请注明出处: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)的更多相关文章

  1. Flutter学习笔记(22)--单个子元素的布局Widget(Container、Padding、Center、Align、FittedBox、Offstage、LimitedBox、OverflowBox、SizedBox)

    如需转载,请注明出处:Flutter学习笔记(22)--单个子元素的布局Widget(Container.Padding.Center.Align.FittedBox.Offstage.Limited ...

  2. Flutter学习笔记(8)--Dart面向对象

    如需转载,请注明出处:Flutter学习笔记(7)--Dart异常处理 Dart作为高级语言,支持面向对象的很多特性,并且支持基于mixin的继承方式,基于mixin的继承方式是指:一个类可以继承自多 ...

  3. Flutter学习笔记(36)--常用内置动画

    如需转载,请注明出处:Flutter学习笔记(36)--常用内置动画 Flutter给我们提供了很多而且很好用的内置动画,这些动画仅仅需要简单的几行代码就可以实现一些不错的效果,Flutter的动画分 ...

  4. Flutter学习笔记(10)--容器组件、图片组件

    如需转载,请注明出处:Flutter学习笔记(10)--容器组件.图片组件 上一篇Flutter学习笔记(9)--组件Widget我们说到了在Flutter中一个非常重要的理念"一切皆为组件 ...

  5. Flutter学习笔记(12)--列表组件

    如需转载,请注明出处:Flutter学习笔记(12)--列表组件 在日常的产品项目需求中,经常会有列表展示类的需求,在Android中常用的做法是收集数据源,然后创建列表适配器Adapter,将数据源 ...

  6. Flutter学习笔记(13)--表单组件

    如需转载,请注明出处:Flutter学习笔记(13)--表单组件 表单组件是个包含表单元素的区域,表单元素允许用户输入内容,比如:文本区域,下拉表单,单选框.复选框等,常见的应用场景有:登陆.注册.输 ...

  7. Flutter学习笔记(16)--Scaffold脚手架、AppBar组件、BottomNavigationBar组件

    如需转载,请注明出处:Flutter学习笔记(15)--MaterialApp应用组件及routes路由详解 今天的内容是Scaffold脚手架.AppBar组件.BottomNavigationBa ...

  8. Flutter学习笔记(24)--SingleChildScrollView滚动组件

    如需转载,请注明出处:Flutter学习笔记(23)--多 在我们实际的项目开发中,经常会遇到页面UI内容过多,导致手机一屏展示不完的情况出现,以Android为例,在Android中遇到这类情况的做 ...

  9. Flutter学习笔记(25)--ListView实现上拉刷新下拉加载

    如需转载,请注明出处:Flutter学习笔记(25)--ListView实现上拉刷新下拉加载 前面我们有写过ListView的使用:Flutter学习笔记(12)--列表组件,当列表的数据非常多时,需 ...

随机推荐

  1. 个人永久性免费-Excel催化剂功能第44波-可见区域复制粘贴不覆盖隐藏内容

    Excel的复制粘贴操作,每天都在进行,若其中稍能提升一点效率,长久来说,实在是很可观的效率提升. Excel自带的复制粘贴功能,若复制的数据源或粘贴的目标位置中有隐藏的行列内容,简单一个复制粘贴充满 ...

  2. C#3.0新增功能01 自动实现的属性

    连载目录    [已更新最新开发文章,点击查看详细] 在 C# 3.0 及更高版本,当属性访问器中不需要任何其他逻辑时,自动实现的属性会使属性声明更加简洁. 它们还允许客户端代码创建对象. 当你声明以 ...

  3. Python文件的两种用途

    目录 一.Python文件的两种用途 一.Python文件的两种用途 python文件总共有两种用途,一种是执行文件:另一种是被当做模块导入. 编写好的一个python文件可以有两种用途: 脚本,一个 ...

  4. python注释-输入输出-基本数据类型-运算符

    python注释 用处:注释用来书写一些解释性信息,对代码的逻辑作用等作出描述 单行注释.多行注释 # 这是行注释,注释内容与# 之间要空一格 print("hello world!&quo ...

  5. 算法-一步步教你如何用c语言实现堆排序(非递归)

    看了左神的堆排序,觉得思路很清晰,比常见的递归的堆排序要更容易理解,所以自己整理了一下笔记,带大家一步步实现堆排序算法 首先介绍什么是大根堆:每一个子树的最大值都是子树的头结点,即根结点是所有结点的最 ...

  6. [04] HEVD 内核漏洞之IntegerOverflow

    作者:huity出处:https://www.cnblogs.com/huity35/p/11252574.html版权:本文版权归作者所有.文章在博客园.看雪.个人博客同时发布.转载:欢迎转载,但未 ...

  7. 考试安排查询脚本(CUP)

    去年热情高涨的时候心血来潮做了个简易的查询脚本,限于当时技术水平(菜),实现得不是很好,这几天终于想起来填坑了.环境依赖: brew install python3 pip3 install requ ...

  8. 【JDK】JDK源码分析-ArrayList

    概述 ArrayList 是 List 接口的一个实现类,也是 Java 中最常用的容器实现类之一,可以把它理解为「可变数组」. 我们知道,Java 中的数组初始化时需要指定长度,而且指定后不能改变. ...

  9. [NSNull intValue]: unrecognized selector sent to instance 0x375c9860

    今天遇到这个问题,程序崩溃了……日志如下: -[NSNull intValue]: unrecognized selector sent to instance 0x375c9860*** Termi ...

  10. Intellij IDEA 中 使用 Git

    前一段时间使用 Microsoft 的 Visual Studio Code 中使用 Git 对前端项目进行项目代码的开发提交. 使用后感觉挺好的,用的多了也觉得挺简单方便的. 现在需要在 Intel ...