移动端混合开发Flutter入坑(三)综合布局
2019-01-23 本文已影响14人
fzkun
本章会介绍
image.png
- Flutter的布局机制如何工作
- 如何纵向和横向布置小部件
- 如何构建Flutter布局
目录
- Step 0: 创建app基础架构
- Step 1: 分析并拆分布局
- Step 2: 实现标题简介Row
- Step 3: 实现按钮Row
- Step 4: 实现文字介绍Row
- Step 5: 实现头部图片Row
- Step 6: 滑动手势
Step 0:创建app基础架构
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter layout demo',
home: Scaffold(
appBar: AppBar(
title: Text('Flutter layout demo'),
),
body: Center(
child: Text('Hello World'),
),
),
);
}
}
image.png
Setp 1:分析并拆分布局
第一步是将布局分解为基本元素:
在此示例中,四个元素排列成一列:图像,两行和一个文本块。
image.png
第一行标题部分,有3个Row子控件:文本模块,一个星形图标和一个数字。 它的第一个子控件Row,包含2行文本。 第一列占用了大量空间,因此必须将其包装在Expanded小部件中。
image.png
第二行Button部分,也有3个Column子控件:每个子控件都是一个包含图标和文本的Column。
image.png
Step 2: 实现标题简介Row
class TitleSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(32.0),
child: Row(
children: [
Expanded(
/*1*/
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
/*2*/
Container(
padding: const EdgeInsets.only(bottom: 8.0),
child: Text(
'Oeschinen Lake Campground',
style: TextStyle(
fontWeight: FontWeight.bold,
),
),
),
Text(
'Kandersteg, Switzerland',
style: TextStyle(
color: Colors.grey[500],
),
),
],
),
),
/*3*/
Icon(
Icons.star,
color: Colors.red[500],
),
Text('41'),
],
),
);
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter layout demo',
home: Scaffold(
appBar: AppBar(
title: Text('Flutter layout demo'),
),
body: Column(
children: <Widget>[
TitleSection(),
],
),
),
);
}
}
image.png
Step 3: 实现按钮Row
class ButtonSection extends StatelessWidget {
Column _buildButtonColumn(Color color, IconData icon, String label) {
return Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Icon(icon, color: color),
Container(
margin: EdgeInsets.only(top: 8.0),
child: Text(
label,
style: TextStyle(
fontSize: 12.0, fontWeight: FontWeight.w400, color: color),
),
)
],
);
}
@override
Widget build(BuildContext context) {
Color color = Theme.of(context).primaryColor;
return Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: <Widget>[
_buildButtonColumn(color, Icons.call, 'CALL'),
_buildButtonColumn(color, Icons.near_me, 'ROUTE'),
_buildButtonColumn(color, Icons.share, 'SHARE'),
],
);
}
}
image.png
Step 4: 实现文字介绍Row
class TextSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.all(8.0),
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,
),
);
}
}
Step 5: 实现头部图片Row
图片地址:
https://images.unsplash.com/photo-1471115853179-bb1d604434e0?dpr=1&auto=format&fit=crop&w=767&h=583&q=80&cs=tinysrgb&crop=
首先,下载图片到images/lake.jpg目录,然后在pubspec.yaml
文件中加入以下代码
flutter:
uses-material-design: true
assets:
- images/lake.jpg
添加代码
class ImageSection extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Image.asset(
'images/lake.jpg',
width: 600.0,
height: 240.0,
fit: BoxFit.cover,
);
}
}
image.png
Step 6: 滑动手势
把main方法body中一开始的Column
改成ListView
,如下显示,再次滑动即可。
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter layout demo',
home: Scaffold(
appBar: AppBar(
title: Text('Flutter layout demo'),
),
body: ListView(
children: <Widget>[
ImageSection(),
TitleSection(),
ButtonSection(),
TextSection(),
],
),
),
);
}
}