flutter基础知识

292 阅读2分钟

常用生命周期函数

1、继承StatefulWidget 有状态
initState 页面打开执行一次
dispose 页面关闭销毁
build 构建界面状态发生变化重新执行
didChangeDependencies 布局变化,若节点的父级结构中的层级 或 父级结构中的任一节点的widget类型有变化,节点会调用
didUpdateWidget 数据发生变化 父widget中调用setState,子的didUpdateWidget 会被调用
2、继承StatelessWidget 无状态

路由

一、路由跳转方式

1、命名路由跳转: Navigator.of(context).pushNamed('/xxx')
2Navigator + 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"] //新增此处
    },
   ...
  ]
}

插件仓库

pub.flutter-io.cn/

打包相关

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框架
2ProviderProvider官方推荐使用】
3、getx优点:封装了很多基础功能,内置了路由,网络请求,国际化,主题,等和一些高级api,可以局部改变状态更新