在安卓Dagger 2中,无法解析HasActivityInjector。

41

我试图在我的Android应用程序中实现HasActivityInjector,但它显示出 HasActivityInjector 无法解析。下面是我在项目中使用的依赖项和插件-

apply plugin: 'kotlin-kapt'
"而且"
implementation 'com.google.dagger:dagger:2.16'
kapt 'com.google.dagger:dagger-compiler:2.16'

这是我正在尝试的代码 -

class RanoBoilerplateApplication : Application(), HasActivityInjector{
    @Inject
    lateinit var activityDispatchingAndroidInjector:
            DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()

        DaggerAppComponent.builder()
                .application(this)
                .build()
                .inject(this)
    }

    override fun activityInjector(): AndroidInjector<Activity> =
            activityDispatchingAndroidInjector
}

如果有人在此之前已经做过这个,那请帮助我找出其他必须包括的依赖项。

在此处查找最新的Dagger 2版本

编码愉快 :-)


将您的版本更新至2.17并重新构建项目。 - Ümañg ßürmån
@UmangBurman,我已经只使用了最新的依赖项。 - Bajrang Hudda
@rekire,当然我正在导入所提到的类。顺便说一下,我正在使用Android Studio,它很酷,可以自动导入,或者通过Alt+Enter轻松导入。 - Bajrang Hudda
6个回答

89

任何类型都可以使用它,因此我们也可以将其用于注入工作线程。对吗? - Usman Rana
当你在2.24以下的地方尝试使用HasAndroidInjector时,会出现这样的情况...D: - A1m

47

虽然回答已经晚了,但对于新手来说可能仍有用处!

为了避免在您的应用程序类中实现多个Dagger接口(如HasActivityInjector,HasServiceInjector等)的样板代码,它已被替换为HasAndroidInjector。现在,您只需要像下面这样实现HasAndroidInjector即可:

class DaggerExampleApplication : Application(), HasAndroidInjector{

       @Inject lateinit var androidInjector : DispatchingAndroidInjector<Any>

       override fun androidInjector(): AndroidInjector<Any> = androidInjector
       override fun onCreate() {
         super.onCreate()
         //Your code
       }        
}

2
很高兴你觉得它有用。 :) - Subhan Ali

13
除了 @mbonnin 和 @Subhan 的回答之外,从版本2.24开始,Has{Activity,Fragment,Service,ContentProvider,BroadcastReceiver} 已被移除。如果您仍想支持旧的实现,请使用支持HasAndroidInjectorHas{Activity,Fragment,Service,ContentProvider,BroadcastReceiver}的版本2.23。
以下是在版本2.24上应该看起来的样子:

Application

class ExampleApp: Application(), HasAndroidInjector {

    @Inject
    lateinit var androidInjector: DispatchingAndroidInjector<Any>

    override fun androidInjector(): AndroidInjector<Any> = androidInjector

/..../

活动

class ExampleActivity: AppCompatActivity(), HasAndroidInjector {

    @Inject
    lateinit var androidInjector: DispatchingAndroidInjector<Any>

    override fun androidInjector(): AndroidInjector<Any> = androidInjector

/..../

片段

class MoreFragment: Fragment(), HasAndroidInjector {

    @Inject
    lateinit var androidInjector: DispatchingAndroidInjector<Any>

    override fun androidInjector(): AndroidInjector<Any> = androidInjector

/..../

6
我的依赖关系如下所示:

//Dagger
implementation "com.google.dagger:dagger:${libs.dagger}"
implementation "com.google.dagger:dagger-android:${libs.dagger}"
implementation "com.google.dagger:dagger-android-support:${libs.dagger}"
kapt "com.google.dagger:dagger-compiler:${libs.dagger}"
kapt "com.google.dagger:dagger-android-processor:${libs.dagger}"

如果你正在使用appcompat,则需要support库。 而${libs.dagger}则是所需的dagger版本(例如2.16)。 在此处了解更多关于依赖项的信息。


你能简要解释一下哪个依赖项是用来做什么的吗? - Bajrang Hudda
@BajrangHudda,简而言之 - Dagger工作所需的最低要求是第1个和第4个(Dagger类+注解处理器),第2个和第5个是与Android一起使用所需的(如果您有appcompat,则还需要第3个)。 - Demigod

2

HasActivityInjector是新的Dagger Android支持模块中引入的。在您的build.gradle文件中包含以下依赖项。

kapt "com.google.dagger:dagger-android-processor:2.18"
implementation "com.google.dagger:dagger-android-support:2.18"

1
这可能是一个晚回答,但是新的Dagger2依赖包含了DaggerAppCompatActivityDaggerFragment类,它们可以自己注入活动和片段。因此,我们不再需要HasActivityInjector、autoInjection方法或类似的东西。请注意,保留html标记。

我们仍然可能依赖于一些我们的遗留项目或外部库,这些库强制我们扩展它们自己的FragmentActivity类。接口可以带来更多的灵活性。 - Joe Dow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接