HasActivityInjector 无法在 android dagger 2 中解决

Posted

技术标签:

【中文标题】HasActivityInjector 无法在 android dagger 2 中解决【英文标题】:HasActivityInjector can not be resolved in android dagger 2 【发布时间】:2019-03-27 16:25:05 【问题描述】:

我试图在我的 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 版本here。

编码愉快 :-)

【问题讨论】:

将您的版本更新到 2.17 并重建项目。 @UmangBurman,我已经在使用最新的一个依赖了。 @rekire,当然我正在导入提到的类,顺便说一下,我使用的是 Android stdio,它很酷,可以自行导入,也可以通过 Alt+Enter 轻松导入 【参考方案1】:

如果有人在更新到 2.24 后来到这里,则会删除:https://github.com/google/dagger/commit/3bd8f707cb28fd0c5f3abb4f87658566f8b52c10。

您可以改用HasAndroidInjector

【讨论】:

谢谢老板。你拯救了我的一天 因为它是任何类型的。因此,我们也可以使用它来注入 Worker。是吗? 大声笑,或者当您尝试在2.24 下方使用HasAndroidInjector 时... D:【参考方案2】:

现在回答已经很晚了,但它可能对匕首世界的新手有用!

它已被 HasAndroidInjector 取代,以避免在您的应用程序类中实现多个 Dagger 接口,如 HasActivityInjector、HasServiceInjector 等。现在你只需要像下面这样实现 HasAndroidInjector:

class DaggerExampleApplication : Application(), HasAndroidInjector

       @Inject lateinit var androidInjector : DispatchingAndroidInjector<Any>

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

【讨论】:

很高兴,您发现它很有用。 :)【参考方案3】:

除了@mbonnin 和@Subhan 的回答,从2.24 版开始,HasActivity,Fragment,Service,ContentProvider,BroadcastReceiver 被删除。 如果您仍想支持这个旧实现,请使用同时支持HasAndroidInjectorHasActivity,Fragment,Service,ContentProvider,BroadcastReceiver 的版本2.23。

这是 2.24 版的样子

应用

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

/..../

【讨论】:

【参考方案4】:

我的依赖项如下所示:

//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 指的是所需的匕首版本(例如 2.16)。 阅读有关依赖项的更多信息here。

【讨论】:

你能简单解释一下哪个依赖是什么? @BajrangHudda,简而言之 - 第一个和第四个是匕首工作所需的最小值(匕首类 + 注释处理器),第二个和第五个是使用 Android 所需的(以及第三个)一个,如果你有 appcompat)。【参考方案5】:

可能是迟到的答案,但新的 Dagger2 依赖项带有 DaggerAppCompatActivityDaggerFragment 类,它们对于自己注入活动和片段很有用。所以,我们不再需要HasActivityInjector、自动注入方法或类似的东西。

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于HasActivityInjector 无法在 android dagger 2 中解决的主要内容,如果未能解决你的问题,请参考以下文章

CSS样式在IE中无法正常显示

为啥“WinMain”在链接为 *.a 静态库时无法解析?

为啥我无法在 prolog 中得到斑马谜题的答案?

IOS应用无法下载此时无法安装应用程序

aspupload ,在winows server 2008 下无法使用

a标签无法正确下载数据