常用生命周期函数
1、继承StatefulWidget 有状态
initState 页面打开执行一次
dispose 页面关闭销毁
build 构建界面状态发生变化重新执行
didChangeDependencies 布局变化,若节点的父级结构中的层级 或 父级结构中的任一节点的widget类型有变化,节点会调用
didUpdateWidget 数据发生变化 父widget中调用setState,子的didUpdateWidget 会被调用
2、继承StatelessWidget 无状态
路由
一、路由跳转方式
1、命名路由跳转: Navigator.of(context).pushNamed('/xxx')
2、Navigator + MaterialPageRoute跳转:Navigator.push(context, MaterialPageRoute(builder: (cxt) {return Test()})
二、关闭界面
Navigator.pop(context, 回传数据);
三、路由跳转关闭界面携带参数
、例:a->b ,b回退或主动 : Navigator.of(context).pushNamed('/xxx').then((res){
...此处接收res
})
跨组件状态共享(Provider)
获取方式一:
context.read<xxxProvider>()或context.watch<xxxProvider>()或 navigatorKey.currentContext!.read<xxxProvider>()
此处navigatorKey定义在全局取不到context对象时候需要用全局
获取方式二:
Provider.of<xxxProvider>(context)
## 全局事件 EventBus
定义:eventBus.on<xxxEvent>().listen((event) {
...业务逻辑
});
触发:eventBus.fire(xxxEvent());
忽略证书相关
一、框架自带http网络请求框架
class GlobalHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext? context) {
// TODO: implement createHttpClient
return super.createHttpClient(context)
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
}
HttpOverrides.global = GlobalHttpOverrides();
二、dio第三方网络框架
(dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
(client) {
client.badCertificateCallback =
(X509Certificate cert, String host, int port) {
// if(cert.pem==PEM){ // Verify the certificate
// return true;
// }
return true;
};
};
图片缓存
判断网络图片是否缓存本地,本地有缓存提取缓存图片不加载网络图片,有网络图更新重新拉取写入缓存
import 'package:xxx/xxx/network_image.dart' as network;
Image(
fit: BoxFit.fill,
image: network.NetworkImage('https://....')
)
apk文件规则定义
方式一、
applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
def fileName
if (variant.buildType.name == "release") {
// 输出apk名称为
fileName = "xxx-xxx-${variant.versionName}.apk"
println("APK文件位置: build\\app\\outputs\\apk\\release\\${fileName}")
} else {
fileName = "xxx-xxx-${variant.versionName}_debug.apk"
}
outputFileName = fileName
}
}
}
方式二、
// setProperty("archivesBaseName", applicationId + "-v" + versionCode + "(" + versionName + ")")或
// archivesBaseName = "$applicationId-v$versionCode($versionName)"二选一
defaultConfig {
...
// setProperty("archivesBaseName", applicationId + "-v" + versionCode + "(" + versionName + ")")
// archivesBaseName = "$applicationId-v$versionCode($versionName)"
}
vscode 空安全配置
.vscode/launch.json路径
例:
{
...
"configurations": [
{
...
"args": ["--no-sound-null-safety"] //新增此处
},
...
]
}
插件仓库
打包相关
android/key.properties //打包依赖配置
以下是证书密码别名,证书可以重新生成
storePassword=******
keyPassword=******
keyAlias=xxx
storeFile=.../my-release-key.keystore
pubspec.yaml配置文件说明
App更新版本号:
version: 1.0.1
使用插件
dependencies:
flutter_html: ^2.1.5 #html富文本解析
xxx_plugin:
path: xxx/xxx_plugin #本地插件
dependency_overrides:
webview_flutter: ^3.0.0 # 和flutter_html包冲突,强制指定使用webview_flutter
assets:
- assets/images/ 配置目录也可单独指定文件
js
状态管理对比flutter_bloc,getX,Provider
目前受欢迎程度对比
### [flutter_bloc](https://pub.flutter-io.cn/packages/flutter_bloc)
likes 3.4k
8.4k stars
### [get](https://pub.flutter-io.cn/packages/get)
likes 7k+
5.9k stars
### [provider likes ](https://pub.flutter-io.cn/packages/provider)Provider
likes 5.8k
4.1k stars
1、flutter_bloc框架
2、Provider【Provider官方推荐使用】
3、getx优点:封装了很多基础功能,内置了路由,网络请求,国际化,主题,等和一些高级api,可以局部改变状态更新