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 等文章, 可能有你想要了解的技能知识点哦~

相关推荐
Yvonne爱编码3 分钟前
简述ajax、node.js、webpack、git
前端·git·ajax·webpack·node.js·visual studio
周小码3 分钟前
CesiumJS详解:打造专业级Web 3D地球仪与地图的JavaScript库
前端·javascript·3d
哆啦A梦15887 分钟前
Element-Plus
前端·vue.js·ts
IT_陈寒14 分钟前
🔥3分钟掌握JavaScript性能优化:从V8引擎原理到5个实战提速技巧
前端·人工智能·后端
前端小巷子36 分钟前
JS 打造丝滑手风琴
前端·javascript·面试
Mintopia1 小时前
多模态 AIGC 在 Web 内容创作中的技术融合实践:把“创作引擎”装进浏览器
前端·javascript·aigc
鹏多多.1 小时前
flutter-使用fluttertoast制作丰富的高颜值toast
android·前端·flutter·ios
Mintopia1 小时前
Next.js 的 Web Vitals 监测与 Lighthouse 分析:从底层到实战的快乐科学
前端·javascript·next.js
charlie1145141911 小时前
前端三件套简单学习:HTML篇1
开发语言·前端·学习·html
很多石头1 小时前
前端img与background-image渲染图片对H5页面性能的影响
前端·css