首页 > 其他分享 >Flutter 布局备忘录 -- 多图警告,干货建议收藏

Flutter 布局备忘录 -- 多图警告,干货建议收藏

时间:2022-10-07 18:00:08浏览次数:44  
标签:Container Icons -- Text 多图 child Icon Flutter size

你是否需要了解 ​​Flutter​​ 布局的案例?

这里我将展示我在使用 ​​Flutter​​ 布局的代码片段。我将通过精美的代码片段结合可视化的图形来举例。

本文注重 ​​Flutter​​ 部件中比较有用的一些来展示,而不是走马观花展示一大推的部件内容。

本文是翻译的文章,采用意译的方式

Row and Column

行(Row)和列(Column)的布局

MainAxisAlignment

Row

Column

Flutter 布局备忘录 -- 多图警告,干货建议收藏_Android

Flutter 布局备忘录 -- 多图警告,干货建议收藏_sed_02

Row /*or Column*/(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
],
),

Row

Column

Flutter 布局备忘录 -- 多图警告,干货建议收藏_sed_03

Flutter 布局备忘录 -- 多图警告,干货建议收藏_ico_04

Row /*or Column*/(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
],
),

Row

Column

Flutter 布局备忘录 -- 多图警告,干货建议收藏_Android_05

Flutter 布局备忘录 -- 多图警告,干货建议收藏_sed_06

Row /*or Column*/(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
],
),

Row

Column

Flutter 布局备忘录 -- 多图警告,干货建议收藏_sed_07

Flutter 布局备忘录 -- 多图警告,干货建议收藏_sed_08

Row /*or Column*/(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
],
),

Row

Column

Flutter 布局备忘录 -- 多图警告,干货建议收藏_iOS_09

Flutter 布局备忘录 -- 多图警告,干货建议收藏_前端_10

Row /*or Column*/(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
],
),

Row

Column

Flutter 布局备忘录 -- 多图警告,干货建议收藏_前端_11

Flutter 布局备忘录 -- 多图警告,干货建议收藏_ico_12

Row /*or Column*/(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
],
),

CrossAxisAlignment

Flutter 布局备忘录 -- 多图警告,干货建议收藏_Android_13

如果你需要文本是针对基线对齐,那么你应该使用 ​​CrossAxisAlignment.baseline​​。

Row(
crossAxisAlignment: CrossAxisAlignment.baseline,
textBaseline: TextBaseline.alphabetic,
children: <Widget>[
Text(
'Baseline',
style: Theme.of(context).textTheme.headline2,
),
Text(
'Baseline',
style: Theme.of(context).textTheme.bodyText2,
),
],
),

Row

Column

Flutter 布局备忘录 -- 多图警告,干货建议收藏_前端_14

Flutter 布局备忘录 -- 多图警告,干货建议收藏_前端_15

Row /*or Column*/(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 200),
Icon(Icons.star, size: 50),
],
),

Row

Column

Flutter 布局备忘录 -- 多图警告,干货建议收藏_sed_16

Flutter 布局备忘录 -- 多图警告,干货建议收藏_前端_17

Row /*or Column*/(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 200),
Icon(Icons.star, size: 50),
],
),

Row

Column

Flutter 布局备忘录 -- 多图警告,干货建议收藏_前端_18

Flutter 布局备忘录 -- 多图警告,干货建议收藏_ico_19

Row /*or Column*/(
crossAxisAlignment: CrossAxisAlignment.end,
children: <Widget>[
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 200),
Icon(Icons.star, size: 50),
],
),

Row

Column

Flutter 布局备忘录 -- 多图警告,干货建议收藏_ico_20

Flutter 布局备忘录 -- 多图警告,干货建议收藏_sed_21

Row /*or Column*/(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 200),
Icon(Icons.star, size: 50),
],
),

MainAxisSize

Row

Column

Flutter 布局备忘录 -- 多图警告,干货建议收藏_前端_22

Flutter 布局备忘录 -- 多图警告,干货建议收藏_iOS_23

Row /*or Column*/(
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
],
),

Row

Column

Flutter 布局备忘录 -- 多图警告,干货建议收藏_sed_24

Flutter 布局备忘录 -- 多图警告,干货建议收藏_前端_25

Row /*or Column*/(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
Icon(Icons.star, size: 50),
],
),

IntrinsicWidth and IntrinsicHeight

在行列布局中,如何使得所有的部件跟宽度/高度最大的部件同宽/同高呢?如下:

我们假有下面的布局:

Flutter 布局备忘录 -- 多图警告,干货建议收藏_ico_26

Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('IntrinsicWidth')),
body: Center(
child: Column(
children: <Widget>[
RaisedButton(
onPressed: () {},
child: Text('Short'),
),
RaisedButton(
onPressed: () {},
child: Text('A bit Longer'),
),
RaisedButton(
onPressed: () {},
child: Text('The Longest text button'),
),
],
),
),
);
}

那么,你想所有的按钮的宽度都跟最宽的按钮那么宽,那就使用 ​​IntrinsicWidth​​:

Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('IntrinsicWidth')),
body: Center(
child: IntrinsicWidth(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
RaisedButton(
onPressed: () {},
child: Text('Short'),
),
RaisedButton(
onPressed: () {},
child: Text('A bit Longer'),
),
RaisedButton(
onPressed: () {},
child: Text('The Longest text button'),
),
],
),
),
),
);
}

同理,如果你想所有的部件的高度跟最高的部件一样高,你需要结合 ​​IntrinsicHeight​​​ 和 ​​Row​​ 来实现。

Stack

​Stack​​ 很适合小部件相互叠加。

Flutter 布局备忘录 -- 多图警告,干货建议收藏_Android_27

Widget build(BuildContext context) {
Widget main = Scaffold(
appBar: AppBar(title: Text('Stack')),
);

return Stack(
fit: StackFit.expand,
children: <Widget>[
main,
Banner(
message: "Top Start",
location: BannerLocation.topStart,
),
Banner(
message: "Top End",
location: BannerLocation.topEnd,
),
Banner(
message: "Bottom Start",
location: BannerLocation.bottomStart,
),
Banner(
message: "Bottom End",
location: BannerLocation.bottomEnd,
),
],
);
}

使用自己的部件,你需要将它们放在 ​​Positioned​​ 部件中。

Flutter 布局备忘录 -- 多图警告,干货建议收藏_sed_28

Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Stack')),
body: Stack(
fit: StackFit.expand,
children: <Widget>[
Material(color: Colors.yellowAccent),
Positioned(
top: 0,
left: 0,
child: Icon(Icons.star, size: 50),
),
Positioned(
top: 340,
left: 250,
child: Icon(Icons.call, size: 50),
),
],
),
);
}

如果你不想猜测顶部/底部的值,你可以使用 ​​LayoutBuilder​​ 部件来检索它们的值。

Flutter 布局备忘录 -- 多图警告,干货建议收藏_前端_29

Widget build(BuildContext context) {
const iconSize = 50;
return Scaffold(
appBar: AppBar(title: Text('Stack with LayoutBuilder')),
body: LayoutBuilder(
builder: (context, constraints) =>
Stack(
fit: StackFit.expand,
children: <Widget>[
Material(color: Colors.yellowAccent),
Positioned(
top: 0,
child: Icon(Icons.star, size: iconSize),
),
Positioned(
top: constraints.maxHeight - iconSize,
left: constraints.maxWidth - iconSize,
child: Icon(Icons.call, size: iconSize),
),
],
),
),
);
}

Expanded

​Expanded​​​ 配合 Flex\Flexbox 布局实现,它对于多项目分配空间很棒。

Flutter 布局备忘录 -- 多图警告,干货建议收藏_iOS_30

Row(
children: <Widget>[
Expanded(
child: Container(
decoration: const BoxDecoration(color: Colors.red),
),
flex: 3,
),
Expanded(
child: Container(
decoration: const BoxDecoration(color: Colors.green),
),
flex: 2,
),
Expanded(
child: Container(
decoration: const BoxDecoration(color: Colors.blue),
),
flex: 1,
),
],
),

ConstrainedBox

默认的,很多部件多尽量使用小空间,比如:

Flutter 布局备忘录 -- 多图警告,干货建议收藏_前端_31

Card(
child: const Text('Hello World!'),
color: Colors.yellow,
),

​ConstrainedBox​​ 允许小部件根据需要使用剩下的空间。

Flutter 布局备忘录 -- 多图警告,干货建议收藏_前端_32

ConstrainedBox(
constraints: BoxConstraints.expand(),
child: const Card(
child: const Text('Hello World!'),
color: Colors.yellow,
),
),

使用 ​​BoxConstraints​​,你可以指定一个小部件可以有多少空间,你可以指定高度/宽度的最小/最大值。

除非指定值,否则 ​​BoxConstraints.expand​​ 使用无限的空间量(也就是使用剩下的所有空间):

Flutter 布局备忘录 -- 多图警告,干货建议收藏_Android_33

ConstrainedBox(
constraints: BoxConstraints.expand(height: 300),
child: const Card(
child: const Text('Hello World!'),
color: Colors.yellow,
),
),

上面

标签:Container,Icons,--,Text,多图,child,Icon,Flutter,size
From: https://blog.51cto.com/u_11966691/5734817

相关文章

  • storcli工具定位硬盘位置更换硬盘
    a)    查询硬盘具体槽位信息。/opt/MegaRAID/storcli/storcli64–pdlist–aall|grep序列号–B24记录第一行Enclosure和第二行Slot的值。图中为0和7。b)......
  • 链表
    1.单链表的定义和存储:typedefstructLnode{//声明结点类型和指向结点的指针类型ElemTypedata;//结点的数据域structLnode*next;//结点的指针域}Ln......
  • C++新特性(待完善)
    C++11的特性:1.auto 类型推导:auto关键字:自动类型推导,编译器会在编译期间通过初始值或者函数返回值推导出变量的类型,通过auto定义的变量必须有初始值。auto关键字基......
  • 数据结构-线性表
    ​@目录XDOJ0258-链表去重XDOJ0263-递增链表的插入XDOJ0264-反转链表XDOJ0276-多项式加减法XDOJ0278-约瑟夫环XDOJ0279-一元稀疏多项式计算器最后最近懒,栈和队列找机会发......
  • 【中国大学生计算机大赛三等奖】冬奥会智能分析与预测可视化平台-简介(一)
    一前言此项目为冬奥会智能分析与预测可视化平台,这个项目是用于参加中国大学生计算机设计大赛-信息可视化设计赛道的项目,最终获得国赛三等奖的成绩。此项目主要包括......
  • mysql之事务隔离级别以及MVCC
    1.事务特性:ACID原子性:undolog--要么全部成功,要么全部失败 一致性:最核心和最本质的要求隔离性:MVCC(多版本并发控制)持久性:redolog......
  • MySQL用户也可以是个角色
    前言角色(Role),可以认为是一些权限的集合,一直是存在各个数据库中,比如Oracle、SQLServer、OceanBase等,MySQL自从8.0release才引入角色这个概念。为用户赋予统一的角......
  • P7963 [NOIP2021] 棋局
    给定\(n\timesm\)的棋盘,连有横纵\(2\)种无向边,有\(3\)种类型的边:只允许按照这条边走\(1\)步允许继续走边权为\(2\)的边,但不允许改变方向允许继续走边权为......
  • Ubuntu系统anaconda报错version `GLIBCXX_3.4.30' not found
    参考文章:https://blog.csdn.net/zhu_charles/article/details/75914060  ================================================   在anaconda中安装deepmind_la......
  • mysql8.0创建用户并给用户授权
    MySql8有新的安全要求,不能像之前的版本那样一次性创建用户并授权需要先创建用户,再进行授权操作1.创建新用户:createuser'username'@'host'identifiedby'password'......