gpt4 book ai didi

Kotlin MPP 期望/实际具有不同的签名

转载 作者:行者123 更新时间:2023-12-02 12:17:28 25 4
gpt4 key购买 nike

我有一个具有 Android 和 iOS impl(来自 3rd 方库)的管理器类。 “例如 MyManagerImpl()”。要构建第 3 方管理器,iOS 不需要 Context,但 Android 需要。我创建了一个通用类“MyManager”,它提取了需要在 commonMain 中调用的所有通用方法。

//commonMain
expect class MyManager {
fun method1()
companion object Factory {
makeManager(): MyManager
}
}

val manager = MyManager.Factory.makeManager() // ex intended usage

//androidMain
MyManagerImpl(context: Context) {
fun method1()
}

actual class MyManager private constructor(manager: MyManagerImpl) {
..
actual companion object Factory {
override fun makeManager(): MyManager {
return MyManager(MyManagerImpl(?how to get context?))
}
}
}

//iosMain
MyManagerImpl() {
fun method1()
}

actual class MyManager private constructor(manager: MyManagerImpl) {
..
actual companion object Factory {
override fun makeManager(): MyManager {
return MyManager(MyManagerImpl())
}
}
}
合并这两个实现的最干净的方法是什么?即使它们具有不同的构造函数依赖关系,是否也可以这样做?我们希望能够在 commonMain 中懒惰地构造类。这可能吗?

最佳答案

上下文的依赖注入(inject)
我对 SQLDelight SqlDriver 有同样的问题,这在 Android 上需要上下文,但在 iOS 上不需要。使用 Kodein-DI 或 Koin,这可以通过对上下文使用注入(inject)来完成,而无需任何困惑的静态变量。
基本概念是 expect/actual 用于创建特定于平台的工厂类( ManagerFactory )。
在 Android 上,actual ManagerFactory的实现将上下文作为参数,可以从 DI 上下文中获取(对于 Android 上的 Kodein-DI,请参见 androidXModule codedocs )。
一旦在 android 和 iOS DI 模块中定义了工厂类,就可以在公共(public)模块中注入(inject)/检索它,并检索到 MyManager实例绑定(bind)到 DI,并在需要的地方使用。
使用 Kodein-DI 看起来像这样:
常见的主要

//commonMain
expect class ManagerFactory {
fun createManager(): MyManager
}

val sharedModule = DI.Module("common") {
bind<MyManager>() with singleton { instance<ManagerFactory>().createManager() }

// now you can inject MyManager wherever...
}
安卓主程序
//androidMain
actual class ManagerFactory(private val context: Context) {
actual fun createManager(): MyManager = MyAndroidManagerImpl(context)
}

val androidModule = DI.Module("android") {
importAll(sharedModule)

// instance<Context> via androidXModule, see `MainApplication` below
bind<ManagerFactory>() with singleton { ManagerFactory(instance<Context>()) }
}

class MainApplication : Application(), DIAware {
override val di by DI.lazy {
// androidXModule (part of Kodein's android support library) gives us access to the context, as well as a lot of other Android services
// see https://github.com/Kodein-Framework/Kodein-DI/blob/7.1/framework/android/kodein-di-framework-android-core/src/main/java/org/kodein/di/android/module.kt
import(androidXModule(this@MainApplication))
importAll(androidModule)
}
}
iosMain
//iosMain
actual class ManagerFactory {
actual fun createManager(): MyManager = MyNativeManagerImpl()
}

val iosModule = DI.Module("ios") {
importAll(sharedModule)
bind<ManagerFactory>() with singleton { ManagerFactory() }
}

关于Kotlin MPP 期望/实际具有不同的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63020969/

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