当前位置: 首页 > article >正文

Kotlin MultiPlatform 跨平台版本的记账 App

前言


一刻记账 KMP (Kotlin MultiPlatform) 跨平台版本今天终于把 Android 和 iOS 进度拉齐了.

之前只有纯 Android 的版本. 最近大半年有空就在迁移代码到 KMP 上

中间学了 iOS 基础知识. xcode 的使用. 跨平台的架构的搭建… 感觉经历了很多很多. 一把辛酸泪

迁移的心路历程

迁移到 KMP 的过程中. 最大的问题是各种三方库的迁移.

比如:

  • SharedPreference --> DataStore

  • Room 数据库 --> Room 跨平台版本

    • 跨平台版本比 Android 版本少一些功能并且有 bug
  • Retrofit --> Ktorfit

  • OkHttp --> ktor

  • Gson --> Kotlin Serialization

  • Java Date --> Kotlin DateTime

  • KComponent 路由 --> 自定义的 KRouter

  • 还有各种库的 IOS 端的实现

    • 扫码
    • 图片拾取

KMP 的优点

  • 语言 Kotlin 和 Compose UI 是我目前用过最好的语言和 UI 工具.
    • 特别是 Kotlin 语言, 真的棒!!!
  • 迁移的过程中. 由于我学习 Kotlin 很早. 所以迁移的时候, 80% 以上的 Kotlin 代码都能直接复用
  • Compose 也是学习的比较早. 所以 Compose 代码几乎 99% 都是直接可以用的.
  • Android 模块中可以直接访问到共享的 Shared 模块.
  • 平台的特性可以直接在 iOSMain 模块或者 appleMain 模块使用 Kotlin 代码直接调用到 iOS 系统代码
  • KMP 跨平台的方式相比其他语言来说更加的方便
    • 使用 expect 在 共享层声明, 在各个实现层就可以使用 actual 进行实现





KMP 的缺点

  • 我感觉在 IOS 端的支持不是很好.
    • 比如有些功能需要写成插件. 但是 iOS 端的实现我得使用 Kotlin 代码去调用 Swift 的库. 虽然官方对 Apple 几乎所有的系统库都支持调用. 但是调用的方法和参数和直接写 Swift 代码还是挺不一样的. 我甚至有时候都看着搜索出来的 Swift 实现. 我也没法翻译成 Kotlin 进行调用.
    • 还有些 Swift 的 Extend 扩展, 在 iOSMain 模块或者 appleMain 模块是没办法调用到的. 这让我很烦恼. 比如 Swift 代码中的 CIFilter.qrCodeGenerator() 我使用 Kotlin 代码就没办法直接调用到. 因为 CIFilter.qrCodeGenerator() 方法是一个扩展方法
    • iOS 端的调试比较困难. 至少我现在没有调试的办法. 我说的主要是调试平台共用的部分的代码.
    • iOS 的运行速度好像不是很高. 比如我打印一个 Error, iOS 平台会卡住. 虽然我 Release 不打, 但是卡我 debug 包我也难受
  • KMP 的生态还不如 Flutter. 生态还不成熟表示我很多库有时候需要自己实现几个端的. 开发效率会降低
  • 鸡肋的热重载功能
    • 目前据我所知, 热重载仅支持 Desktop 的 Target. hot-load
    • 并且我使用下来, 和我重启一遍 Desktop App 没啥两样啊. 速度贼慢

写在最后

希望 KMP 越来越好~~~~~~~

另外我的 一刻记账 App 也是一个 KMP 跨平台的尝试. 希望大家感兴趣的下载看看. 下载注册即送会员哦

KMP 迁移之前的开源版本在这 纯 Android 一刻记账开源版本

http://www.lryc.cn/news/2385460.html

相关文章:

  • PIO 中的赋值魔术,MOV 指令
  • [docker]更新容器中镜像版本
  • 第十七次CCF-CSP算法(含C++源码)
  • 打造一个支持MySQL查询的MCP同步插件:Java实现
  • 黑马k8s(十五)
  • Axure项目实战:智慧运输平台后台管理端-订单管理1(多级交互)
  • 解决 cursor 中不能进入 conda 虚拟环境
  • 微信小程序请求扣子(coze)api的例子
  • C++ 实现二叉树的后序遍历与中序遍历构建及层次遍历输出
  • 基于大模型的髋关节骨关节炎预测与治疗方案研究报告
  • qiankun解决的问题
  • JavaScript从入门到精通(一)
  • 快速失败(fail-fast)和安全失败(fail-safe)的区别
  • 虚拟环境中的PyQt5 Pycharm设置参考
  • AI 笔记 - 模型优化 - 注意力机制在目标检测上的使用
  • AUTOSAR图解==>AUTOSAR_SRS_LIN
  • UML 时序图 使用案例
  • 华为昇腾使用ollama本地部署DeepSeek大模型
  • 多态的总结
  • Windows 高分辨率屏幕适配指南:解决界面过小、模糊错位问题
  • tvalid寄存器的理解
  • C++八股 —— 手撕定时器
  • K8S-statefulset-mysql-ha
  • 【方案分享】展厅智能讲解:基于BLE蓝牙Beacon的自动讲解触发技术实现
  • web常见的攻击方式有哪些?如何防御?
  • 力扣:《螺旋矩阵》系列题目
  • 发电厂进阶,modbus TCP转ethernet ip网关如何赋能能源行业
  • 深入了解linux系统—— 操作系统的路径缓冲与链接机制
  • Ansible快速入门指南
  • 华为2025年校招笔试真题手撕教程(一)