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

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

一、前言

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

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

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

接下来讲讲如何应用吧。

二、页面

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

dart 复制代码
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 即可~

dart 复制代码
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 去快速生成相关代码,避免遗漏重要参数。

三、子部件

方式一: Mixin

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

方式二: 嵌套子 Widget

对于 StatelessWidget,你可以通过嵌套一层 GetxLogicConsumer.get 去拿到 logiclogicTag

dart 复制代码
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 去获取

dart 复制代码
// 获取 logic
context.getxLogic<HomeLogic>();
// 获取 logicTag
context.getxTag();

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

dart 复制代码
// 获取 logic
getxLogic<HomeLogic>();
// 获取 logicTag
getxTag();

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

图片取自 blog.csdn.net/lcl130/arti...

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

四、其它

实现原理

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

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

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

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

三种方式的关系

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

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

Logic 构建方法

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

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

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

dart 复制代码
class HomeLogic extends GetxController {
  final String region;

  HomeLogic({required this.region});

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

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

五、最后

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

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

如果文章对您有所帮助, 请不吝点击关注一下我的微信公众号:FSA全栈行动, 这将是对我最大的激励. 公众号不仅有 Flutter 技术,还有 AIAndroidiOSPython 等文章, 可能有你想要了解的技能知识点哦~

相关推荐
RadiumAg1 小时前
记一道有趣的面试题
前端·javascript
yangzhi_emo1 小时前
ES6笔记2
开发语言·前端·javascript
yanlele1 小时前
我用爬虫抓取了 25 年 5 月掘金热门面试文章
前端·javascript·面试
xiaolang_8616_wjl2 小时前
c++文字游戏_闯关打怪2.0(开源)
开发语言·c++·开源
中微子2 小时前
React状态管理最佳实践
前端
烛阴2 小时前
void 0 的奥秘:解锁 JavaScript 中 undefined 的正确打开方式
前端·javascript
中微子3 小时前
JavaScript 事件与 React 合成事件完全指南:从入门到精通
前端
Hexene...3 小时前
【前端Vue】如何实现echarts图表根据父元素宽度自适应大小
前端·vue.js·echarts
NocoBase3 小时前
NocoBase 商业授权激活指南
低代码·开源·资讯