请使用覆盖选项或检查定义,koin android?

WIS*_*SHY 6 android dependency-injection kotlin koin

我正在我的 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)
Run Code Online (Sandbox Code Playgroud)

查看模型模块 - 我想在这里传递网络调用对象

val viewModelModule = module {
single { provideNetworkApi(get ()) }
}
Run Code Online (Sandbox Code Playgroud)

这是我在应用程序类中的代码

startKoin {
        androidLogger()
        androidContext(this@BaseApp)
        modules(listOf(networkModule,viewModelModule))
    }
Run Code Online (Sandbox Code Playgroud)

这是我得到的例外

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.access$1300(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)
Run Code Online (Sandbox Code Playgroud)

任何线索这里出了什么问题?

V M*_*can 5

对于处理此错误消息的任何其他人,Koin不允许在其模块中存在任何歧义。因此,如果您尝试加载一个与已加载的 bean 定义符合相同签名的 bean 定义,您最终会收到此错误。如果您打算用新定义替换旧定义,请使用该override标志。

这是一个使用示例:

loadKoinModules(
  module(override = true) {
    single<A> {
      A
    }
  }
)
Run Code Online (Sandbox Code Playgroud)


WIS*_*SHY 1

我都做错了。正确的实现是

我想要这个NetworkCall物体在我的LoginViewModel

val viewModelModule = module {
single { LoginViewModel(get()) }
}
Run Code Online (Sandbox Code Playgroud)

viewmodel 类如下

class LoginViewModel(val networkCall: NetworkCall) : ViewModel(){

}
Run Code Online (Sandbox Code Playgroud)

目前为止我觉得koin还是不错的