首页 > 解决方案 > Koin 构造函数注入少量参数 MVVM Android 架构

问题描述

我正在为我的 Android 应用程序使用 MVVM 架构,并且刚开始使用 Koin。当我尝试注入多个参数时,问题开始出现。现在我有Repository使用的类:

我的应用模块

    {
    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()) }
}

当我Utils只使用一切正常时,当我添加时RestProvider我得到异常:

原因:org.koin.core.error.InstanceCreationException:无法在 org.koin.core.instance.DefinitionInstance 上为 [type:Single,primary_type:'com.etrans.ntsdriver.provider.repository.RepositoryApi'] 创建实例。 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) 在 org.koin.core.scope.Sc

我知道我遗漏了一些东西,但我没有找到任何教程或示例来解释这种情况。

我与 Koin 相关的 gradle 依赖项(也许会有用):

 // 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"

提前感谢您的帮助

标签: androidkotlinmvvmkoin

解决方案


这是使用Koin设置改造的示例。

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) }
}

所以这样就可以配置ApiInterface

单个 { get().create(ApiInterface::class.java) }

希望这会有所帮助。


推荐阅读