布景
为了在现有的项目中扩展Flutter模块,在常用的几种Flutter混合栈的方法FlutterEngineGroup
、flutter_boost
、flutter_thrio
等中挑选了flutter_boost
的方法。此外还集成了Getx
作为Flutter项目状况办理工具。在业务上,原生有多个入口打开Flutter页面,并且各个入口对应的Flutter页面不一致。
路由方案的挑选
Getx
和flutter_boost
都具有路由功用,考虑到原生端和Flutter端的路由的映射联系,所以就抛弃了Getx
的路由办理。在项目中只运用Getx
状况办理、国际化等功用。
GetxController的开释问题
因为在项目中运用flutter_boost
办理页面路由,所以Getx
失去了页面的生命周期的操控,导致在页面关闭时无法感知页面的pop
,从而导致该页面对应controller
无法销毁。
解决方案
在文章Flutter GetX运用—简练的魅力!中讲到几种解决方案,其间最优解就是在外部监听页面的生命周期,手动去开释。咱们在运用flutter_boost
的时分也可以用同样的方法来开释GetxController
。
咱们在集成flutter_boost
时,会在main
函数中增加大局声明周期的监听:
void main() {
///增加大局生命周期监听类
PageVisibilityBinding.instance.addGlobalObserver(AppLifecycleObserver());
runApp(MyApp());
}
在监听类AppLifecycleObserver
的onPagePush
和onPagePop
方法中增加处理:
import 'package:flutter/material.dart';
import 'package:flutter_boost/flutter_boost.dart';
import 'package:get/get_navigation/src/router_report.dart';
///大局生命周期监听示例
class AppLifecycleObserver with GlobalPageVisibilityObserver {
@override
void onBackground(Route route) {
super.onBackground(route);
print("AppLifecycleObserver - onBackground");
}
@override
void onForeground(Route route) {
super.onForeground(route);
print("AppLifecycleObserver - onForground");
}
@override
void onPagePush(Route route) {
super.onPagePush(route);
RouterReportManager.reportCurrentRoute(route);
print("AppLifecycleObserver - onPagePush");
}
@override
void onPagePop(Route route) {
super.onPagePop(route);
RouterReportManager.reportRouteDispose(route);
print("AppLifecycleObserver - onPagePop");
}
@override
void onPageHide(Route route) {
super.onPageHide(route);
print("AppLifecycleObserver - onPageHide");
}
@override
void onPageShow(Route route) {
super.onPageShow(route);
print("AppLifecycleObserver - onPageShow");
}
}
如果在引证import 'package:get/get_navigation/src/router_report.dart';
时报没有文件:
请测验替换Getx
版本。
在page
中的处理:
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'test_one_controller.dart';
class TestOnePage extends StatelessWidget {
const TestOnePage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
TestOneController controller = Get.put(TestOneController());
return Scaffold(
body: Center(
child: GetBuilder<TestOneController>(builder: (controller) {
return Text("${controller.count.value}");
}),
),
);
}
}
留意:controller
的声明一定要放在build
的方法里,放到外面的话也是没办法开释的。