简体   繁体   中英

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:

  • RESTApi to perform web calls. RestProvider uses SocketProvider as constructor parameter for this
  • Utils(Context) as helper to retrieve some basic information(appVersion, IMEI etc)

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM