Flutter之GetX controller tag使用详解

2023-11-02 05:20

本文主要是介绍Flutter之GetX controller tag使用详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文主要介绍 GetX 依赖注入中 tag 的作用和使用详解。

作用
前面几篇文章介绍了 GetX 依赖注入的使用以及通过源码剖析了依赖注入的原理:

•《Flutter应用框架搭建(一)GetX集成及使用详解》•《Flutter 通过源码一步一步剖析 Getx 依赖管理的实现》•《Flutter之GetX依赖注入使用详解》

通过源码得知,GetX 依赖注入中 tag 的主要作用是用于区分相同类型依赖的不同实例。与 Dagger 和 koin 中的 named 作用相似。

GetX 依赖注入是通过 Map 缓存依赖关系,默认使用注入依赖的类型名称作为 key 进行缓存,当传入 tag 不为空时则使用类型名称 + tag 组合作为缓存的 key。

源码中关键代码如下:

String _getKey(Type type, String? name) {return name == null ? type.toString() : type.toString() + name;
}

其中 name 就是传入的 tag , type 为依赖对象的类型。

在依赖注入时如果使用了 tag 则必须在 put 、find 中都要加上 tag 参数,且对应的 tag 值一致才能保证注入与获取的依赖对象符合预期。同时如果使用 GetBuilder 作为状态管理时也需要传入对应的 tag 值,示例代码如下:

Get.put(CounterController(), tag: "counter");CounterController controller = Get.find<CounterController>(tag: "counter");GetBuilder<CounterController>(builder: (controller) {return Container();},tag: "counter");

使用场景
上面介绍了 tag 的作用,那么在什么样的开发场景中会使用到 tag 呢?下面将介绍两种笔者在开发过程中遇到的典型场景。

相同类型不同作用的依赖注入
该场景一般针对基础数据等已有类型,如 String、int 等。虽然类型相同,但是在开发中使用场景或作用不同。

如需要注入网络请求的 baseUrl 和请求认证携带的 token,都为 String 类型,但是作用和使用场景不同,此时如果不加 tag 就只会注入一个,这种情况就可以使用 tag 区分是要注入/获取 baseUrl 还是 token,使用如下 :

Get.put("http://juejin.cn", tag: "baseUrl");
Get.put(token, tag: "token");Get.find(tag: "baseUrl");
Get.find(tag: "token");

相同类型相同作用的不同实例
这种情况注入的依赖类型相同且作用也相同,但是业务上需要不同的实例,一般用于业务复用的情况。

页面中常见的注入对象为 Controller,当页面复用的情况下依赖注入不带 tag 就可能会出现多个页面共用一个 Controller 的情况,因为默认使用依赖对象类型名称作为 key,就会导致不同的页面注入的 Controller 是同一个实例。此时就可以使用 tag 来解决。

比如一个新闻详情界面,在新闻详情界面一般会有相关新闻列表,点击相关的新闻时又会跳转到新的新闻详情界面,在代码中新闻详情界面是只有一个的,但是传入的新闻 id 不同显示不同的新闻内容,如果依赖注入/获取时不带 tag 就回到导致跳转到新的新闻详情界面显示的内容还是上一个界面的内容,因为获取到的 Controller 实例是同一个,导致数据是相同的并没有加载新的新闻内容。具体原理在之前的原理文章做了详细的阐述。

此时就需要用到 tag 来解决,可以使用新闻的 id 作为 tag 以确保不同的新闻展示其对应的内容,并且能做到相同新闻数据共享的效果避免重复加载数据。

路由跳转时携带 tag:

Get.to(NewsPage(tag: id,), arguments:{"id" : id});
NewPage 获取依赖:class NewsPage extends StatelessWidget {final String? tag;final NewsController controller;NewsPage({Key? key, this.tag}) :controller = Get.put(NewsController(), tag: tag),super(key: key);Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text("News"),),body: GetBuilder<NewsController>(builder: (controller) {return Container(); /// news content},tag: tag,));}
}

在 Controller 里获取路由参数然后加载数据:

class NewsController extends GetxController{void onInit() {super.onInit();var id = Get.arguments["id"];/// load new data}
}
如果使用的 Binding 注入依赖关系,则 Binding 也需要传入 tag :class NewsBinding extends Bindings{final String? tag;NewsBinding({this.tag});void dependencies() {Get.lazyPut(() => NewsController(), tag: tag);}
}

然后路由跳转时:

Get.to(NewsPage(tag: id,), arguments:{“id” : id}, binding:
NewsBinding(tag: id));
界面获取依赖:

class NewsPage extends StatelessWidget {final String? tag;const NewsPage({Key? key, this.tag}) : super(key: key);Widget build(BuildContext context) {NewsController controller = Get.find(tag: tag);return Scaffold(appBar: AppBar(title: const Text("News"),),body: GetBuilder<NewsController>(builder: (controller) {return Container(); /// news content},tag: tag,));}
}

除了像详情页跳转详情页这种跳转同一页面的场景还有页面嵌套复用时也可以使用这种方式解决依赖注入的问题,比如 A 页面内容里嵌套了 B 页面,又存在跳转 B 页面的业务,则可以使用 tag 灵活解决依赖注入问题,本质也是同一个页面存在不同的实例,与上面介绍的示例一样。

总结
在开发过程中依赖注入时灵活使用 tag 可以解决很多复杂的业务场景,提高代码的复用性。

http://www.manongjc.com/detail/64-xiusojikogezppu.html

这篇关于Flutter之GetX controller tag使用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/328409

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV