开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情
一、HTML盒子模型
在了解Flutter的盒子模型前,我们先来看一下Html的盒子模型。
页面元素包含了margin(外边距),border(边框),padding(内边距)
网页中的各个元素都可以看成是一个一个的盒子,通过对盒子的摆放,形成对网页的布局。
而Flutter的盒子模型也是和HTML一样。
二、Flutter盒子
由于这里的Demo暂时都不涉及状态改变,所以代码中使用Stateless无状态组件即可。
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter 盒子模型',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: Scaffold(
appBar: AppBar(
title: Text('盒子模型'),
),
body: Center(
child: Container(
width: 300,
height: 300,
color: Colors.blue,
child: Container(
color: Colors.red,
margin: EdgeInsets.fromLTRB(10, 10, 10, 10),
child: Container(
margin: EdgeInsets.fromLTRB(10, 10, 10, 10),
color: Colors.white60,
child: Text('测试展示一段长文字,测试展示一段长文字,测试测试测试'),
padding: EdgeInsets.fromLTRB(10, 10, 10, 10),
),
),
),
),
),
);
}
}
先来看一下展示效果
2.1 页面结构
我们从body元素开始分析
- Center:居中组件
-
- Containter: width-300 height-300,颜色为蓝色
-
-
- child :Container元素
-
- 没有指定大小,通过margin以及盒子模型进行约束,颜色为红色,上下左右的边缘margin为10
-
-
-
- child:Container元素
-
-
- 通过盒子模型进行大小位置的约束,颜色为百分之60透明度的白色,上下左右的边缘margin为10
-
-
-
- -child:Text文本
-
-
2.2 布局空间模拟显示
在调试布局时,我们可以启用网格线以及标尺等
2.2.1 main.dart引入包
import 'package:flutter/rendering.dart';
2.2.2 在main函数中打开开关
三、图片展示约束
3.1 行排列
接下来我们再用图片的排列感受一下Flutter的排列布局约束
body: Center(
child: new Row(
//对齐方式:平均间隔
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
new Image.asset('images/a.jpg', width: 100.0, height: 300.0),
new Image.asset('images/b.jpg', width: 100.0, height: 50.0),
new Image.asset('images/a.jpg', width: 30.0, height: 80.0),
],
),
),
可以看到上图用到了Center和Row两个布局空间,使用Center包裹了Row,使得行排列控件居中对齐了
Row中又用到了MainAxisAlignment.spaceEvenly的对齐方式使得三张图片平均间隔的方式横向排列。
3.2 列排列
body: Center(
child: new Column(
//对齐方式:平均间隔
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
new Image.asset('images/a.jpg', width: 100.0, height: 300.0),
new Image.asset('images/b.jpg', width: 100.0, height: 50.0),
new Image.asset('images/a.jpg', width: 30.0, height: 80.0),
],
),
),
将Row元素更改成Column,就从行排列转换成了列排列。
在行排列中mainAxisAlignment控制水平方向的对齐,而在列排列中控制垂直方向的对齐,另外一个方向使用crossAxisAlignment元素控制
3.3 复杂嵌套
在熟悉了基本的排列规则之后,我们尝试绘制一个较为复杂的界面
在下手之前,我们可以先把界面元素拆分成下方的图片加上部的整块区域
这两块区域用Column包裹即可,接下来再去尝试实现第一块区域的排列,进行细小的拆分,类似AS中LinearLayout的多级嵌套。
3.4 控件缩放
使用flex实现控件的缩放
body: Center(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Expanded(child: Image.asset('images/a.jpg')),
Expanded(flex: 2, child: Image.asset('images/b.jpg')),
Expanded(child: Image.asset('images/a.jpg')),
],
),
),
四、总结
通过flutter的盒子模型,我们实现了自己搭建一个较复杂的页面效果,接下来,让我们继续探索flutter吧~