flutter中一切界面层级的东西全部都是Widget
这句话怎么理解呢?
大到整个应用,小到一个文字控件,全部都是Widget
一个常规的Application图级可能是这样的,当然实际情况下会比这复杂很多
结构图
对应代码和实际情况看一下
为了和图片对应 我把所有的写到一个文件里
import 'package:flutter/material.dart';
void main() => runApp(new MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: 'Flutter 结构简析',
theme: new ThemeData(
primarySwatch: Colors.blue, // 这里是项目的主色调
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: ListView(
children: <Widget>[
ListTile(title: Text('我是第一个item')),
ListTile(title: Text('我是第二个item')),
],
),
);
}
}
项目截图
这里的一切皆widget的意思就是
Application是Widget
Page是
Scaffold是
Appbar是
ListView是
ListTile也是
Text也是
组合达到常见的效果
以官方的一个页面为例子
https://flutter.io/tutorials/layout/
我们来做的话就是整体是一个Column或者ListView
然后子项目是
Image
Row
Column
Text
Text
Row
Image(Icon)
Text
Row
Column
Row
Image
Text
Column
Column
Text
当然这个是指的主体结构,实际上还会有更多的
接着不看这个链接里的代码,自己撸一个demo
demo相关
一阶段 头部图片
第一阶段对应的截图
image.png
代码
class TutorialsPage extends StatefulWidget {
@override
_TutorialsPageState createState() => _TutorialsPageState();
}
class _TutorialsPageState extends State<TutorialsPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
children: <Widget>[
//为了好分辨,我将内部的4大块分为四个方法
_buildHeader(),
],
),
);
}
Widget _buildHeader() {
// 这里对应的是图片
return Image.asset("images/lakes_header.jpg");
}
}
二阶段
第二阶段的截图
image.png
class _TutorialsPageState extends State<TutorialsPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
children: <Widget>[
//为了好分辨,我将内部的4大块分为四个方法
_buildHeader(),
Padding(
//这里我观察到下面有一个整体的左右边距,所以这里单独抽取了一个padding
child: Column(
children: <Widget>[
_buildSecond(), // 第二部分
],
),
padding: const EdgeInsets.only(
left: 30.0,
right: 30.0,
),
),
],
),
);
}
Widget _buildHeader() {
// 这里对应的是图片
return Image.asset("images/lakes_header.jpg");
}
_buildSecond() {
Widget row = Row(
children: <Widget>[
Expanded(
child: Column(
children: <Widget>[
Text('旅游圣地'),
Text('不要钱',style: TextStyle(fontSize: 12.0,color: Colors.grey),),
],
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
),
),
Row(
children: <Widget>[
Icon(
Icons.star,
color: Colors.yellow,
),
Text('30'),
],
),
],
);
row = SizedBox(
height: 60.0,
child: row,
);
return row;
}
}
第三部分
截图:
第三步
/// 对应 https://flutter.io/tutorials/layout/ 的 https://flutter.io/tutorials/layout/images/lakes.jpg 图片
class TutorialsPage extends StatefulWidget {
@override
_TutorialsPageState createState() => _TutorialsPageState();
}
class _TutorialsPageState extends State<TutorialsPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
children: <Widget>[
//为了好分辨,我将内部的4大块分为四个方法
_buildHeader(),
Padding(
//这里我观察到下面有一个整体的左右边距,所以这里单独抽取了一个padding
child: Column(
children: <Widget>[
_buildSecond(), // 第二部分
_buildThird(), // 第二部分
],
),
padding: const EdgeInsets.only(
left: 30.0,
right: 30.0,
),
),
],
),
);
}
Widget _buildHeader() {
// 这里对应的是图片
return Image.asset("images/lakes_header.jpg");
}
_buildSecond() {
Widget row = Row(
children: <Widget>[
Expanded(
child: Column(
children: <Widget>[
Text('旅游圣地'),
Text('不要钱',style: TextStyle(fontSize: 12.0,color: Colors.grey),),
],
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
),
),
Row(
children: <Widget>[
Icon(
Icons.star,
color: Colors.yellow,
),
Text('30'),
],
),
],
);
row = SizedBox(
height: 60.0,
child: row,
);
return row;
}
_buildThird() {
Widget buildItem(IconData iconData, String text) {
return Expanded(
child: SizedBox(
height: 50.0,
child: Column(
children: <Widget>[
Icon(
iconData,
color: Colors.blue,
),
Text(
text,
style: TextStyle(color: Colors.blue),
),
],
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
),
),
);
}
return Row(
children: <Widget>[
buildItem(Icons.phone, '呼叫'),
buildItem(Icons.room, '导航'),
buildItem(Icons.share, '分享'),
],
);
}
}
第四部分
image.png
/// 对应 https://flutter.io/tutorials/layout/ 的 https://flutter.io/tutorials/layout/images/lakes.jpg 图片
class TutorialsPage extends StatefulWidget {
@override
_TutorialsPageState createState() => _TutorialsPageState();
}
class _TutorialsPageState extends State<TutorialsPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
body: ListView(
children: <Widget>[
//为了好分辨,我将内部的4大块分为四个方法
_buildHeader(),
Padding(
//这里我观察到下面有一个整体的左右边距,所以这里单独抽取了一个padding
child: Column(
children: <Widget>[
_buildSecond(), // 第二部分
_buildThird(),
_buildFourth(),
],
),
padding: const EdgeInsets.only(
left: 30.0,
right: 30.0,
),
),
],
),
);
}
Widget _buildHeader() {
// 这里对应的是图片
return Image.asset("images/lakes_header.jpg");
}
_buildSecond() {
Widget row = Row(
children: <Widget>[
Expanded(
child: Column(
children: <Widget>[
Text('旅游圣地'),
Text(
'不要钱',
style: TextStyle(fontSize: 12.0, color: Colors.grey),
),
],
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
),
),
Row(
children: <Widget>[
Icon(
Icons.star,
color: Colors.yellow,
),
Text('30'),
],
),
],
);
row = SizedBox(
height: 60.0,
child: row,
);
return row;
}
_buildThird() {
Widget buildItem(IconData iconData, String text) {
return Expanded(
child: SizedBox(
height: 50.0,
child: Column(
children: <Widget>[
Icon(
iconData,
color: Colors.blue,
),
Text(
text,
style: TextStyle(color: Colors.blue),
),
],
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
),
),
);
}
return Row(
children: <Widget>[
buildItem(Icons.phone, '呼叫'),
buildItem(Icons.room, '导航'),
buildItem(Icons.share, '分享'),
],
);
}
_buildFourth() {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
'这个旅游地方我也不知道是什么地方,有什么流弊的,不过看起来还不错.\n\n'
'这篇文章就到这里基本也没啥说的了,这个是第四部分,我就把内容直接放在Widget里面了,感谢观看,后面我可能会出一个简易的FAQ,专门写一些小白问题☺☺☺☺☺',
style: TextStyle(
fontSize: 13.0,
),
),
);
}
}
网友评论