Dagger 2 с использованием классов, созданных другой библиотекой - PullRequest
0 голосов
/ 19 октября 2018

У меня есть домашняя библиотека, которая генерирует классы DataMapper.

Они генерируются с аннотациями @Singleton и @Inject, чтобы иметь возможность вставлять их туда, где они мне нужны.

Но гдеэто не работает, когда Dagger пытается создать дерево зависимостей, эта ошибка показывает:

:data:kaptGenerateStubsDebugKotlin
e: /Users/me/myproject/data/build/tmp/kapt3/stubs/debug/com/myproject/data/di/DataComponent.java:11: error: [Dagger/MissingBinding] error.NonExistentClass cannot be provided without an @Inject constructor or an @Provides-annotated method.
public abstract com.myproject.domain.repository.ContentRepository contentRepository();
                                                                      ^
  error.NonExistentClass is injected at
      com.myproject.data.repository.ContentDataRepository.<init>(…, myGeneratedDataMapper, …)
  com.myproject.data.repository.ContentDataRepository is injected at
      com.myproject.data.di.module.DataModule.contentRepository(contentDataRepository)
  com.myproject.domain.repository.ContentRepository is provided at
      com.myproject.data.di.DataComponent.contentRepository()
:data:kaptDebugKotlin
:data:kaptDebugKotlin FAILED

Включенные классы:

DataModule (модуль для кинжала)

@Module
class DataModule {
    @Provides
    @Singleton
    fun contentRepository(contentDataRepository: ContentDataRepository): ContentRepository = contentDataRepository
}

DataComponent (компонент для кинжала):

@Singleton
@Component(modules = [DataModule::class])
interface DataComponent {
    fun contentRepository(): ContentRepository
}

ContentDataRepository

@Singleton
class ContentDataRepository @Inject constructor(
        private val myGeneratedDataMapper: MyGeneratedDataMapper
) : ContentRepository {
    ...
}

MyGeneratedDataMapper

@Singleton
class MyGeneratedDataMapper @Inject constructor() {
   ...
}

Дело в том, что если я отключаю капт зависимости от кинжалав gradle.build, затем выполните сборку, затем включите ее, затем выполните сборку, она работает.

Если я выполню команду clean + build, она не будет работать, та же ошибка.Я хочу, чтобы это работало в один ряд.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Я не знаю, используете ли вы AS3.2 или AS3.3 с артефактами androidX или нет, но, возможно, это касается и вас тоже.

, поэтому, когда я перешел на androidX artifacts в AS3.2 я получил кучу ошибок NonExistentClass, заканчивает сборку

kaptGenerateStubsDebugKotlin 
:data:kaptDebugKotlin
:data:kaptDebugKotlin 

Я наконец-то обнаружил, что это как-то связано с самим Dagger, и снизил версию с 2.17 до 2.16теперь последняя версия Dagger2 - 2.18, которую я не могу использовать из-за этой ошибки / функции [о которой они забыли].

Обновление:

я нашелрешение, и оно только что пришло сегодня, так что вот ссылка для отслеживания проблем: https://issuetracker.google.com/issues/115738511

, поэтому ошибка была не в Dagger, а в Jetifier, и я полностью проигнорировал тот факт, что он был включен во время миграции

вот решение, которое я скопировал по ссылке:

Извините, джефирирующее устройство beta01 не совместимо с двоичным кодом с alpha10.

Мы опубликовали beta02это должно решить эту проблему.

Пожалуйста, попробуйте:

buildscript {    dependencies {
       classpath 'com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta02'    } }
0 голосов
/ 22 октября 2018

Вам, вероятно, не понравится мой ответ, но порядок довольно случайный.Посмотрите на эту нить , чтобы получить дополнительные пояснения и, возможно, дополнительные рекомендации, но, если вы хотите убедиться, что вы работаете, сначала посмотрите на плагины Gradle и как их использовать

...