[Get 源码] GetPageRoute 与 GetxController 的自动回收机制

一、关键源码入口

1. ‌路由生命周期管理 Mixin

typescript 复制代码
dartCopy Code
mixin PageRouteReportMixin<T> on Route<T> {
  @override
  void install() {
    super.install();
    RouterReportManager.reportCurrentRoute(this);
  }

  @override
  void dispose() {
    super.dispose();
    RouterReportManager.reportRouteDispose(this);
  }
}

2. ‌GetPageRoute 核心实现

scala 复制代码
dartCopy Code
class GetPageRoute<T> extends PageRoute<T>
    with GetPageRouteTransitionMixin<T>, PageRouteReportMixin {
  @override
  void dispose() {
    super.dispose();
    final middlewareRunner = MiddlewareRunner(middlewares);
    middlewareRunner.runOnPageDispose();
  }
}

二、引言:Bindings 的魔法

GetX 通过 ‌**Bindings**‌ 机制实现依赖注入与自动回收,其核心逻辑如下:

1. ‌单例注入原理

  • ‌**Bindings 声明**‌:每个路由页面关联一个 Binding 类
  • 注册依赖 ‌:在 dependencies() 方法中调用 Get.lazyPutGet.put
  • 作用域隔离‌:依赖项默认绑定到当前路由生命周期
scala 复制代码
dartCopy Code
class DetailBinding extends Bindings {
  @override
  void dependencies() {
    Get.lazyPut(() => DetailController()); // 路由级单例
  }
}

2. ‌自动回收机制

  • 路由销毁触发 ‌:当 GetPageRoute 被销毁时(页面关闭),触发 RouterReportManager.reportRouteDispose
  • 清理策略 ‌:通过 _removeDependencyByRoute 移除路由关联的控制器
  • 执行顺序 ‌:
    GetPageRoute.dispose()PageRouteReportMixinRouterReportManager → ‌清理依赖

三、重点记录:不同依赖注册方式的差异

1. ‌三种依赖注册方式对比

方法 自动销毁支持 典型场景
Get.put() ❌ 不支持 全局单例(如用户信息管理)
Get.create() ✅ 支持 需要动态参数的控制器
Bindings 绑定 ✅ 支持 路由级作用域控制器(推荐方式)

2. ‌关键差异解析

  • ‌**Get.put() 问题‌:直接通过该方法注册的实例会 ‌ 常驻内存**‌,需手动调用 Get.delete()
  • ‌**Get.create() 优势**‌:与路由绑定,页面关闭时自动触发 onClose()
  • 最佳实践 ‌:始终通过 Bindings 管理控制器,避免内存泄漏

四、MiddlewareRunner 的三大应用场景

1. ‌路由拦截(redirect)

scala 复制代码
dartCopy Code
class AuthMiddleware extends GetMiddleware {
  @override
  RouteSettings? redirect(String? route) {
    if (!isLogin && route == "/profile") {
      return RouteSettings(name: "/login");
    }
    return null;
  }
}

场景‌:未登录用户访问个人主页时跳转登录页

2. ‌参数修改(onPageCalled)

scala 复制代码
dartCopy Code
class ParamsMiddleware extends GetMiddleware {
  @override
  GetPage? onPageCalled(GetPage? page) {
    if (page?.name == "/search") {
      return page?.copy(parameters: {"timestamp": DateTime.now().toString()});
    }
    return page;
  }
}

场景‌:动态添加时间戳参数到搜索页面

3. ‌资源释放(onPageDispose)

scala 复制代码
dartCopy Code
class AnalyticsMiddleware extends GetMiddleware {
  @override
  void onPageDispose() {
    Analytics.reportClose(Get.currentRoute);
  }
}

场景‌:页面关闭时上报用户行为埋点


五、_removeDependencyByRoute 深度解析

1. ‌函数作用

清理与特定路由关联的依赖项,确保内存回收

2. ‌执行流程

scss 复制代码
dartCopy Code
static void _removeDependencyByRoute(Route route) {
  // 清理通过 Get.create() 注册的实例
  if (_routesByCreate.containsKey(route)) {
    _routesByCreate[route]!.forEach((onClose) => onClose());
    _routesByCreate.remove(route);
  }

  // 清理通过 Bindings 注册的依赖
  final keys = _routesKey[route];
  keys?.forEach((key) => GetInstance().delete(key: key));
  _routesKey.remove(route);
}

3. ‌关键设计

  • 双重清理机制‌:

    • ‌**Get.create() 实例**‌:直接执行注册时的 onClose 回调
    • ‌**Bindings 依赖**‌:通过 GetInstance().delete() 触发 onClose()
  • 路由级作用域 ‌:确保不同路由的依赖项 ‌完全隔离


六、总结:GetX 自动回收机制的设计哲学

  1. 生命周期绑定 ‌:
    GetPageRoute 通过重写 dispose() 方法,将控制器生命周期与路由销毁事件强绑定

  2. 中间件扩展性 ‌:
    MiddlewareRunner 提供可插拔的扩展点(参数修改、拦截、埋点)

  3. 依赖治理策略‌:

    • 全局单例由开发者手动管理
    • 路由级依赖由框架自动回收

这种设计在保持灵活性的同时,最大程度避免了 Flutter 应用常见的内存泄漏问题,其实现方式与 Android 的 ViewModel + LiveData 生命周期管理有着异曲同工之妙。

相关推荐
西西学代码9 小时前
Flutter---回调函数
开发语言·javascript·flutter
圣光SG9 小时前
Vue.js 从入门到精通:技术成长之路
flutter
恋猫de小郭18 小时前
Swift 6.3 正式发布支持 Android ,它能在跨平台发挥什么优势?
android·前端·flutter
i-阿松!21 小时前
PCB板子+ flutter前端 + go后端
物联网·flutter·pcb工艺·go1.19
恋猫de小郭1 天前
Flutter 3.41.6 版本很重要,你大概率需要更新一下
android·前端·flutter
亚历克斯神1 天前
Flutter for OpenHarmony: Flutter 三方库 mutex 为鸿蒙异步任务提供可靠的临界资源互斥锁(并发安全基石)
android·数据库·安全·flutter·华为·harmonyos
钛态1 天前
Flutter 三方库 smartstruct 鸿蒙化字段映射适配指南:介入静态预编译引擎扫除视图及数据模型双向强转类型错乱隐患,筑稳如磐石的企业级模型治理防线-适配鸿蒙 HarmonyOS ohos
flutter·华为·harmonyos
键盘鼓手苏苏1 天前
Flutter 组件 csv2json 适配鸿蒙 HarmonyOS 实战:高性能异构数据转换,构建 CSV 流式解析与全栈式数据映射架构
flutter·harmonyos·鸿蒙·openharmony
左手厨刀右手茼蒿1 天前
Flutter 组件 http_requests 适配鸿蒙 HarmonyOS 实战:极简网络请求,构建边缘端轻量级 RESTful 通讯架构
网络·flutter·http
雷帝木木1 天前
Flutter 三方库 hrk_logging 的鸿蒙化适配指南 - 实现标准化分层日志记录、支持多目的地输出与日志分级过滤
flutter·harmonyos·鸿蒙·openharmony·hrk_logging