返回
在 KMM 中移植 Jetpack 架构组件:一次失败的尝试
Android
2024-01-19 17:22:24
在前面的文章中,我们讨论了 MVIKotlin 的优点和缺点。尽管它是一个功能强大的框架,但其复杂性可能会令人望而却步。因此,我决定手动将 Jetpack 架构组件 (AAC) 移植到 Kotlin 多平台移动 (KMM)。
Jetpack AAC 的魅力
Jetpack AAC 是一个由 Google 开发的库,提供了许多有用的组件来简化 Android 开发。这些组件包括:
- LiveData: 一个可观察的数据持有者,在数据更改时通知观察者。
- ViewModel: 一个存储与 UI 相关的可变状态和逻辑的类。
- Room: 一个用于 SQLite 数据库访问的 ORM(对象关系映射器)。
移植的挑战
乍一看,将 Jetpack AAC 移植到 KMM 似乎很简单。毕竟,Kotlin 是一种跨平台语言,理论上可以在 Android 和 iOS 上运行相同的代码。然而,我很快就遇到了几个挑战:
- 平台特定性: Jetpack AAC 依赖于一些 Android 特有的功能,例如
Context
和FragmentManager
。这些功能在 iOS 上不可用。 - 协程差异: Jetpack AAC 使用 Android 协程,而 KMM 使用 Kotlin 协程。虽然它们很相似,但存在一些细微差别,可能会导致移植问题。
- 测试复杂性: Jetpack AAC 组件是通过 Android 测试框架进行测试的,该框架在 KMM 中不可用。
我的尝试
尽管存在这些挑战,我仍决心将 Jetpack AAC 移植到 KMM。我创建了一个示例应用程序,其中包括一个带有 ViewModel 和 LiveData 的简单 UI。我修改了 Jetpack AAC 组件以使用 Kotlin 协程和模拟 Android 特定功能。
失败的原因
经过几个小时的努力,我无法让移植版本正常工作。我遇到了以下问题:
- 无法使用
Context
: 某些 Jetpack AAC 组件需要Context
,这是一个 Android 特定的类。我无法找到一种在 KMM 中模拟它的方法。 - 协程不兼容: Android 协程和 Kotlin 协程之间的差异造成了奇怪的行为,导致应用程序崩溃。
- 测试困难: 没有 Android 测试框架,我无法完全测试移植的组件。
结论
尽管付出了很多努力,但我未能成功将 Jetpack AAC 移植到 KMM。这表明在两个平台之间共享复杂的 Android 框架仍然是一个挑战。
替代方案
虽然 Jetpack AAC 无法直接移植到 KMM,但还有其他替代方案可以考虑:
- MVIKotlin: 如前一篇文章所述,MVIKotlin 是一个用于 KMM 的状态管理框架。它提供了与 Jetpack AAC 类似的功能,但更适用于多平台开发。
- 自定义解决方案: 也可以手动实现与 Jetpack AAC 类似的功能。这需要更多的工作,但可以提供更大的灵活性。
未来方向
KMM 生态系统仍在不断发展,将来可能会出现更多将 Android 框架移植到 KMM 的方法。与此同时,MVIKotlin 和自定义解决方案仍然是跨平台状态管理的可行选择。