Autumn_Cat
Autumn_Cat

Reputation: 800

Koin constructor inject few parameters MVVM Android Architecture

I'm using MVVM architecture for my Android app and just started with Koin. When I'm trying to inject more than one parameter problems start appearing. For now I have Repository class which uses:

My appModule

    {
    single<RepositoryApi> {
        Repository(
            Utils(androidContext())
           \\ RestProvider(SocketProvider()) Here I get problems
        )
    }
    single<RestApi> { RestProvider(get() as SocketProvider) }
    single<SocketApi> { SocketProvider() }
    single<UtilsApi> { Utils(androidContext()) }
    viewModel { LoginViewModel(get()) }
}

When I use Utils only everything works fine, when I add RestProvider I get exception:

Caused by: org.koin.core.error.InstanceCreationException: Could not create instance for [type:Single,primary_type:'com.etrans.ntsdriver.provider.repository.RepositoryApi'] at org.koin.core.instance.DefinitionInstance.create(DefinitionInstance.kt:61) at org.koin.core.instance.SingleDefinitionInstance.get(SingleDefinitionInstance.kt:40) at org.koin.core.definition.BeanDefinition.resolveInstance(BeanDefinition.kt:70) at org.koin.core.scope.Scope.resolveInstance(Scope.kt:165) at org.koin.core.scope.Sc

I understand that I'm missing something but I didn't find any tutorials or examples to explain such cases.

My gradle dependencies related to Koin(maybe will be useful):

 // Koin for Android - ViewModel features
    implementation "org.koin:koin-android-viewmodel:$koin_version"
    implementation "org.koin:koin-java:$koin_version"

    testImplementation "org.koin:koin-test:$koin_version"
    androidTestImplementation "org.koin:koin-test:$koin_version"

Thanks in advance for any help

Upvotes: 0

Views: 3287

Answers (1)

ArbenMaloku
ArbenMaloku

Reputation: 558

Here is an example of using Koin to setup retrofit.

private val networkModule = module {

    single {
        HttpLoggingInterceptor(
            HttpLoggingInterceptor.Logger { message ->
                //Logger.d("NETWORK: $message")
            }).apply {
            level = HttpLoggingInterceptor.Level.NONE
        }
    }

    single {
        DefaultHeadersInterceptor()
    }

    single {
        OkHttpClient.Builder()
            .addInterceptor(get<HttpLoggingInterceptor>())
            .addInterceptor(get<DefaultHeadersInterceptor>())
            .build()
    }

    single {

        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(JacksonConverterFactory.create(ObjectMapper().registerKotlinModule()))
            .client(get())
            .build()
    }
    single { get<Retrofit>().create(ApiInterface::class.java) }
}

So on this way you can configure ApiInterface

single { get().create(ApiInterface::class.java) }

Hope this will help.

Upvotes: 3

Related Questions