KMM RSS 阅读器
这是一个开源、移动、跨平台应用程序,使用 Kotlin 多平台移动构建。
Compose 多平台实验
iOS 和桌面客户端作为实验性功能实现,可在此处查看。
桌面和 Web 实验
桌面和 Web 客户端作为实验性功能实现,可在此处查看。
项目结构
此存储库包含一个通用的 Kotlin 多平台模块、一个 Android 项目和一个 iOS 项目。通用模块通过 Gradle 多项目机制连接到 Android 项目。供 iOS 应用程序使用,共享模块编译为框架,通过内部集成 Gradle 任务公开给 Xcode 项目。该框架连接到 Xcode 项目,构建 iOS 应用程序。
您可以通过使用 KMM 插件项目向导或克隆基本示例项目来实现相同的结构。
架构
Kotlin 多平台移动是一种灵活的技术,允许您只共享想要共享的内容,从核心层到 UI 层。
此示例演示了不仅共享应用程序的数据和域层,还共享应用程序状态:
共享数据和域层
有两种类型的数据源。网络服务用于获取 RSS 源更新,而本地存储用于缓存源,这使得离线使用应用程序成为可能。Ktor HTTP 客户端用于发出 API 请求。Kotlinx.serialization用于序列化源数据并使用 MultiplaformSettings在本地存储。此逻辑在 com.github.jetbrains.rssreader.core
包的共享模块中组织。
共享应用程序状态
使用 Redux 模式来管理应用程序状态。简化的 Redux 架构在共享模块中实现。Store
类分派用户或异步工作产生的 操作,并生成新状态。它存储实际的 状态,并通过 Kotlin 的 StateFlow
促进对状态更新的订阅。为了提供有关状态更新的其他信息,Store
类还生成 影响,例如可以用于通过警报显示此信息。此逻辑在 com.github.jetbrains.rssreader.app
包的共享 KMM 模块中组织。
本地 UI
UI 层完全采用本地实现,使用 SwiftUI 实现 iOS,使用 Jetpack Compose 实现 Android,使用 Compose Multiplatform 实现桌面,使用 React.js 实现 Web 浏览器。
**在 iOS 端,**KMM 库中的 Store
被包装到 ObservableObject
中,并将状态实现为 @Published
包装属性。这会在共享模块中的分派操作产生新状态后发布更改。该存储作为 Environment Object
注入到应用程序的根视图中,并可从应用程序的任何位置轻松访问。SwiftUI 在渲染传递期间执行所有方面的差异比较。
为了订阅状态更新,简单包装器被用作。此包装器允许您提供一个回调,该回调将在每次发出新值(在本例中为状态)时被调用。
使用的多平台功能
✅ 平台特定 API 使用。 RSS 源通常只支持 XML 格式。kotlinx.serialization
库目前不支持解析 XML 数据,但无需实现自己的解析器。相反,使用平台库(XmlPullParser
用于 Android, NSXMLParser
用于 iOS)。在 commonMain
源集中声明通用 FeedParser
接口。平台实现位于相应的 iOSMain
和 AndroidMain
源集中。它们通过 create
工厂方法(在 RSSReader 类伴生对象中声明)注入到 RSSReader 类(KMM 模块入口点)中。