热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Dagger2.10Android子组件和构建器

如何解决《Dagger2.10Android子组件和构建器》经验,为你挑选了1个好方法。

使用新的(在2.10中)dagger.android类,我正在尝试使用依赖于其他模块的子组件来注入事物,因此,它有一个带有这些模块的setter的Builder.https://google.github.io/dagger/android.html上的文档描述了这一点,但不清楚如何实际编写和/或调用这些setter.

引用上面的链接:

AndroidInjection.inject()从Application获取DispatchingAndroidInjector并将您的活动传递给inject(Activity).DispatchingAndroidInjector为您的活动类(即YourActivitySubcomponent.Builder)查找AndroidInjector.Factory,创建AndroidInjector(即YourActivitySubcomponent),并将您的活动传递给inject(YourActivity).

在我看来,为了能够为Builder调用setter,我需要进入某处并确保Builder具有所有必要的数据?我看到的问题是,在运行时,我得到一个IllegalStateException: MODULE must be set,当我的子组件生成的构建器被AndroidInjector调用时.

有问题的子组件实际上是一个片段,而不是一个活动,但我不确定这是否重要.关于如何做到这一点的任何想法?



1> Jeff Bowman ..:

简而言之,您应该覆盖seedInstance对Builder(这是一个抽象类而不是接口)的调用,以提供您需要的其他模块.

编辑:在此之前,检查并确保您确实需要通过该模块.正如Damon在一个单独的答案中添加的那样,如果您为Android类制作了一个特定的模块,那么您可以依靠该类的自动注入来将该配置或实例拉出图表.如果从模块中消除构造函数参数更容易,那么也可以使用他的方法,这也可以提供更好的性能,因为它们可以避免不必要的实例和虚方法调用.


首先,dagger.android在30秒内:而不是让每个Activity或Fragment知道它的父,Activity(或Fragment)调用AndroidInjection.inject(this),它检查Application HasActivityInjector(或父片段,活动和应用程序HasFragmentInjector).我们的想法是您为多绑定创建Map提供绑定,其中提供的绑定几乎总是您编写的构建特定于对象的子组件的子组件构建器.

正如您所说,AndroidInjection.inject(this)并且AndroidInjector.Factory.create(T instance),您没有很多机会将特定于Activity或Fragment的详细信息传递给Builder.相反,我们的想法是您的子组件构建器会覆盖seedInstance实现.如在以下文档中seedInstance:

提供instance用于构建的绑定图AndroidInjector.默认情况下,它用作BindsInstance方法,但可以重写它以提供需要引用活动的任何模块.

这应该是将传递给的相同实例inject(Object).

看起来像这样:

@Subcomponent(modules = {OneModule.class, TwoModule.class})
public interface YourActivitySubcomponent extends AndroidInjector {

  // inject(YourActivity) is inherited from AndroidInjector

  @Builder
  public abstract class Builder extends AndroidInjector.Builder {
    // Here are your required module builders:
    abstract Builder oneModule(OneModule module);
    abstract Builder twoModule(TwoModule module);

    // By overriding seedInstance, you don't let Dagger provide its
    // normal @BindsInstance implementation, but you can supply the
    // instance to modules or call your own BindsInstance:
    @Override public void seedInstance(YourActivity activity) {
      oneModule(new OneModule(activity));
      twoModule(new TwoModule(activity.getTwoModuleParameter()));
    }
  }
}

这里的假设是您需要等待activity模块的实例.如果没有,那么您还可以选择在绑定子组件时调用它们:

@Provides @IntoMap @ActivityKey(YourActivity.class)
AndroidInjector.Factory bindInjector(YourActivitySubcomponent.Builder builder) {
  return builder
      .oneModule(new OneModule(...))
      .twoModule(new TwoModule(...));
}

...但是如果你能做到这一点,那么你可以通过覆盖这些模块,实现一个可以提供Module的构造函数参数的零参数构造函数,并让Dagger创建它们,因为它可以更轻松地处理这些绑定.具有公共零arg构造函数的模块.


这完全奏效了!虽然文档中的任何地方都没有提到它,但是对于使用dagger 2 +的新用户而言,文档很难理解.
推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
author-avatar
赵博钧石博
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有