Dagger2 с Androidx, поддержка SupportFragmentInjector - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь внедрить инъекцию Dagger2 в новое приложение, и единственное, что не работает - это DaggerAppCompatActivity и SupportFragmentInjector.

Когда я перехожу к коду DaggerAppCompatActivity, я вижу, что:

enter image description here

Он пытается сослаться на AppCompatActivity и Fragment из версии библиотеки до рефакторинга androidx.Когда я наследую этот класс, я даже не могу вызвать 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

EDIT 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'

}

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Некоторые вещи, которые нужно попробовать / проверить:

Включен ли androidx в gradle.properties?Как и android.useAndroidX=true

В build.gradle в последних версиях этот плагин можно применить apply plugin: 'kotlin-kapt'

Удалить старый импорт для классов поддержки (Fragment, AppCompatActivity) и повторно импортировать снова.

Проверьте наличие зависимостей gradle для androidx:

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'

А затем очистите и / или File -> Invalidate Caches / Restart

0 голосов
/ 02 января 2019

Я решил эту проблему.

это моя зависимость:

реализация "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-android-процессор: 2,16 "

...