【问题标题】:Dagger2 with Androidx, SupportFragmentInjector issue带有 Androidx 的 Dagger2,SupportFragmentInjector 问题
【发布时间】:2018-10-06 13:06:47
【问题描述】:

我正在尝试在新应用中实现 Dagger2 注入,唯一失败的是 DaggerAppCompatActivity 和 SupportFragmentInjector。

当我转到 DaggerAppCompatActivity 代码时,我看到:

它尝试在 androidx 重构之前从库版本中引用 AppCompatActivity 和 Fragment。当我继承这个类时,我什至不能调用 setContentView(),因为它不可用。

我想将此代码复制粘贴到我自己的基本活动中,但 HasSupportFragmentInjector 使用 pre-adroidX Fragment。

有没有办法让它与 AndroidX 一起工作?

编辑:这是我在尝试使用 DaggerAppCompatActivity 作为@ContributesAndroidInjector 提到的活动的基类时遇到的错误。如果我简单地做 AndroidInjection.inject(this) 而不是这个继承,它工作正常。

C:\Users\micha\Workspace\StudioProjects\BirthdayGift\app\build\tmp\kapt3\stubs\debug\com\mpowloka\birthdaygift\common\di\ApplicationComponent.java:8: error: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] 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.
public abstract interface ApplicationComponent {
                ^
      java.util.Map<java.lang.Class<? extends androidx.fragment.app.Fragment>,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends androidx.fragment.app.Fragment>>> is injected at
          dagger.android.DispatchingAndroidInjector.<init>(injectorFactories)
      dagger.android.DispatchingAndroidInjector<androidx.fragment.app.Fragment> is injected at
          dagger.android.support.DaggerAppCompatActivity.supportFragmentInjector
      com.mpowloka.birthdaygift.persons.PersonsActivity is injected at
          dagger.android.AndroidInjector.inject(T)
  component path: com.mpowloka.birthdaygift.common.di.ApplicationComponent ? com.mpowloka.birthdaygift.common.di.ActivityBindingModule_PersonsActivity.PersonsActivitySubcomponent

编辑 2:我的项目依赖项(包含在单独的 gradle 文件中):

ext.room = dependencyGroup {
    kapt "androidx.room:room-compiler:$room_version"
    implementation "androidx.room:room-runtime:$room_version"
    testImplementation "androidx.room:room-testing:$room_version"
}

ext.dagger = dependencyGroup {
    implementation "com.google.dagger:dagger:$dagger_version"
    implementation "com.google.dagger:dagger-android:$dagger_version"
    implementation "com.google.dagger:dagger-android-support:$dagger_version"
    kapt "com.google.dagger:dagger-compiler:$dagger_version"
    kapt "com.google.dagger:dagger-android-processor:$dagger_version"
}

ext.coreTesting = dependencyGroup {
    testImplementation 'junit:junit:4.12'
    testImplementation 'org.mockito:mockito-core:2.21.0'
    testImplementation 'org.awaitility:awaitility:3.1.2'

    androidTestImplementation 'org.mockito:mockito-core:2.21.0'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    androidTestImplementation 'org.awaitility:awaitility:3.1.2'
}

ext.androidArchitecture = dependencyGroup {
    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
    kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
    testImplementation "androidx.arch.core:core-testing:$lifecycle_version"
}

ext.views = dependencyGroup {
    implementation 'com.android.support:design:28.0.0'
}


ext {

    kotlin_version = '1.2.71'

    room_version = '2.0.0-beta01'
    dagger_version = "2.16"
    lifecycle_version = '2.0.0-beta01'

}

【问题讨论】:

  • 你的依赖是什么样的?您是否将 gradle.properties 文件中的 android.useAndroidX 和 android.enableJetifier 都设置为 true?您是否尝试清理和重建您的项目?
  • @SamuelEminet 我不知道什么是 anroid.enableJetifier... 我确实尝试过重建 ofc,我将在一秒钟内包含我的 gradle 依赖项
  • 您找到解决方案了吗?
  • @GianMS 我们设法在另一个项目中做到了,但由于某种原因现在我无法重现它......我目前在这个项目中使用的后备是不使用支持片段(显然不能长期接受)。一旦我设法在这里修复它,我会发布答案。

标签: android android-support-library dagger androidx


【解决方案1】:

我解决了这个问题。

这是我的依赖:

实现“com.google.dagger:dagger:2.16”

实现“com.google.dagger:dagger-android-support:2.16”

kapt "com.google.dagger:dagger-compiler:2.16"

kapt "com.google.dagger:dagger-android-processor:2.16"

【讨论】:

    【解决方案2】:

    要尝试/检查的一些事情:

    gradle.properties 中是否启用了 androidx?赞android.useAndroidX=true

    build.gradle 最新版本中可以应用这个插件 apply plugin: 'kotlin-kapt'

    删除支持类(Fragment、AppCompatActivity)的旧导入并重新导入。

    检查 androidx 的 gradle 依赖项是否存在:

    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'androidx.recyclerview:recyclerview:1.0.0'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    

    然后清理和/或文件 -> 使缓存无效/重新启动

    【讨论】:

      猜你喜欢
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 2021-05-30
      相关资源
      最近更新 更多