gpt4 book ai didi

android - 如何在多个模块中使用 Koin?

转载 作者:行者123 更新时间:2023-12-02 11:55:46 39 4
gpt4 key购买 nike

我的android项目中有两个模块,app模块和lib模块。

这两个模块都需要 Koin 进行 D.I.,所以我调用 startKoinMyApplication应用模块中的类和IninKointContentProvider在 lib 模块中,如下所示。

// 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
}
}

然后应用程序崩溃并显示此消息
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.

我猜 startKoin只能调用一次。

我找到的解决方案是合并两个 koin 模块,然后调用 startKoinMyApplication ,但我不喜欢它。 Lib 模块可能由其他不使用 koin 的 android 项目导入,在这种情况下,我认为调用 startKoinInitKoinContentProvider更好。

这个问题有什么解决办法吗??谢谢!

最佳答案

我找到了受@laalto 回答启发的最佳解决方案,谢谢!

升级到 koin 2.0,然后使用 KoinApplication 和自定义 KoinComponent 来创建一个隔离的 koin 上下文,它可以让 lib 模块使用 koin 而不需要 app 模块的任何初始化调用,仍然在 ContentProvider 中启动 koin。整个代码可能如下所示。

// app module
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@MyApplication)
modules(module{
viewModel { MainViewModel() }
})
}
}
}

class MainActivity: AppCompactActivity() {
private val viewModel: MainViewModel by viewModel()
}



// lib module
internal object MyKoinContext {
lateinit var koinApplication: KoinApplication
}

interface MyKoinComponent : KoinComponent {
override fun getKoin(): Koin {
return MyKoinContext.koinApplication.koin
}
}

class InitKoinContentProvider : ContentProvider() {
override fun onCreate(): Boolean {
MyKoinContext.koinApplication = koinApplication {
androidContext(context.applicationContext)
modules(module{
viewModel { FooViewModel() }
})
}
return true
}
}

class FooActivity: AppCompactActivity(), MyKoinComponent {
private val viewModel: FooViewModel by viewModel()
}

引用:
https://insert-koin.io/docs/2.0/documentation/reference/index.html#_koin_context_isolation

关于android - 如何在多个模块中使用 Koin?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56289929/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com