Flutter入门(6):Flutter 页面创建与跳转
1. 运行程序
建议使用 Android Studio 进行 flutter 编程 , Android Studio 对 dart 语法很友好。
2. 示范代码
话不多说,先上代码,代码下载地址。如果对你有帮助的话记得给个关注,代码会根据我的 Flutter 专题不断更新。
3. 主页创建
优雅的编程,我们让 main.dart 更清晰,代码逻辑后置。先创建一个 home.dart 文件。
import 'package:flutter/material.dart';
// 这里我们预留动态更新页面功能,使用 StatefulWidget
class FMHomeVC extends StatefulWidget {
@override
FMHomeState createState() => FMHomeState();
}
class FMHomeState extends State<FMHomeVC> {
return Container(
child: Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
backgroundColor: Colors.lightBlue,
title: Text("Home"),
),
body: Center(
child: Text("Home"),
),
),
);
}
然后对 main.dart 进行更改,使用 home.dart 文件作为主页,注意修改 import 路径。
import 'package:flutter/material.dart';
// 此处注意修改为自己的 home.dart 路径
import 'package:FMStudyApp/home/home.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
home: FMHomeVC(),
);
}
}
运行程序后,如下图,第一个主页已经生成好了。
Home Simple.png
3. ListView 创建
ListView 可以说是应用非常广泛的控件了,并且简单实用,考虑到后续要在代码下载地址持续更新,我们就首先介绍使用 ListView。
先简单介绍一下代码逻辑。
/*
此处代码仅仅介绍这部分逻辑,不要复制使用,下边会贴详细代码。
*/
class FMHomeVC extends StatefulWidget {
@override
// 创建 State
FMHomeState createState() => FMHomeState();
}
class FMHomeState extends State<FMHomeVC> {
// 创建数据源
var funcLists = [];
@override
// 重写父类方法,页面初始化会调用
void initState() {
super.initState();
// 封装数据初始化方法,为数据源添加数据,未来也可以在这里做网络请求
initData();
}
void initData() {
// 调用父类方法,会刷新页面
setState(() {
});
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return Container(
child: Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
backgroundColor: Colors.lightBlue,
title: Text("Widgets 目录"),
),
body: Center(
child: ListView.builder(
padding: const EdgeInsets.all(15.0),
// 生成对应数据源数量的 Item
itemCount: funcLists.length,
itemBuilder: (context, index){
// 按照数据源对每个 Item 进行渲染
var func = funcLists[index];
return ListTile(
onTap: (){
// 点击事件,在这里处理不同 Item 跳转
},
);
},
),
),
),
);
}
下边上详细代码
import 'package:flutter/material.dart';
class FMHomeVC extends StatefulWidget {
@override
FMHomeState createState() => FMHomeState();
}
class FMHomeState extends State<FMHomeVC> {
var funcLists = [];
@override
void initState() {
super.initState();
initData();
}
void initData() {
funcLists.add({"name": "基础组件", "desc": "在构建您的第一个Flutter应用程序之前,您绝对需要了解这些widget。"});
funcLists.add({"name": "Material Components", "desc": "实现了Material Design 指南的视觉、效果、motion-rich的widget。"});
funcLists.add({"name": "Cupertino(iOS风格的widget)", "desc": "用于当前iOS设计语言的美丽和高保真widget。"});
funcLists.add({"name": "Layout", "desc": "排列其它widget的columns、rows、grids和其它的layouts。"});
funcLists.add({"name": "Text", "desc": "文本显示和样式。"});
funcLists.add({"name": "Assets、图片、Icons", "desc": "管理assets, 显示图片和Icon。"});
funcLists.add({"name": "Input", "desc": "Material Components 和 Cupertino中获取用户输入的widget。"});
funcLists.add({"name": "动画和Motion", "desc": "在您的应用中使用动画。查看Flutter中的动画总览。"});
funcLists.add({"name": "交互模型", "desc": "响应触摸事件并将用户路由到不同的页面视图(View)。"});
funcLists.add({"name": "样式", "desc": "管理应用的主题,使应用能够响应式的适应屏幕尺寸或添加填充。"});
funcLists.add({"name": "绘制和效果", "desc": "Widget将视觉效果应用到其子组件,而不改变它们的布局、大小和位置。"});
funcLists.add({"name": "Async", "desc": "Flutter应用的异步模型。"});
funcLists.add({"name": "滚动", "desc": "滚动一个拥有多个子组件的父组件。"});
funcLists.add({"name": "辅助功能", "desc": "给你的App添加辅助功能(这是一个正在进行的工作)。"});
print(funcLists);
setState(() {
});
}
@override
Widget build(BuildContext context) {
// TODO: implement build
return Container(
child: Scaffold(
backgroundColor: Colors.white,
appBar: AppBar(
backgroundColor: Colors.lightBlue,
title: Text("Widgets 目录"),
),
body: Center(
child: ListView.builder(
padding: const EdgeInsets.all(15.0),
itemCount: funcLists.length,
itemBuilder: (context, index){
var func = funcLists[index];
return ListTile(
contentPadding: const EdgeInsets.all(10.0),
title: Text(
"${func["name"]}",
style: TextStyle(
fontSize: 20,
color: Colors.black,
),
),
subtitle: Text(
"${func["desc"]}",
style: TextStyle(
fontSize: 15,
color: Colors.grey,
),
),
onTap: (){
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return FMHomeVC();
}),
);
},
);
},
),
),
),
);
}
运行效果如下图
Home ListView.png
点击跳转后如下图
Push ListView.png
4. 技术小结
-
dart 文件的创建、引用以及使用
其实新的文件创建很重要,从接触过的很多语言开发来看,项目入口还是尽可能要简洁。
在 main.dart 中,我们 import package:PATH/home.dart ,并且在 MyApp 中将 FMHomeVC() 设置为 home。 -
StateflulWidget 的使用与创建
这里不多赘述,网上很多讲解,可以理解为页面为动态的,便于刷新页面。例如淘宝首页,没有网络进去可能会没有商品,但是网络请求完成后,按照网络数据需要刷新页面,就需要使用到 StatefulWidget了。
StatefulWidget 主要功能都集中在 State 的创建和逻辑处理,然后在 State 类中执行 setState((){})方法,可以 reload 页面,非常的简单方便。 -
ListView 的创建与使用
ListView 其实是一个非常常用的组件,大部分表单页面和滚动视图都是使用 ListView 完成的。
主要注意 ListView.builder() 方法中的 itemCount、itemBuilder 两个key。itemCount 负责生成多少行 item ,itemBuilder 负责给对应行生成对应的 item。 -
字典取值
本文中的 funcLists 为数组,数组中添加的每个元素都是字典。
然后 func = funcList[index] 取出每一个字典,然后 func["name"]、func["desc"] 取出对应 Key 的值,赋值给每个 item。"{var}" 为字符串中添加变量。