请使用覆盖选项或检查定义,koin android?
Please use override option or check for definition, koin android?
我正在 android 应用程序中实施 Koin DI。我成功地创建了一些模块。但是我遇到了一个异常,我试图从模块中的另一个获取对象。
这些是我的模块
val networkModule = module {
factory { provideRetrofit() }
single { provideNetworkApi(get()) }
}
fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl(NetworkConstant.BASE_URL)
.addConverterFactory(
GsonConverterFactory.create(
GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create()
)
)
.client(OkHttpClient.Builder().build())
.build()
}
fun provideNetworkApi(retrofit: Retrofit): NetworkCall =
retrofit.create(NetworkCall::class.java)
查看模型模块-我想在这里传递网络调用对象
val viewModelModule = module {
single { provideNetworkApi(get ()) }
}
这是我在应用程序中的代码class
startKoin {
androidLogger()
androidContext(this@BaseApp)
modules(listOf(networkModule,viewModelModule))
}
这是我得到的异常
java.lang.RuntimeException: Unable to create application com.mountmeru.BaseApp: org.koin.core.error.DefinitionOverrideException: Definition '[Factory:'com.mountmeru.network.NetworkCall']' try to override existing definition. Please use override option or check for definition '[Factory:'com.mountmeru.network.NetworkCall']'
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6465)
at android.app.ActivityThread.access00(ActivityThread.java:219)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: org.koin.core.error.DefinitionOverrideException: Definition '[Factory:'com.mountmeru.network.NetworkCall']' try to override existing definition. Please use override option or check for definition '[Factory:'com.mountmeru.network.NetworkCall']'
at org.koin.core.scope.ScopeDefinition.save(ScopeDefinition.kt:25)
有什么线索吗?
我做错了。正确的实现是
我想要我的 LoginViewModel 中的 NetworkCall 对象
val viewModelModule = module {
single { LoginViewModel(get()) }
}
视图模型class如下
class LoginViewModel(networkCall: NetworkCall) : ViewModel(){
var networkCall: NetworkCall;
init {
this.networkCall = networkCall
}
}
目前我觉得koin还不错
对于处理此错误消息的任何其他人,Koin
不允许在其模块中出现任何歧义。因此,如果您尝试加载一个与已加载的定义符合相同签名的 bean 定义,您最终会收到此错误。如果您打算用新定义替换旧定义,请使用 override
标志。
这是一个用法示例:
loadKoinModules(
module(override = true) {
single<A> {
A
}
}
)
我正在 android 应用程序中实施 Koin DI。我成功地创建了一些模块。但是我遇到了一个异常,我试图从模块中的另一个获取对象。
这些是我的模块
val networkModule = module {
factory { provideRetrofit() }
single { provideNetworkApi(get()) }
}
fun provideRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl(NetworkConstant.BASE_URL)
.addConverterFactory(
GsonConverterFactory.create(
GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create()
)
)
.client(OkHttpClient.Builder().build())
.build()
}
fun provideNetworkApi(retrofit: Retrofit): NetworkCall =
retrofit.create(NetworkCall::class.java)
查看模型模块-我想在这里传递网络调用对象
val viewModelModule = module {
single { provideNetworkApi(get ()) }
}
这是我在应用程序中的代码class
startKoin {
androidLogger()
androidContext(this@BaseApp)
modules(listOf(networkModule,viewModelModule))
}
这是我得到的异常
java.lang.RuntimeException: Unable to create application com.mountmeru.BaseApp: org.koin.core.error.DefinitionOverrideException: Definition '[Factory:'com.mountmeru.network.NetworkCall']' try to override existing definition. Please use override option or check for definition '[Factory:'com.mountmeru.network.NetworkCall']'
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6465)
at android.app.ActivityThread.access00(ActivityThread.java:219)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1859)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: org.koin.core.error.DefinitionOverrideException: Definition '[Factory:'com.mountmeru.network.NetworkCall']' try to override existing definition. Please use override option or check for definition '[Factory:'com.mountmeru.network.NetworkCall']'
at org.koin.core.scope.ScopeDefinition.save(ScopeDefinition.kt:25)
有什么线索吗?
我做错了。正确的实现是
我想要我的 LoginViewModel 中的 NetworkCall 对象
val viewModelModule = module {
single { LoginViewModel(get()) }
}
视图模型class如下
class LoginViewModel(networkCall: NetworkCall) : ViewModel(){
var networkCall: NetworkCall;
init {
this.networkCall = networkCall
}
}
目前我觉得koin还不错
对于处理此错误消息的任何其他人,Koin
不允许在其模块中出现任何歧义。因此,如果您尝试加载一个与已加载的定义符合相同签名的 bean 定义,您最终会收到此错误。如果您打算用新定义替换旧定义,请使用 override
标志。
这是一个用法示例:
loadKoinModules(
module(override = true) {
single<A> {
A
}
}
)