- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个具有 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
code 和 docs )。
一旦在 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/
我有 table 像这样 -------------------------------------------- id size title priority
我的应用在不同的 Activity (4 个 Activity )中仅包含横幅广告。所以我的疑问是, 我可以对所有横幅广告使用一个广告单元 ID 吗? 或者 每个 Activity 使用不同的广告单元
我有任意(但统一)数字列表的任意列表。 (它们是 n 空间中 bin 的边界坐标,我想绘制其角,但这并不重要。)我想生成所有可能组合的列表。所以:[[1,2], [3,4],[5,6]] 产生 [[1
我刚刚在学校开始学习 Java,正在尝试自定义控件和图形。我目前正在研究图案锁,一开始一切都很好,但突然间它绘制不正确。我确实更改了一些代码,但是当我看到错误时,我立即将其更改回来(撤消,ftw),但
在获取 Distinct 的 Count 时,我在使用 Group By With Rollup 时遇到了一个小问题。 问题是 Rollup 摘要只是所有分组中 Distinct 值的总数,而不是所有
这不起作用: select count(distinct colA, colB) from mytable 我知道我可以通过双选来简单地解决这个问题。 select count(*) from (
这个问题在这里已经有了答案: JavaScript regex whitespace characters (5 个回答) 2年前关闭。 你能解释一下为什么我会得到 false比较 text ===
这个问题已经有答案了: 奥 git _a (56 个回答) 已关闭 9 年前。 我被要求用 Javascript 编写一个函数 sortByFoo 来正确响应此测试: // Does not cras
所以,我不得不说,SQL 是迄今为止我作为开发人员最薄弱的一面。也许我想要完成的事情很简单。我有这样的东西(这不是真正的模型,但为了使其易于理解而不浪费太多时间解释它,我想出了一个完全模仿我必须使用的
这个问题在这里已经有了答案: How does the "this" keyword work? (22 个回答) 3年前关闭。 简而言之:为什么在使用 Objects 时,直接调用的函数和通过引用传
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: what is the difference between (.) dot operator and (-
我真的不明白这里发生了什么但是: 当我这样做时: colorIndex += len - stopPos; for(int m = 0; m < len - stopPos; m++) { c
思考 MySQL 中的 Group By 函数的最佳方式是什么? 我正在编写一个 MySQL 查询,通过 ODBC 连接在 Excel 的数据透视表中提取数据,以便用户可以轻松访问数据。 例如,我有:
我想要的SQL是这样的: SELECT week_no, type, SELECT count(distinct user_id) FROM group WHERE pts > 0 FROM bas
商店表: +--+-------+--------+ |id|name |date | +--+-------+--------+ |1 |x |Ma
对于 chrome 和 ff,当涉及到可怕的 ie 时,这个脚本工作完美。有问题 function getY(oElement) { var curtop = 0; if (oElem
我现在无法提供代码,因为我目前正在脑海中研究这个想法并在互联网上四处乱逛。 我了解了进程间通信和使用共享内存在进程之间共享数据(特别是结构)。 但是,在对保存在不同 .c 文件中的程序使用 fork(
我想在用户集合中使用不同的功能。在 mongo shell 中,我可以像下面这样使用: db.users.distinct("name"); 其中名称是用于区分的集合字段。 同样我想要,在 C
List nastava_izvjestaj = new List(); var data_context = new DataEvidencijaDataContext();
我的 Rails 应用程序中有 Ransack 搜索和 Foundation,本地 css 渲染正常,而生产中的同一个应用程序有一个怪癖: 应用程序中的其他内容完全相同。 我在 Chrome 和 Sa
我是一名优秀的程序员,十分优秀!