我有一个Kotlin多平台项目,其中包含iOS,Android和Desktop,我想使用SQLDelight来存储数据.但我用科恩做调查员

因为我有几个平台,所以我做了commonMainstartKoin.

该文件包含期望值,该值将返回每个平台的SqlDriver,以及从commonMain与数据库通信所需的其余实现.

expect val dbModule: Module

val repoModel = module {
    single<DbRepository> {
        DbRepository(get<SqlDriver>())
    }
}

fun initKoin() = startKoin {
    modules(
        dbModule,
        repoModel
    )
}

我发现每个平台都有一个问题,所以我决定一次专注于一个平台.

Android平台的问题是你无法获得AndroidSqliteDriver所需的上下文.

actual val dbModule: Module = module {
    single<SqlDriver> {
        AndroidSqliteDriver(Kos.Schema, androidContext(), "Kos")
    }
}

对于Android,你需要上下文来初始化驱动程序,但你没有办法注入它.因为我是从commonMain启动Koin,我找不到一种方法从Application类获取Android上下文. 我试过这个方法:

class MyApp: Application() {
    override fun onCreate() {
        super.onCreate()
        startKoin {
            androidContext(this@MyApp)
        }
    }
}

也这样

class MyApp: Application() {
    override fun onCreate() {
        super.onCreate()
        koinApplication {
            androidContext(this@MyApp)
        }
    }
}

即使这样

class MyApp: Application() {
    override fun onCreate() {
        super.onCreate()
        loadKoinModules(
            module { 
                single { this@MyApp }
            }
        )
    }
}

我总是出错

原因:org. koin. core. error. KoinAppAlreadyStartedException:一个Koin应用程序已经启动

原因:org. koin. android. error. MissingAndroidContextException:无法解析上下文实例.请在KoinApplication配置中使用androidContext()函数.

如何获得android上下文为SQLDelight驱动程序与kmp使用Koin?

推荐答案

我试过几种方法... 唯一的方法就是把上下文手动输入Koin

@SuppressLint("StaticFieldLeak")
lateinit var androidContext: Context

actual val dbModule: Module = module {
    single<Context> { androidContext }
    single<SqlDriver> {
        AndroidSqliteDriver(ReminderDb.Schema, get(), "ReminderDb")
    }
}
class MyApp: Application() {
    override fun onCreate() {
        super.onCreate()
        androidContext = applicationContext
    }
}

Kotlin相关问答推荐

API迁移到Spring Boot 3后,Spring Security无法工作

Gradle Jooq配置自定义生成器

为什么onEach不是挂起函数,而Collect是?

如何在Spring Boot中注册新的集合工厂

有什么方法可以要求在 kotlin 中的类型参数上进行注释?

循环中的每个元素都应填充行中可用的所有可用空间

为什么在 Kotlin 中调用私有构造函数会导致错误为无法访问 是什么?

Jetpack Compose - 单击 LazyColumn 的项目时应用程序崩溃

使用 Kotlin 协程时 Room dao 类出错

Kotlin:如何在活页夹中返回正在运行的服务实例?

为什么 Dialog 没有 NavController [Missing]?

Kotlin默认使用哪种排序?

使用kotlinx协同程序测试中的类时出错

如何将命令行参数传递给Gradle Kotlin DSL

Kotlin的BiMap/2-way hashmap

Jetpack Compose-居中文本

如何计算Kotlin中的百分比

有没有办法在Kotlin中设置一个私有常量

Kotlin:获取文件的扩展名,例如.txt

如何在 Kotlin 中将串联转换为模板