布景

为了在现有的项目中扩展Flutter模块,在常用的几种Flutter混合栈的方法FlutterEngineGroupflutter_boostflutter_thrio等中挑选了flutter_boost的方法。此外还集成了Getx作为Flutter项目状况办理工具。在业务上,原生有多个入口打开Flutter页面,并且各个入口对应的Flutter页面不一致。

路由方案的挑选

Getxflutter_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());
}

在监听类AppLifecycleObserveronPagePushonPagePop方法中增加处理:

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的方法里,放到外面的话也是没办法开释的。