如果说Java是面向对象,那么Flutter就是面向组件,一切皆组件,那么多组件怎么学习呢,这里我就把高频使用的组件、方法、以及pub包整理一下,主要是能够快速上手和入门。
常用Widget
基组件
- StatelessWidget(无状态的,一次渲染绘制)
- StatefulWidget(有状态的,可多次渲染绘制)
flutter大部分组件都是间接或者直接继承于这两个组件。
门户组件
- MaterialApp(android风格)
- CupertinoApp(iOS风格)
Material风格基础框架组件,Flutter应用入口配置,例如标题、主题,主界面等。常用的“Scaffold”、“AppBar”、“TabBar”、“BottomNavigationBar”等都需要再此基础组件下实现。
基础组件
- 文本:Text
- 文本输入:TextField
- 按钮:RaisedButton(悬浮按钮)、TextButton(扁平按钮)、OutlineButton(边框按钮)、IconButton(icon按钮)
- 图片:Image
- 单/复选框:Radio(单选框)、Checkbox(复选框)
- 进度条:LinearProgressIndicator(条形进度条)、CircularProgressIndicator(原型进度条)
- 分割线:Divider
- 显隐控制:Visibility
布局组件
- 线性布局:Row(水平)、Column(垂直)
- 弹性布局:Flex
- 层叠布局:Stack(层叠父容器)、Positioned(孩子精细化定位)
- 定位布局:Align(上下左右任意位置)、Center(居中)
- 空间占用布局:Expanded(剩余空间、比例分割)
- 尺寸布局:SizedBox(确定宽高,可代替Margin的性质)
容器组件
- 组合容器:Container(主要用于大小、padding、背景、装饰等多条件组合修饰)
- 脚手架:Scaffold(页面脚手架,可捆绑appbar)
- 滚动容器:SingleChildScrollView(单一元素滚动)、CustomScrollView(复合滚动,例如GridView+ListView)、ListView(列表)、GridView(九宫格)
点击组件
- InkWell(常用,有点击波浪效果)
- GestureDetector(手势,方法更丰富,无点击效果)
其他组件
- SafeArea(常用于刘海屏遮挡腾出安全空间,自定义标题栏中经常用到)
- WillPopScope(导航返回拦截)
更多组件可参看官方文档:https://flutter.cn/docs/development/ui/widgets
静态路由配置
定义静态路由
var staticRoutes = {
WelcomePage.routeName: (context) => WelcomePage(),
LoginPage.routeName: (context) => LoginPage(),
HomePage.routeName: (context) => HomePage(),
};
main入口引用
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My Flutter',
routes: staticRoutes,
home: HomePage(),
);
}
}
其他页面调用进行跳转
onPressed: () {
Navigator.pushNamed(context, LoginPage.routeName);
},
一些高频方法
1.延迟获取:
Future.delayed(Duration(seconds: 2), () {
...
});
Timer(Duration(seconds: 2), (){
...
});
2.渲染结束监听
import 'package:flutter/scheduler.dart';
@override
void initState() {
super.initState();
SchedulerBinding.instance.addPostFrameCallback((_) => {});
}
常用pub包整理
- permission_handler: 权限申请
- extended_image: 图片加载
- photo_view: 预览图片
- flutter_image_compress: 图片压缩
- flutter_smart_dialog: 自定义加载框、toast、弹框
- package_info: 获取应用程序包信息(应用名,包名,版本号,构建号等等)
- path_provider: 获取文件系统中常用的目录路径
- flutter_easyrefresh: 下拉刷新上拉加载
- url_launcher: 打电话、打开网址、发送邮件、信息
- dio: 网络库
- crypto: 加解密
- get: 状态管理器GetX
其他开源UI库
- https://www.jianshu.com/p/2200185df33d
Json转实体
- IDE插件:FlutterJsonBeanFactory
- json to dart(支持空安全):https://javiercbk.github.io/json_to_dart/
- pub插件:json_serializable
开发技巧
- 开发时注重私有变量和final的使用
- 一些常用的组件尽可能的进行封装,例如标题栏、toast
- 开发过程中功能模块抽取,避免套娃式望海
- 开发过程中尽可能widget和功能分开保持代码整洁
其他
androidstudio中快速生成代码块:
- 快速生成StatelessWidget,输入"stless"
- 快速生成StatefulWidget,输入"stful"
stack是层叠布局,使用Positioned必须给定子widget具体的宽高,否则无法定位。
学习资源
- 官方文档:https://flutter.dev/docs
- 中文文档:https://flutter.cn/#
- flutter pub搜索仓库:https://pub.flutter-io.cn/
- flutter SDK仓库:https://github.com/flutter/flutter
- 《Flutter实战》:https://book.flutterchina.club/