Dagger 2 子组件与组件依赖关系

2023-12-06

匕首1号plus()方法是我在以前的应用程序中经常使用的方法,因此我理解您可能希望子组件能够完全访问父图绑定的情况。

在什么情况下使用组件依赖代替子组件依赖为什么?


组件依赖性 - 当您想要保持两个组件独立时使用此选项。

子组件 - 当您想要保持两个组件耦合时使用此组件。


我将用下面的例子来解释组件依赖 and 子组件。该示例中值得注意的一些要点是:

  • SomeClassA1可以在没有任何依赖的情况下创建。ModuleA提供和实例SomeClassA1通过provideSomeClassA1() method.
  • SomeClassB1没有的话就无法创建SomeClassA1. ModuleB可以提供一个实例SomeClassB1仅当一个实例SomeClassA1作为参数传递给provideSomeClassB1() method.
@Module
public class ModuleA {
    @Provides
    public SomeClassA1 provideSomeClassA1() {
        return new SomeClassA1();
    }
}

@Module
public class ModuleB {
    @Provides
    public SomeClassB1 provideSomeClassB1(SomeClassA1 someClassA1) {
        return new SomeClassB1(someClassA1);
    }
}

public class SomeClassA1 {
    public SomeClassA1() {}
}

public class SomeClassB1 {
    private SomeClassA1 someClassA1;

    public SomeClassB1(SomeClassA1 someClassA1) {
        this.someClassA1 = someClassA1;
    }
}

Dagger 将负责传递实例SomeClassA1作为一个论点provideSomeClassB1()方法上ModuleB每当组件/子组件声明ModuleB已初始化。我们需要指示 Dagger 如何实现依赖关系。这可以通过使用来完成组件依赖 or 子组件.

组件依赖

请注意下面的组件依赖关系示例中的以下几点:

  • ComponentB必须通过以下方式定义依赖关系dependencies方法上@Component注解。
  • ComponentA不需要声明ModuleB。这使两个组件保持独立。
public class ComponentDependency {
    @Component(modules = ModuleA.class)
    public interface ComponentA {
        SomeClassA1 someClassA1();
    }

    @Component(modules = ModuleB.class, dependencies = ComponentA.class)
    public interface ComponentB {
        SomeClassB1 someClassB1();
    }

    public static void main(String[] args) {
        ModuleA moduleA = new ModuleA();
        ComponentA componentA = DaggerComponentDependency_ComponentA.builder()
                .moduleA(moduleA)
                .build();

        ModuleB moduleB = new ModuleB();
        ComponentB componentB = DaggerComponentDependency_ComponentB.builder()
                .moduleB(moduleB)
                .componentA(componentA)
                .build();
    }
}

子组件

在 SubComponent 示例中请注意以下几点:

  • As ComponentB尚未定义依赖关系ModuleA,它不能独立生活。它变得依赖于将提供的组件ModuleA。因此它有一个@Subcomponent注解。
  • ComponentA已宣布ModuleB通过接口方法componentB()。这使得两个组件耦合。实际上,ComponentB只能通过初始化ComponentA.
public class SubComponent {
    @Component(modules = ModuleA.class)
    public interface ComponentA {
        ComponentB componentB(ModuleB moduleB);
    }

    @Subcomponent(modules = ModuleB.class)
    public interface ComponentB {
        SomeClassB1 someClassB1();
    }

    public static void main(String[] args) {
        ModuleA moduleA = new ModuleA();
        ComponentA componentA = DaggerSubComponent_ComponentA.builder()
                .moduleA(moduleA)
                .build();

        ModuleB moduleB = new ModuleB();
        ComponentB componentB = componentA.componentB(moduleB);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dagger 2 子组件与组件依赖关系 的相关文章

  • 如果未找到 @Named,则使用 dagger 默认实现

    我面临的问题是我有一个基类和多个子类 为了解析特定的子类 我在 Dagger 2 中使用 Named 注释 我想要实现的是 如果我使用 Named Child3 注入并且没有提供 Named Child3 那么我应该默认获取基类的实例 pu
  • 使用 Dagger 2 进行 Presenter 注入

    我刚刚开始使用 Dagger 2 我在网上发现了数千个指南 每个指南都有不同的实现 我现在有点困惑 所以基本上这就是我现在写的 应用程序模块 java Module public class AppModule Application mA
  • DialogFragment 已触发,但未显示导航架构组件中的布局

    在我的一个应用程序中 我使用 Android 导航架构组件 一切都很顺利 但当我想导航到 DialogFrgment 时 我陷入了困境 虽然触发了DialogFragment 但没有看到布局 只能看到重叠模糊背景 无法弄清楚实际问题 这是我
  • 使用 Hilt 注入 viewModel 时不会调用 init

    我想在 ViewModel 初始化时发出 API 请求 这就是为什么我在里面发出 API 请求init方法 期待init当我在 Activity 中注入 viewModel 时被触发 我究竟做错了什么 MainViewModel kt Hi
  • Dagger 2 如何使用子组件将一个类注入多个组件?

    请提供示例代码来使用子组件实现此场景 在 MyActivity 中 我需要满足多个组件的依赖关系 正如您在下面的代码中看到的 我的活动需要来自compA via module classA and compB via module clas
  • 注解处理器 + androidTest + dagger2

    对于仪器测试 我有一个TestApplication这创造了一个TestComponent 但文件不再生成 Error xxx TestApplication java 16 The import xxx DaggerTestApplica
  • 同一库的多个版本

    我有项目 A 它曾经有模块 A1 使用 dagger v 1 2 2 现在我想添加到项目 A 模块 A2 它依赖于 dagger v 2 0 但我不能 因为这两个匕首库是冲突的 我可以在不同的 android 模块中以某种方式处理多个版本的
  • Dagger - 嵌套注入,是否需要调用inject()?

    我是 Dagger 的新手 一开始我遇到了一些问题 到目前为止 我的项目结构很简单 我的注入模块 Module injects GameBoardFragment class GameManager class complete false
  • 使用dagger 2的Android生命周期库ViewModel

    我有一个 ViewModel 类 就像定义在连接 ViewModel 和存储库的部分架构指南 https developer android com topic libraries architecture guide html 当我运行我
  • 如何使用 dagger 限定符注释来提供不同的 OkHttpClient 构建器?

    我正在尝试使用 dagger 限定符在我的 android 应用程序中提供不同类型的 OkHttpClient Builder 例如 我有两个注释 即 Authorized 和 WithTime 每个注释都应该向客户端构建器添加一些拦截器
  • Dagger2:用组件本身注入模块提供的实现类

    考虑到模块都是通过 Dagger1 规范相互共享的complete false library true 您可以收到由 Provides通过构造函数参数的方法 就像这样 public class GetUserForUsernameTask
  • 如何使用构造函数注入创建对象?

    我如何使用提供 Cat 的组件创建 Dog 的实例 public final class Dog private final Cat mCat public final static String TAG Dog Inject public
  • Android dagger依赖循环

    我有两个具有相同范围的依赖项 彼此需要 我的依赖项是具有不同方法的域服务 每种方法都有不同的业务案例 某些业务案例可能会使用另一个领域的方法 为此 我需要域 1 可用于域 2 反之亦然 但是当我这样做时 我收到依赖循环编译错误 经过谷歌搜索
  • 使用 Dagger 中的应用程序组件构建 Android 即时应用程序

    我目前正在尝试 InstantApps 并希望将 dagger 包含到我的项目中 我在设置应用程序 AppComponent 时遇到问题 我的应用程序组件包括我的应用程序的所有功能匕首模块 我基本上有 一个基础应用程序模块包含我的应用程序类
  • Dagger组件依赖含义

    我正在尝试 Dagger 2 我只是通过测试来了解这个框架 我有一个 ApplicationComponent 需要成为整个应用程序的单例 所以我将其定义如下 Component modules ApplicationModule clas
  • 在 Android 中“注入所有内容”是一种不好的做法吗?

    在研究依赖注入时 我发现了一些建议的方法注入一切 http frogermcs github io inject everything viewholder and dagger 2 example 和其他人说没有必要这样做 https s
  • Dagger2自定义@Qualifier用法

    假设我正在制造一辆汽车 并且我有几个具有不同实现的 Brake beans class Car Inject Car BrakeType value abs Brake frontBrake BrakeType value nonabs B
  • 调用replace()方法后片段闪烁/闪烁

    我有一个MainActivity 应该在两个片段之间切换 内容和设置 扩展PreferenceFragmentCompat 一切工作正常 但最近我实施了Dagger 2依赖注入 我的设置片段开始闪烁 当您按下底部导航栏上的设置项时 有时会出
  • 在运行时用Dagger添加Retrofit RequestInterceptor

    我正在使用匕首和改装 我用 Dagger 注入我的 Retrofit 服务 现在我想做一个授权请求来获取 accessToken 之后 我想使用请求拦截器来增强我的 api 模块 以便将此访问令牌用于将来的请求 我的想法是在收到访问令牌后使
  • 用dagger 2查看依赖注入

    我有一个自定义视图扩展TextView 我应该在哪里调用我的组件来注入视图 component inject customTextView 因此 我发现我需要在自定义视图的构造函数中添加注入 在所有视图中 或者使一个调用另一个 Exampl

随机推荐

  • Android Studio - 无法指定自己的 minSdkVersion

    今天早些时候安装 Android L 开发者预览版 SDK 后 我想让我的应用程序与 Android L 和旧版本 例如 Jelly Bean 兼容 我的应用程序使用的 minSdkVersion 为 16 但自从我尝试了开发者预览版以来
  • 在运行时动态选择 LINQ SELECT 字段

    我有一个针对数据库的 LINQ 查询 其中包含多个链接表 并且需要根据输入返回 SELECT 不同的字段 ClassA has ParamA ParamB and ICollection
  • String.equals() 参数排序[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我最近因在最近的一次使用中使用以下内容而收到了反对票answer String word if s equals word y equals word 由于使用了尤达条件 我要求进一步解释
  • 如何将 Python 控制台输出重定向到 QTextBox

    我正在开发一个用于重新编译 Linux 内核的 GUI 为此 我需要从 Python 实现 4 5 个 Linux 命令 我使用 Qt 作为 GUI 设计器 我已经成功地执行了使用命令os system 称呼 但输出是在控制台获得的 真正的
  • 将旗状挥舞添加到 2d 上下文

    我想创建一个以与平常不同的方式显示二维上下文的函数 有点像变换的工作原理 我不想弯曲 改变上下文的大小 而是想让它像波浪一样 这个想法是 这必须来自上下文 而不是来自数据图像 没有位操作 类似的请求在这里完成 如何使用 html5 canv
  • SSRS 日期时间选择器:允许用户选择时间部分

    我想使用日期时间选择器来选择日期以及时间成分 日历允许我选择日期 但无法选择具体时间 我想选择开始和结束时间 以从大量数据中选择一个子集 我在当前的项目中也遇到了类似的问题 我的解决方案是添加一个日期字段 日期 时间类型 和一个时间字段 时
  • WebGL 图像渲染质量差

    我在 WebGL 中的图像渲染遇到问题 我有一个画布 其中有一个占据整个画布的四边形 以及一个应该映射到整个四边形上的纹理 我已经设置了正确的纹理坐标 该图像是一个包含 RGB 数据 按此顺序 的 Uint8array 图像为 1024 7
  • 为什么我的 Django SessionWizardView 调查应用程序数据没有以可用格式显示在我的 MySQL 数据库中?

    我使用以下方法构建了一个多页调查应用程序Django 1 6 2 会话向导视图但我在如何将通过调查表提交的数据保存在我的 MySQL 数据库中时遇到了一些问题django db 那就是我根本不认识或不明白正在拯救的是什么 这是我第一次构建这
  • 数组大小(new[])

    在调试堆中我可以获取数组的大小 该数组的创建者是new int size int char ptr 16 如果数组的大小小于28 它就可以正常工作 但我不知道为什么 0 0 这个技巧在发布模式下有效吗 不使用调试堆 如何获取数组的大小 10
  • 自动页面刷新

    我正在使用以下代码 jQuery form form count html div div jQuery message html
  • 单射双向映射[重复]

    这个问题在这里已经有答案了 我经常处理的映射是单射 在编程术语中 这可以表示为字典 其中所有值都是唯一的 当然 所有键也是唯一的 是否存在一种内存高效的数据结构 用于单射映射 并具有您期望从字典中获得的所有时间复杂度属性 例如 d 1 a
  • PySide2 复合小部件悬停效果

    当鼠标指针进入或离开 QListWidgetItem 时 如何对自定义小部件内的组合元素的位置 比例或任何其他属性进行动画处理 见下面的参考图 有没有更好的方法来管理 QListWidgetItem 周围的空间 项目 qwidget siz
  • CoreText 中的行距和段落对齐

    我正在使用 CoreText 渲染多列文本 但是 当我将第一段的第一个字母设置为比文本其余部分更大的粗体字体时 我遇到了 2 个问题 都在附图中可见 第一行下方的间距太大 我理解这是因为第一个字符可能是 g y p q 等 第一行下方的行现
  • 角度手风琴范围的问题

    我有一个名为模板的指令 模板的代码如下所示 var templates function compile parse var directive restrict EA replace true link link return direc
  • Android 在 NFC 标签上多次启动活动

    我的 Android 应用程序有 2 个活动 一个主要用于信息 另一个用于接收 NFC 第一次启动应用程序时 我可以多次读取 NFC 标签 每次都会启动一个新活动并显示一些信息 如果应用程序关闭但手机被带到 NFC 标签 它将第一次显示 N
  • Android 以编程方式设置或重置 SIM 卡 PIN 码

    我已经实现了下面的解锁我的应用程序 此代码仅适用于系统应用程序 所以我已将我的应用程序作为系统应用程序完成 TelephonyManager manager TelephonyManager this getSystemService Co
  • 告诉服务器用户不再上网

    我是node js新手 尝试使用node js和socket io开发群聊 我可以进行群聊 也可以管理系统中的数据 现在 我的问题是离线用户 即未连接到互联网 我有该用户的连接流 就像我执行receiverUserSocket emit s
  • MATLAB 中的邻近灰度依赖矩阵 (NGLDM)

    我想计算一些纹理特征 即 小 大数字强调 数字不均匀性 二阶矩和熵 这些可以从邻近灰度依赖矩阵计算出来 我正在努力理解 实施这一点 关于此方法的信息很少 公开可用 根据这张纸 This matrix takes the form of a
  • 大文件支持在 C 编程中不起作用

    我正在尝试编译一个共享对象 最终在Python中与ctypes一起使用 用于构建对象的命令行是 gcc Wall O3 shared Wl soname borg stream lm m128bit long double fPIC D F
  • Dagger 2 子组件与组件依赖关系

    匕首1号plus 方法是我在以前的应用程序中经常使用的方法 因此我理解您可能希望子组件能够完全访问父图绑定的情况 在什么情况下使用组件依赖代替子组件依赖为什么 组件依赖性 当您想要保持两个组件独立时使用此选项 子组件 当您想要保持两个组件耦