android跨模块调用类,在多模块应用中使用 Dagger-程序员宅基地

技术标签: android跨模块调用类  

注意:本文中提到的模块是指 Gradle 模块,而不是 Dagger 模块。

包含多个 Gradle 模块的项目称为多模块项目。在作为单个 APK 发布且不包含动态功能模块的多模块项目中,通常具有一个可依赖于项目中大多数模块的 app 模块和一个其他模块通常可依赖的 base 或 core 模块。app 模块通常包含 Application 类,而 base 模块包含在项目中所有模块之间共享的所有通用类。

app 模块非常适合用来声明应用组件(例如,下图中的 ApplicationComponent),应用组件可以提供其他组件可能需要的对象以及应用的单例。例如,像 OkHttpClient 这样的类、JSON 解析器、数据库的访问函数或可能在 core 模块中定义的 SharedPreferences 对象,都将由 app 模块中定义的 ApplicationComponent 提供。

在 app 模块中,还可以包含一些生命周期较短的其他组件。例如,在用户登录后,该模块中可能会包含具有用户专属配置的 UserComponent(比如 UserSession)。

在项目的不同模块中,您可以定义至少一个具有该模块的专属逻辑的子组件,如图 1 所示。

2e063d03c8118de0dc335254b7ac7301.png

图 1. 多模块项目中的 Dagger 图示例

例如,在 login 模块中,您可以定义采用自定义 @ModuleScope 注释来限定范围的 LoginComponent 组件,该组件可提供相应功能(例如 LoginRepository)的常用对象。在该模块内,您还可以定义依赖于具有其他自定义范围的 LoginComponent 的其他组件,例如将 @FeatureScope 用于 LoginActivityComponent 或 TermsAndConditionsComponent,您可以在这两个组件中定义更加特定于功能的逻辑,例如 ViewModel 对象。

对于其他模块(例如 Registration),您需要进行类似的设置。

多模块项目的一般规则是同级模块不应相互依赖。如果它们相互依赖,请考虑相应共享逻辑(它们之间的依赖关系)是否应该是父级模块的一部分。如果应该,请进行重构以将这些类移动到父级模块;如果不应该,请创建一个可扩展父级模块的新模块,并使两个原始模块都扩展新模块。

最佳做法:在以下情况下,您通常需要在模块中创建一个组件:

对于 LoginActivityComponent,您需要执行字段注入。

对于 LoginComponent,您需要限定对象的范围。

如果并非以上两种情况并且您需要告知 Dagger 如何从相应模块提供对象,请使用 @Provides 或 @Binds 方法创建和提供 Dagger 模块,但前提是这些类不支持构造函数注入。

使用 Dagger 子组件进行实现

在 Android 应用中使用 Dagger 文档页面介绍了如何创建和使用子组件。但是,由于功能模块无法识别 app 模块,因此您无法使用相同的代码。例如,如果您考虑使用我们在上一页中介绍的代码来构建典型的登录流程,系统将无法再进行编译:

Kotlin

class LoginActivity: Activity() {

...

override fun onCreate(savedInstanceState: Bundle?) {

// Creation of the login graph using the application graph

loginComponent = (applicationContext as MyDaggerApplication)

.appComponent.loginComponent().create()

// Make Dagger instantiate @Inject fields in LoginActivity

loginComponent.inject(this)

...

}

}Java

public class LoginActivity extends Activity {

...

@Override

protected void onCreate(Bundle savedInstanceState) {

// Creation of the login graph using the application graph

loginComponent = ((MyApplication) getApplicationContext())

.appComponent.loginComponent().create();

// Make Dagger

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33499715/article/details/117724981

智能推荐

鸿蒙操作系统系列——科普篇_鸿蒙原理-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏12次。2020年6月2日华为将正式发布鸿蒙手机操作系统,有人说鸿蒙是PPT系统,快发布了说耍猴,真发布了又说是Android套壳。不兼容运行Android程序说要之何用,能运行了又说是基于Android,杠精真的是啥都能说。但凡去看一眼OpenHarmony在开放原子开源基金会(OpenAtom Foundation)旗下开源项目https://gitee.com/openharmony就知道这是一款定位为全场景的开源分布式操作系统。当然,众口难调,长的一样你们说是Android,长的不一样你们说是生态环境..._鸿蒙原理

包含 videodev2.h 时 timestamp 报错的解决方法_unexpected timestamp values detected. this can occ-程序员宅基地

文章浏览阅读3.5k次。在#include <linux/videodev2.h> 后编译会报一个错:field ‘timestamp’ has incomplete type struct timespec timestamp; 2225 解决方法是在#include <linux/videodev2.h> 之前加两行:#include ..._unexpected timestamp values detected. this can occur in h.264 videos not enc

HTTP访问控制(CORS) 跨域访问_hls cors是-程序员宅基地

文章浏览阅读1.7k次。当一个资源请求一个其它域名的资源时会发起一个跨域HTTP请求(cross-origin HTTP request)。比如说,域名A(http://domaina.example)的某 Web 应用通过标签引入了域名B(http://domainb.foo)的某图片资源(http://domainb.foo/image.jpg),域名A的 Web 应用就会导致浏览器发起一个跨域 HTTP 请_hls cors是

Java实现 蓝桥杯VIP 基础练习 字符串对比_蓝桥给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的-程序员宅基地

文章浏览阅读1.1w次。问题描述  给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:  1:两个字符串长度不等。比如 Beijing 和 Hebei  2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing  3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它..._蓝桥给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的

MySQL存储过程详解(正文)_mysql 存储正文-程序员宅基地

文章浏览阅读963次。我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的_mysql 存储正文

大数据分析工具作业task01:np.random总结及几种常见概率分布图形的绘制_np.random.random产生随机数的概率分布-程序员宅基地

文章浏览阅读1.7k次。numpy.random在生成大型样本时比纯python方式快乐一个数量级写这篇文章的原因是小米菲一直对于numpy中的伪随机数们傻傻分不清楚,再加上我的大数据分析工具老师让我们画出六种分布的图形(包括正态、指数、均匀;0-1、二项、泊松。)所以趁着这个机会恶补一下,顺便学学常用的统计图形怎么画。一个目录1.函数总结2.均匀分布2.1均匀分布np.random.rand()2.2 均匀分布的图像绘制2.3 补充——直方图hist()参数bins变量类型3. 正态分布(高斯分布)3.1 np.rand._np.random.random产生随机数的概率分布

随便推点

Mybatis整合Redis实现二级缓存-程序员宅基地

文章浏览阅读896次,点赞14次,收藏10次。1、二级缓存开启,既可以缓存单条,也可以缓存多条2、可以通过mapper.xml的useCache属性控制是否使用缓存小编利用空余时间整理了一份《MySQL性能调优手册》,初衷也很简单,就是希望能够帮助到大家,减轻大家的负担和节省时间。关于这个,给大家看一份学习大纲(PDF)文件,每一个分支里面会有详细的介绍。这里都是以图片形式展示介绍,如要下载原文件以及更多的性能调优笔记(MySQL+Tomcat+JVM)!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》

课题组都在用的机器学习画图模板! 开放下载啦-程序员宅基地

文章浏览阅读129次。下载关注公众号AI算法与图像处理:并在公众号后台回复“绘图模板”,即可获取下载来源:机器之心神经网络画图神器 ML Visuals 正在持续更新。github上有一个名为 ML Visuals 的机器学习画图模板,该项目受到广泛关注,迄今已收获 7.2K Star。ML Visuals 专为解决神经网络画图问题设计!项目地址:https://github.com/dair-ai/ml-visua..._ml visuals下载

ctf 网络安全比赛简介_网络攻击比赛-程序员宅基地

文章浏览阅读330次。MISC(安全杂项):全称Miscellaneous。题目涉及流量分析、电子取证、人肉搜索、数据分析、大数据统计等等,覆盖面比较广。我们平时看到的社工类题目;给你一个流量包让你分析的题目;取证分析题目,都属于这类题目。主要考查参赛选手的各种基础综合知识,考察范围比较广。PPC(编程类):全称Professionally Program Coder。题目涉及到程序编写、编程算法实现。算法的逆向编写,批量处理等,有时候用编程去处理问题,会方便的多。当然PPC相比ACM来说,还是较为容易的。_网络攻击比赛

代码注释对齐_写代码时每行的注释怎么对齐-程序员宅基地

文章浏览阅读3.9k次。图1图2感觉上我们认为图2是我们想要的注释对齐的效果。但感觉是不能拿来代码实现的。所以我们需要定义什么叫注释对齐。如下图假设代码部分的长度为CL,代码到//之间的长度为Width。注释对齐实际上就是计算Width-CL,中间填充这么多个空格。那么尝试定_写代码时每行的注释怎么对齐

JS高阶技巧(深浅拷贝,节流,防抖)_uni-app js 深拷贝存在函数-程序员宅基地

文章浏览阅读335次。当JavaScript开始解释执行代码的时候,最先遇到的就是全局代码,所以它会向执行上下文栈压入一个全局执行上下文,我们用globalContext表示,并且只有当整个程序运行结束时,ECStack才会被清空,所以程序结束之前,ECStack最底部永远有个globalContext。JavaScript引擎执行是顺序执行的,但是它并不是一行一行地分析和执行代码,而是一段一段地分析和执行的。因此当我们只想改变this指向,并且不想调用这个函数的时候,可以使用bind,比如改变定时器内部的this指向。_uni-app js 深拷贝存在函数

KubeVirt备份与还原方案【翻译】_kubevirt snapshot-程序员宅基地

文章浏览阅读870次。kubevirt官方给出的的备份还原方案(思路)_kubevirt snapshot

推荐文章

热门文章

相关标签