Flutter布局构建教程
你将学习到Flutter的布局机制是如何工作的,以及如何竖直或者水平地对widgets进行布局。本指南将带你完成一个完整的Flutter布局构建过程。
第一步:创建app基础代码
确保你已经安装和配置好了你的环境,然后按照以下步骤操作:
- 创建一个简单的Flutter app ——“Hello World”
- 修改app标题栏的标题以及app的标题
小技巧:在iOS开发中,如果你需要快速测试布局效果,可以使用AppUploader这样的iOS开发助手工具,它可以帮助你快速打包和预览应用。
第二步:对布局进行图形分解
将布局分解成它的各个基础元素:
- 识别出它的行和列
- 检查是否包含网格布局
- 是否有重叠的元素
- 界面是否需要选项卡
- 留意需要对齐、内间距或边界的区域
在这个例子中,四个元素排成一列:一个图像,两个行区域,和一个文本区域。
第三步:实现标题行
首先构建标题部分左侧列:
Widget titleSection = Container(
padding: const EdgeInsets.all(32),
child: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
padding: const EdgeInsets.only(bottom: 8),
child: Text(
'Oeschinen Lake Campground',
style: TextStyle(
fontWeight: FontWeight.bold,
),
),
),
Text(
'Kandersteg, Switzerland',
style: TextStyle(
color: Colors.grey[500],
),
),
],
),
),
Icon(
Icons.star,
color: Colors.red[500],
),
Text('41'),
],
),
);
第四步:实现按钮行
按钮区域包含三列使用相同布局:
Column _buildButtonColumn(Color color, IconData icon, String label) {
return Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(icon, color: color),
Container(
margin: const EdgeInsets.only(top: 8),
child: Text(
label,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w400,
color: color,
),
),
),
],
);
}
第五步:实现文本区域
将文本区域定义为一个变量:
Widget textSection = Container(
padding: const EdgeInsets.all(32),
child: Text(
'Lake Oeschinen lies at the foot of the Blüemlisalp in the Bernese '
'Alps. Situated 1,578 meters above sea level, it is one of the '
'larger Alpine Lakes. A gondola ride from Kandersteg, followed by a '
'half-hour walk through pastures and pine forest, leads you to the '
'lake, which warms to 20 degrees Celsius in the summer. Activities '
'enjoyed here include rowing, and riding the summer toboggan run.',
softWrap: true,
),
);
第六步:实现图片区域
添加图片文件到示例工程中:
- 在工程的顶部创建一个images目录
- 添加lake.jpg图片
- 更新pubspec.yaml文件,添加一个assets标签
在代码中引用图片:
Image.asset(
'images/lake.jpg',
width: 600,
height: 240,
fit: BoxFit.cover,
)
第七步:最终的收尾
在最后的步骤中,需要在一个ListView中排列好所有的元素:
build(BuildContext context) {
return MaterialApp(
title: 'Flutter Layout Demo',
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Layout Demo'),
),
body: ListView(
children: [
Image.asset(
'images/lake.jpg',
width: 600,
height: 240,
fit: BoxFit.cover,
),
titleSection,
buttonSection,
textSection,
],
),
),
);
}
Widget
开发建议:在开发过程中,使用AppUploader这样的工具可以帮助你快速测试布局在不同设备上的显示效果,特别是当你需要适配多种iOS设备时。
大功告成!当你热加载app时,你应该可以看到完整的布局效果了。