是否使用Dagger2为AndroidX Fragment提供注入功能?

时间:2018-11-21 02:24:18

标签: android android-fragments dagger-2 androidx

我在尝试向AndroidX片段提供注入时遇到了一些问题,我不确定确切的问题是什么以及如何解决。该应用程序拒绝生成,并显示以下错误:

 error: [Dagger/MissingBinding] java.util.Map<java.lang.Class<? extends androidx.fragment.app.Fragment>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends androidx.fragment.app.Fragment>>> cannot be provided without an @Provides-annotated method.

以下是在片段中提供注入的方法:

private fun performDependencyInjection() = AndroidSupportInjection.inject(this)

片段的父活动实现了HasSupportFragmentInjector:

class MainActivity : BaseActivity(), MainMVPView, HasSupportFragmentInjector {
    @Inject
    internal lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Fragment>
    ... 
    override fun supportFragmentInjector() = dispatchingAndroidInjector
}

我完全不知道从哪里可以解决此错误。似乎没有太多有关将Dagger2与AndroidX结合使用的最新文档。

我确实需要注意我通过以下方式启用了AndroidX和Jetifier,这一点很重要 gradle.properties:

android.useAndroidX=true
android.enableJetifier=true

但是,在清理并重建项目后,一切都没有改变。

使用Dagger2向AndroidX片段提供注入的正确方法是什么?

编辑:记录在Dagger 2版本2.19中。如果我改用2.16,一切正常。

1 个答案:

答案 0 :(得分:4)

这是由于Jetifier sources中的不匹配,如下面的代码所示:

# Androidx compatible dagger
{
    "from": { "groupId": "com.google.dagger", "artifactId": "dagger-android-processor", "version": "2.16" },
    "to": { "groupId": "com.google.dagger", "artifactId": "dagger-android-processor", "version": "2.16" }
}

来自匕首2.19的release note

  

在下一个版本(2.20)中,我们将删除旧格式。这将   让我们更好地支持AndroidX软件包。

因此,现在您要么必须坚持使用2.16版本,要么等待2.20版本发布。