繁体   English   中英

Android KOIN CRASH - 错误原因:org.koin.core.error.DefinitionOverrideException:已经存在 [Singleton:'java.lang.String' 的定义

[英]Android KOIN CRASH - Error Caused by: org.koin.core.error.DefinitionOverrideException: Already existing definition for [Singleton:'java.lang.String'

更新koin和gradle后,出现如下错误提示

Caused by: org.koin.core.error.DefinitionOverrideException: Already existing definition for [Singleton:'java.lang.String'] at java.lang.String::_root_

我不知道这个错误的原因在哪里。

这是我的应用程序文件:

Class MyApplication --> 使用 2 个模块,我从以下位置导入 startKoin: import org.koin.core.context.GlobalContext.startKoin

class MyApplication : Application(), OnMapsSdkInitializedCallback {

override fun onCreate() {
    super.onCreate()

    startKoin{
        if(BuildConfig.DEBUG){

            androidLogger(Level.DEBUG)
            Timber.plant(Timber.DebugTree())
        }
        androidContext(this@MyApplication)
        modules(applicationModule, viewModelModule)
    }

    MapsInitializer.initialize(applicationContext, Renderer.LATEST, this)
}

override fun onMapsSdkInitialized(renderer: Renderer) {
    when (renderer) {
        Renderer.LATEST -> Timber.d("The latest version of the google maps renderer is used.")
        Renderer.LEGACY -> Timber.d("The legacy version of the google maps renderer is used.")
    }
}

}

模块 1——应用模块

// declare a module
val applicationModule = module {

single { BuildConfig.SOME_STRING1 }

single { BuildConfig.SOME_STRING2 }

single { BuildConfig.SOME_STRING3 }

single { BuildConfig.SOME_STRING4 }

single {
    Environment(get(named("SOME_STRING1")),
        get(named("SOME_STRING2")),
        get(named("SOME_STRING3")),
        get(named("SOME_STRING4")), get())
} bind GrpcConfiguration::class
//endregion

//region Channel
single {
    GrpcChannelBuilder.Companion.prepare(get(), get())
}
//endregion

//region Repository
single { SomeDataRepository(get()) } bind SomeRepository::class

//endregion

//region XXXXProvider
single { XXXXProvider(get()) }

//endregion

//region REST API
single (named("RETROFIT")){
    Retrofit.Builder().client(get())
        .baseUrl("xxxxxxxxxx")
        .addConverterFactory(GsonConverterFactory.create())
        .build()
} bind Retrofit::class


//region REST API
single {
    val l = HttpLoggingInterceptor()
    l.level = HttpLoggingInterceptor.Level.BODY

    OkHttpClient.Builder().addInterceptor(l).build()
}


single {
    get<Retrofit>(named("RETROFIT")).create(XXXXService::class.java)
} bind XXXXService::class
//endregion

//region DB
single {
    MyAppDatabase.getDatabase(get()).someDao()
} bind SomeDao::class


//endregion

//region Util
single {
    DarkModeUtil()
} bind DarkModeUtil::class
//endregion

}

模块 2——viewModelModule(仅适用于视图模型)

// declare a module
val viewModelModule: Module = module {
    viewModel { HomeViewModel(get(), get(), get()) }

}

build.gradle(:app) KOIN 依赖项:

def koin_version = "3.1.6" (我尝试使用 3.2.2 和 3.2.1 并得到相同的错误)

// Koin main features for Android
implementation "io.insert-koin:koin-android:$koin_version"
// No more koin-android-viewmodel, koin-android-scope, koin-android-fragment
// Java Compatibility
implementation "io.insert-koin:koin-android-compat:$koin_version"
// Jetpack WorkManager
implementation "io.insert-koin:koin-androidx-workmanager:$koin_version"
// Navigation Graph
implementation "io.insert-koin:koin-androidx-navigation:$koin_version"

Z09721AB88E0A552087391BE1EEF0C6826Z ZD5171DF23601B19B19B7661200EC4914293Z PLAGIN版本:7.2.2 ZD5171DF23601B119B7601B119B766612121212121212333333333315149BIDAR版本

Caused by: org.koin.core.error.DefinitionOverrideException: 
Already existing definition for [Singleton:'java.lang.String'] at java.lang.String::_root_

该错误表明有许多没有限定符的String类型定义。

下面的这些行导致了问题。

single { BuildConfig.SOME_STRING1 }
single { BuildConfig.SOME_STRING2 }

如果要声明具有相同类型的定义,可以通过命名来声明它们。

single(named("SOME_STRING1")) { BuildConfig.SOME_STRING1 }
single(named("SOME_STRING2")) { BuildConfig.SOME_STRING2 }
single(named("SOME_STRING3")) { BuildConfig.SOME_STRING3 }
single(named("SOME_STRING4")) { BuildConfig.SOME_STRING4 }

您已经使用命名定义来创建Environment object。

single {
    Environment(get(named("SOME_STRING1")), 
                get(named("SOME_STRING2")), ...

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM