从0开始写一个基于Flutter的开源中国客户端(4)——Flutter布局基础

小福利:

在当下这个碎片化信息环境的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021大厂最新Android面试真题解析

Android大厂面试真题解析

各个模块学习视频:如数据结构与算法

算法与数据结构资料图

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。
一线互联网架构师

这份体系学习笔记,适应人群:**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!点赞+评论即可获得!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

static const Alignment center = const Alignment(0.0, 0.0);

/// The center point along the right edge.
static const Alignment centerRight = const Alignment(1.0, 0.0);

/// The bottom left corner.
static const Alignment bottomLeft = const Alignment(-1.0, 1.0);

/// The center point along the bottom edge.
static const Alignment bottomCenter = const Alignment(0.0, 1.0);

/// The bottom right corner.
static const Alignment bottomRight = const Alignment(1.0, 1.0);

FittedBox组件

FittedBox组件根据fit属性来确定子组件的位置,fit属性是一个BoxFit类型的值,BoxFit是个枚举类,取值有如下几种:

enum BoxFit {
fill,
contain,
cover,
fitWidth,
fitHeight,
none,
scaleDown,
}

在我的上一篇博文中,在说到Image组件时,已有对于这几种BoxFit类型的介绍,这里再用一段代码和截图来直观说明上面几种BoxFit,在下面的代码中,我们在大小为200*100的Container中放置一个Text,使用FittedBox来控制Text的不同显示状态:

new Container(
width: 200.0,
height: 100.0,
color: Colors.red,
child: new FittedBox(
child: new Text(“hello world”),
fit: BoxFit.fill,
)
)

当fit取不同值时,上面的代码运行结果如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

AspectRatio组件

AspectRatio组件用于让它的子组件按一定的比例显示,下面是示例代码:

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: “Test”,
home: new Scaffold(
appBar: new AppBar(
title: new Text(“Test”)
),
body: new AspectRatio(
// Container组件按16:9(width / height)显示
aspectRatio: 16.0 / 9.0,
child: new Container(
color: Colors.red,
),
)
),
);
}
}

如果将aspectRatio设置为1.0,则Container显示为正方形。(注意,Dart中/代表除法运算,不是取整运算,使用~/做取整运算)

ConstrainedBox组件

ConstrainedBox组件用于给它的子组件强制加上一些约束,比如下面的代码:

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: “Test”,
home: new Scaffold(
appBar: new AppBar(
title: new Text(“Test”)
),
body: new ConstrainedBox(
constraints: const BoxConstraints.expand(width: 50.0, height: 50.0),
child: new Container(
color: Colors.red,
width: 200.0,
height: 200.0,
)
)
),
);
}
}

在上面的代码中,我们给Container设置了长宽都为200,但是Container被ConstrainedBox组件包裹了,而且ConstrainedBox设置了约束constraints: const BoxConstraints.expand(width: 50.0, height: 50.0),由于ConstrainedBox的约束是强制性的,所以最后Container显示出的大小是50而不是200,如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

IntrinsicWidth & IntrinsicHeight

这两个组件的作用是将他们的子组件调整到组件本身的宽度/高度。

这个类是非常有用的,例如,当宽度/高度没有任何限制时,你会希望子组件按更合理的宽度/高度显示而不是无限的扩展。

LimitedBox组件

LimitedBox是一个当其自身不受约束时才限制其大小的容器。

如果这个组件的最大宽度是没有约束,那么它的宽度就限制在maxWidth。类似地,如果这个组件的最大高度没有约束,那么它的高度就限制在maxHeight

Offstage组件

Offstage组件用于显示或隐藏它的子组件,如下代码所示:

new Offstage(
offstage: false, // true: 隐藏, false: 显示
child: new Text(“hello world”),
)

OverflowBox & SizedOverflowBox

OverflowBox组件它给它的子组件带来不同的约束,而不是从它的父组件中得到,可能允许子组件溢出到父组件中。

SizedOverflowBox组件是一个指定大小的组件,它的约束会传递给子组件,子组件可能溢出。

SizedBox组件

SizedBox是一个指定了大小的容器。

如果指定了SizedBox的大小,则子组件会使用SizedBox的大小,如果没有指定SizedBox的大小,则SizedBox会使用子组件的大小。如果SizedBox没有子组件,SizedBox会按它自己的大小来显示,将nulls当作0。

new SizedBox(
// 如果指定width和height,则Container按照指定的大小显示,而不是Container自己的大小,如果没有指定width和height,则SizedBox按照Container的大小显示
width: 50.0,
height: 50.0,
child: new Container(
color: Colors.red,
width: 300.0,
height: 300.0,
),
)

Transform组件

Transform用于在绘制子组件前对子组件进行某些变换操作,比如平移、旋转、缩放等。

示例代码如下:

new Container(
color: Colors.black,
child: new Transform(
alignment: Alignment.topRight,
// 需要导包:import ‘dart:math’ as math;
transform: new Matrix4.skewY(0.3)…rotateZ(-math.pi / 12.0),
child: new Container(
padding: const EdgeInsets.all(8.0),
color: const Color(0xFFE8581C),
child: const Text(‘Apartment for rent!’),
),
),
)

运行效果如下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

包含多个子Widget的布局容器

Row组件

Row组件字面理解就是代表一行,在一行中可以放入多个子组件。

下面是示例代码:

import ‘package:flutter/material.dart’;

main() {
runApp(new MyApp());
}

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: “Test”,
home: new Scaffold(
appBar: new AppBar(
title: new Text(“Test”)
),
body: new Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
new Text(“hello”),
new Container(
width: 50.0,
height: 50.0,
color: Colors.red,
),
new Text(“world”)
],
)
),
);
}
}

在模拟器上运行的效果如下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Row组件的构造方法中,children参数是一个数组,表示可以有多个子组件,mainAxisAlignment表示Row中的子组件在主轴(Row组件主轴表示水平方向,交叉轴表示垂直方向,Column组件主轴表示垂直方向,交叉轴表示水平方向)上的对齐方式,可以有如下几个取值:

  • MainAxisAlignment.start
  • MainAxisAlignment.center
  • MainAxisAlignment.end
  • MainAxisAlignment.spaceBetween
  • MainAxisAlignment.spaceAround
  • MainAxisAlignment.spaceEvenly

关于上面几个取值,用如下几个图来说明:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Column组件

Column组件表示一列,可以在一列中放入多个组件,如下代码所示:

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: “Test”,
home: new Scaffold(
appBar: new AppBar(
title: new Text(“Test”)
),
body: new Column(
children: [
new Text(“hello”),
new Text(“world”),
new Text(“nihao~”)
],
)
),
);
}
}

Column和Row组件一样,可以通过MainAxisAlignment或者CrossAxisAlignment来设置主轴和交叉轴的对齐方式,这里不再赘述。

Stack组件

Stack组件类似于Android中的FrameLayout,其中的子组件是一层层堆起来的,并不像Row或者Column中的子组件,按水平或垂直方向排列,下面用代码说明:

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: “Test”,
home: new Scaffold(
appBar: new AppBar(
title: new Text(“Test”)
),
body: new Stack(
children: [
new Container(
width: 100.0,
height: 100.0,
color: Colors.red,
),
new Container(
width: 30.0,
height: 30.0,
color: Colors.green,
)
],
)
),
);
}
}

在上面的Stack组件中,放入了两个Container,其中第一个Container是100x100大小,第二个Container是30x30大小,在模拟器上运行效果如下图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

IndexedStack组件

IndexedStack用于根据索引来显示子组件,index为0则显示第一个子组件,index为1则显示第二个子组件,以此类推,下面用代码说明:

new IndexedStack(
index: 1,
children: [
new Container(
width: 100.0,
height: 100.0,
color: Colors.red,
child: new Center(
child: new Text(“index: 0”, style: new TextStyle(fontSize: 20.0),),
),
),
new Container(
width: 100.0,
height: 100.0,
color: Colors.green,
child: new Center(
child: new Text(“index: 1”, style: new TextStyle(fontSize: 20.0),),
),
)
],
)

IndexedStack的构造方法中有个index属性,上面的index属性为1,则显示的是children数组中的第2个元素(绿色方块),如果index改为0,则显示的是第1个元素(红色方块),如果index的大小超过了children数组的长度,则会报错。

Table组件

Table组件用于显示多行多列的布局,如果只有一行或者一列,使用Row或者Column更高效。下面用一段代码展示Table的用法:

class MyApp extends StatelessWidget {

// 生成Table中的数据
List getData() {
var data = [
“hello”,
“world”
];
List result = new List();
TextStyle style = new TextStyle(fontSize: 15.0, fontWeight: FontWeight.bold);
for (int i = 0; i < data.length; i++) {
String str = data[i];
List row = new List();
for (int j = 0; j < str.length; j++) {
row.add(new Text(" ${str[j]} ", style: style));
}
result.add(new TableRow(
children: row
));
}
return result;
}

@override
Widget build(BuildContext context) {
return new MaterialApp(
title: “Test”,
home: new Scaffold(
appBar: new AppBar(
title: new Text(“Test”)
),
body: new Table(
children: getData()
)

题外话

不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊

这里我为大家准备了一些我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

欢迎评论区讨论。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

怎么样一个知识点里往死里凿,你也能应付如流啊**

这里我为大家准备了一些我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~

[外链图片转存中…(img-GwRmbIZN-1715312125630)]

欢迎评论区讨论。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 18
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值