我在KMM项目中使用Koin。在安卓系统上,它可以正常工作,但在iOS上,我必须为我想要注入的每个组件创建一个包装器,类似于这样(Logger组件为例(:
inline fun <reified T> getKoinInstance() =
object : KoinComponent {
val value: T by inject()
}.value
object LoggeriOS {
private val logger = getKoinInstance<Logger>()
fun logger() = logger
}
然后我可以在iOS上这样做:
let logger = LoggeriOS.shared.logger()
logger.i(msg: "Hello World")
问题:没有专门针对iOS的包装类,还有更好的方法吗?
您可以从kmm模块直接为Koin类提供扩展,然后在ios端直接使用它们。
步骤1定义内部kmm ios模块的扩展
val Koin.logger: Logger
get() = get() // second get() is from koin
步骤2
然后定义从ios端启动koin的方法,koin.swift文件并保存koin 的全局实例
func startKoin() {
let koinApplication = DependencyInjectionKt.doInitKoinIOS()
// _koin is Koin instance
_koin = koinApplication.koin
}
//koin is a global instance of Koin, use it to get dependencies
private var _koin: Koin_coreKoin? = nil
var koin: Koin_coreKoin {
return _koin!
}
步骤3然后在iosApp.swift文件
@main
struct iOSApp: App {
init() { startKoin() }
}
然后你可以在任何地方使用koin.swift的koin实例,就像这个一样
koin.logger // this will use the extension you defined in kmm module in first step and will provide you Logger