Il y a deux modules dans mon Android, module d'application et module lib.
Ces deux modules ont besoin de Koin pour D.I., donc j'appelle startKoin
dans MyApplication
class dans le module app, et IninKointContentProvider
dans le module lib comme ci-dessous.
// app module
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin(this, modules1)
}
}
// lib module
class InitKoinContentProvider : ContentProvider() {
override fun onCreate(): Boolean {
startKoin(context.applicationContext, modules2)
return true
}
}
Ensuite, l'application s'est bloquée et a affiché ce message
Caused by: org.koin.error.BeanOverrideException: Try to override definition with Single [class='Android.content.Context'], but override is not allowed. Use 'override' option in your definition or module.
Je suppose que startKoin
ne peut être appelé qu'une seule fois.
La solution que j'ai trouvée consiste à fusionner deux modules koin puis à appeler startKoin
dans MyApplication
, mais je n'aime pas ça. Le module Lib peut être importé par un autre projet Android qui n'utilise pas de koin, dans ce cas, je pense qu'il est préférable d'appeler startKoin
dans InitKoinContentProvider
.
Une solution à ce problème ?? Merci!
TL; DR Utilisez les méthodes single/factory
Avec override
param défini sur true
lorsque vous fournissez vos dépendances qui remplacent celles fournies par les modules chargés auparavant.
single<Manager>(override = true) { TestManager() }
J'ai rencontré un problème similaire lorsque j'ai essayé de remplacer l'une des dépendances à des fins de test d'interface utilisateur. Lorsque je configure dans Application.onCreate()
:
startKoin {
module {
single { Printer() }
}
}
puis dans before
méthode de test:
loadKoinModules(module {
single<Printer> { TestPrinter() }
})
Je reçois une exception d'exécution pendant le test: org.koin.core.error.DefinitionOverrideException: Already existing definition or try to override an existing one
Et la solution est de montrer à Koin que vous intentionnellement remplacez cette dépendance en utilisant override
param de la fonction single
comme ça:
loadKoinModules(module {
single<Printer>(override = true) { TestPrinter() }
})