【问题标题】:Koin constructor inject few parameters MVVM Android ArchitectureKoin 构造函数注入少量参数 MVVM Android 架构
【发布时间】:2020-05-14 07:41:24
【问题描述】:

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

  • RESTApi 进行网络通话。 RestProvider 使用 SocketProvider 作为构造函数参数
  • Utils(Context) 作为获取一些基本信息的助手(appVersion, IMEI 等)

我的应用模块

    {
    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:不能 为 [type:Single,primary_type:'com.etrans.ntsdriver.provider.repository.RepositoryApi'] 在 org.koin.core.instance.DefinitionInstance.create(DefinitionInstance.kt:61) 在 org.koin.core.instance.SingleDefinitionInstance.get(SingleDefinitionInstance.kt:40) 在 org.koin.core.definition.BeanDefinition.resolveInstance(BeanDefinition.kt:70) 在 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"

提前感谢您的帮助

【问题讨论】:

    标签: android kotlin mvvm koin


    【解决方案1】:

    这是一个使用 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了

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

    希望这会有所帮助。

    【讨论】:

    • 谢谢,我今天试试
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 2021-12-18
    • 2015-11-11
    • 1970-01-01
    相关资源
    最近更新 更多