android - Koin 构造函数注入少量参数 MVVM Android 架构
问题描述
我正在为我的 Android 应用程序使用 MVVM 架构,并且刚开始使用 Koin。当我尝试注入多个参数时,问题开始出现。现在我有Repository
使用的类:
RESTApi
执行网络呼叫。RestProvider
用作SocketProvider
this 的构造函数参数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:无法在 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"
提前感谢您的帮助
解决方案
这是使用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) }
希望这会有所帮助。
推荐阅读
- excel - 如何使用 PowerShell 将 Excel 工作簿文件名复制到单元格中?
- wpf - ListBoxItem 在 Style 中设置 EventSetter
- java - 在本地网络的 IIS 中部署的 Web 应用程序中浏览缓慢,而数据由桌面应用程序提供
- sql - sql防止带触发器的双重预订
- android - 使用 Delphi FMX 将声音作为 Android 服务播放
- npm - 为什么 NPM 包名限制为 214 个字符?
- onnx - 将 caffe_xilinx 模型转换为 onnx 时出错
- angular - 如何在操作成功后获得实际的 HTTP 响应
- javascript - 从 Vue.js3 中的 JSON 获取数据的动态相关下拉列表
- django - 如何在 django 视图中返回 doc 文件作为响应?