FSA全栈行动 FSA全栈行动
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr

公众号:FSA全栈行动

记录学习过程中的知识
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr
  • AndroidUI

  • Android第三方SDK

  • Android混淆

  • Android仓库

  • Android新闻

  • Android系统开发

  • Android源码

  • Android注解AOP

  • Android脚本

  • AndroidTv开发

  • AndroidNDK

  • Android音视频

  • Android热修复

  • Android性能优化

  • Android云游戏

  • Android插件化

  • iOSUI

  • iOS工具

  • iOS底层原理与应用

  • iOS组件化

  • iOS音视频

  • iOS疑难杂症

  • iOS之Swift

  • iOS之RxSwift

  • iOS开源项目

  • iOS逆向

  • Flutter开发

    • Dart - 抽象类的实例化
    • Flutter - 打印好用的Debug日志
    • Flutter - 混合开发
    • Flutter - 解决混合开发iOS脚本打包遇到的问题
    • Flutter - 低版本在iOS14上遇到的问题与解决方案
    • Flutter - 解决原生弹窗的触摸事件被Flutter响应的问题
    • Flutter - 实现列表上下拉切换header
    • Flutter - 获取ListView当前正在显示的Widget信息
    • Flutter - 列表滚动定位超强辅助库,墙裂推荐!🔥
    • Flutter - 快速实现聊天会话列表的效果,完美💯
    • Flutter - 聊天输入框更新文本时的必备优化点🔖
    • Flutter - 我给官方提PR,解决run命令卡住问题 😃
    • Flutter - 探索run命令到底做了什么 🤔
    • Flutter - 引擎调试(iOS篇)🛠
    • Flutter - 引擎调试bug到提交PR实战 🐞
    • Flutter - 船新升级😱支持观察第三方构建的滚动视图💪
    • Flutter - 瀑布流交替播放视频 🎞
    • Flutter - IM保持消息位置大升级(支持ChatGPT生成式消息) 🤖
    • Flutter - 滚动视图中的表单防遮挡 🗒
    • Flutter - 秒杀1/2曝光统计 📊
    • 一天内加入 Flutter 和 FlutterCandies 两大组织是什么体验 🧐
    • Flutter - 如何快速搓一个微信通讯录列表(azlist) 📓
    • Flutter - 混编项目集成Shorebird热更新🐦(安卓篇)
    • Flutter - 混编项目集成Shorebird热更新🐦(iOS篇)
    • Flutter - 解决返回原生页面时dispose方法未被触发的问题 🐞
    • Flutter - 升级3.19之后页面多次rebuild?🤨
    • Flutter - 热更新 Shorebird 1.0 正式版来了 🐦
    • Flutter - 使用Pigeon实现视频缓存插件 🐌
    • Flutter - 轻松搞定屏幕旋转功能 😎
    • Flutter - 解决Connection closed before full header was received
    • Flutter - 实现聊天键盘与功能面板的丝滑切换 🍻
    • Flutter - 支持观察NestedScrollView,兼容性更强 😈
    • Flutter - 聊天键盘与面板丝滑切换的强势升级 🍻
    • Flutter - 升级到3.24后页面还会多次rebuild吗?🧐
    • Flutter - 轻松实现PageView卡片偏移效果
    • Flutter - 轻松搞定炫酷视差(Parallax)效果
    • Flutter - 危!3.24版本苹果审核被拒!
    • Flutter - 子部件任意位置观察滚动数据
    • Flutter - iOS编译加速
    • Flutter - Xcode16 还原编译速度
    • Flutter - GetX Helper 助你规范应用 tag
    • Flutter - GetX Helper 如何应用于旧页面
      • 一、前言
      • 二、页面
      • 三、子部件
        • 方式一: Mixin
        • 方式二: 嵌套子 Widget
        • 方式三: 通过 BuildContext 获取
      • 四、其它
        • 实现原理
        • 三种方式的关系
        • Logic 构建方法
      • 五、最后
  • 移动端
  • Flutter开发
LinXunFeng
2025-06-14
目录

Flutter - GetX Helper 如何应用于旧页面

欢迎关注微信公众号:[FSA全栈行动 👋]

# 一、前言

在上一篇【Flutter - GetX Helper 助你规范应用 tag】中,跟大家介绍了 https://github.com/LinXunFeng/getx_helper (opens new window) ,针对新页面的推荐使用姿势,即 Mixin 的方式,但是对于已有的旧页面,可能有着大量的业务代码,我们没办法直接重构它,但是又不想再持续忍受到处写相同的 tag 或者直接传 logic 实例的方式。

那有没有办法将 getx_helper 应用到旧页面呢?答案是有的!

getx_helper 提供了三种方式,Mixin、嵌套子 Widget 和 通过 BuildContext 去获取,并且这三种方式是可以混合使用的!

接下来讲讲如何应用吧。

# 二、页面

这里假设已存在的旧页面的结构代码如下

class _HomePageState extends State<HomePage> {
  String logicTag = 'lxf';
  late HomeLogic logic = Get.put(HomeLogic(), tag: logicTag);

  @override
  Widget build(BuildContext context) {
    Widget resultWidget = Scaffold(
      appBar: AppBar(),
      body: const Center(child: MyStatelessWidget()),
    );

    return resultWidget;
  }
}

你只需要在页面的根嵌套一层 GetxLogicProvider 即可向下共享 logicTag ~

class _HomePageState extends State<HomePage> {
  ...

  @override
  Widget build(BuildContext context) {
    Widget resultWidget = Scaffold(
      ...
    );

    // ====== 嵌套一层 GetxLogicProvider ======
    resultWidget = GetxLogicProvider.put(
      // 只是关联类型,不会创建新的 logic
      HomeLogic.new,
      logicTag: logicTag,
      child: resultWidget,
    );
    // =======================================
    return resultWidget;
  }
}

注:这里建议使用插件提供的代码片段 GH_GetxLogicProvider.put 去快速生成相关代码,避免遗漏重要参数。

# 三、子部件

子部件可通过以下三种方式,去获取 GetxLogicProvider 共享的 logicTag,并进而拿到 logic。

# 方式一: Mixin

基于支持混合使用这一点,推荐大家对于新增的子部件,还是使用上一篇中介绍的通过插件去创建 Widgte 的 Mixin 方式,即右击 widget 目录,选择 GetX: Mixin Widget 去生成 Widget。

# 方式二: 嵌套子 Widget

对于 StatelessWidget,你可以通过嵌套一层 GetxLogicConsumer.get 去拿到 logic 和 logicTag。

class MyStatelessWidget extends StatelessWidget {
 const MyStatelessWidget({super.key});

 @override
 Widget build(BuildContext context) {
   return GetxLogicConsumer.get(
     // 只是关联类型,不会创建新的 logic
     HomeLogic.new,
     builder: (context, logic, logicTag) {
       // lxf -- logic: Instance of 'HomeLogic' -- logicTag: lxf
       print('lxf -- logic: $logic -- logicTag: $logicTag');
       return const Placeholder();
     },
     // onInitState: (context, logic, logicTag) {},
     // onDispose: (context, logic, logicTag) {},
   );
 }
}

注:这里建议使用插件提供的代码片段 GH_GetxLogicConsumer.get 去快速生成相关代码,避免遗漏重要参数。

当然了,这里还是建议将旧的 StatelessWidget 重构成使用 Mixin 的方式~

# 方式三: 通过 BuildContext 获取

通过 BuildContext 去获取

// 获取 logic
context.getxLogic<HomeLogic>();
// 获取 logicTag
context.getxTag();

如果你是在 StatefulWidget 的 State 中使用,则可以省略前面的 context。

// 获取 logic
getxLogic<HomeLogic>();
// 获取 logicTag
getxTag();

方式三看起来挺简单好用的,但是,它所使用的 BuildContext 的生命周期必须是 .active,具体是什么意思?这里给出一张图就明白了

图片取自 https://blog.csdn.net/lcl130/article/details/115129796 (opens new window)

如上图所示,你只能在 initState、didChangeDependencies 和 build 方法中去使用,如果你能保证一定会遵守这个使用规则,那没问题。

# 四、其它

# 实现原理

就是基于 InheritedWidget 自上而下去共享了 logicTag 而已,没什么特别的。

基于该实现原理,我们可以不一定要以页面为维度去使用,也可以用于复用的视图模块。

只不过需要注意一点,如果不是以页面为维度,或者不是使用 GetX 的路由,则 logic 并不会被自动回收,这个时候只需要对视图的根 GetBuilder 的 assignId 设置为 true 即可。

// 记得设置 Logic 类型和 tag
GetBuilder<HomeLogic>(
  tag: logicTag,
  assignId: true,
  ...
);

# 三种方式的关系

前两种方式都是基于方式三去实现的,只是使用了 StatefulWidget 进行了包裹,并且在 initState 中提前将 logic 和 logicTag 取出并记录了起来,从而避免了 BuildContext 的使用限制。

虽然 Flutter 的精髓在于嵌套,但是我们可以通过 Mixin 的方式去优化嵌套~

# Logic 构建方法

一般情况下,在使用了 getx_helper 这一套规范之后,我们是不会去修改 Logic 的默认构造方法的,所以上述我们使用 HomeLogic.new 没有任何问题。

但是旧页面可能会在默认构造方法中去接收一些参数,这个时候 HomeLogic.new 就会报错,那怎么解决呢?

上面的注释中也说了,HomeLogic.new 只是关联 HomeLogic 这个类型而已,所以我们可以写一个专门用来关联 Logic 类型的命名构造方法来解决。

class HomeLogic extends GetxController {
  final String region;

  HomeLogic({required this.region});

  HomeLogic.type({this.region = ''});
}

然后将所有的 HomeLogic.new 改为 HomeLogic.type 即可。

# 五、最后

以上就是 getx_helper 在旧页面应用的使用说明,不得不说,Mixin 的方式比其它方式安全、方便和优雅太多了,所以极力建议大家,能用 Mixin 的方式就用 Mixin 的方式~

开源不易,如果你也觉得这个库好用 (https://github.com/LinXunFeng/getx_helper (opens new window)),请不吝给个 Star 👍 ,并多多支持!

#Dart#Flutter#GetX#logic#logicTag
上次更新: 2025/06/15, 11:36:32
Flutter - GetX Helper 助你规范应用 tag

← Flutter - GetX Helper 助你规范应用 tag

最近更新
01
Flutter - GetX Helper 助你规范应用 tag
06-08
02
Flutter - Xcode16 还原编译速度
04-05
03
AI - 免费的 Cursor 平替方案
03-30
更多文章>
Theme by Vdoing | Copyright © 2020-2025 FSA全栈行动
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×