Не может предоставить контекст для инъекции кинжала - PullRequest
0 голосов
/ 13 октября 2019

Я новичок в кинжале, я хочу внедрить контекст и сеть (используя модернизацию) в мои классы.

это мой код:

   @Module
// Safe here as we are dealing with a Dagger 2 module
@Suppress("unused")
object NetworkModule {
    @Provides
    @Reusable
    @JvmStatic
    internal fun provideMainApi(retrofit: Retrofit): MainApi {
        return retrofit.create(MainApi::class.java)
    }

    @Provides
    @Reusable
    @JvmStatic
    internal fun provideRetrofitInterface(): Retrofit {
        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY
        val client = OkHttpClient.Builder().addInterceptor(interceptor).build()

        return Retrofit.Builder()
            .baseUrl(Constants.baseUrl)
            .addConverterFactory(MoshiConverterFactory.create())
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
            .client(client)
            .build()
    }
}

@Module
class AppModule(private val app: Application) {
    @Provides
    @Singleton
    fun provideApplication() = app
}

это мойкомпонент:

    @Singleton
@dagger.Component(modules = arrayOf(AppModule::class, NetworkModule::class))
interface AppComponent {

    ///for injecting retrofit network
    fun injectMain(mainRepository: MainRepository)

    @dagger.Component.Builder
    interface Builder {
        fun build(): AppComponent

        fun networkModule(networkModule: NetworkModule): Builder
        fun appModule(appModule: AppModule):Builder
    }

}

Я хочу использовать его в своем хранилище, у меня есть baseRepository:

    open class BaseRepository {
    private val injector: AppComponent = DaggerAppComponent
        .builder()
        .networkModule(NetworkModule)
        .build()

    init {
        inject()
    }

    private fun inject() {
        when (this) {
            is MainRepository -> injector.injectMain(this)
        }
    }

}

, когда я запускаю приложение, я получаю эту ошибку "module.AppModule долженбыть установленным "

Я понимаю ошибку, и я должен предоставить appMOdule в моем базовом репозитории, но проблема в том, что у меня нет приложения или контекста в базовом репозитории

как мне это исправить?

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

но как я могу использовать инжектор в классе приложения, это не имеет смысла

1 Ответ

0 голосов
/ 18 октября 2019

На вашем месте я бы прошел этот проект и увидел бы там, как все делается.

https://github.com/google/iosched

Здесь объясняется, о чем этот проект:

https://medium.com/androiddevelopers/google-i-o-2018-app-architecture-and-testing-f546e37fc7eb

Также вы можете проверить ветку Кинжала в этом проекте:

https://github.com/android/architecture-samples

Все это сделал Хосе Алсеррека и некоторые другие ребята. Это рекомендации Google относительно Android, и на них будут даны ответы на большинство ваших вопросов.

но как я могу использовать инжектор в классе приложения, это не имеет смысла Существует класс DaggerApplication, который вы можете расширять и внедрять в свой класс App так, как вам хочется.

И я вам все это рассказываю, потому что я думаю, что вы изучили Dagger из старых источников. Я бы многое изменил в вашем коде.

Кроме того, я использую Dagger уже 1,5 года и никогда не писал такого кода, как в BaseRepository. Я использую только и только аннотации @Inject, и это все через мои классы, которые не связаны с Dagger. Создание компонента в репозитории? -> Никогда!

Так ваши занятия должны заканчиваться повсюду.

class Repostory @Inject constructor(
private val dependency1: Dependency1 
) {}

class Activity {
@Inject lateinit var dependency2: Dependency2
}
...