MP - Realm (not just realm)

参考多方文档-提供最佳的实践方案(为什么是它)

如果你采用的是 方案二 (即在 commonMain 中直接用 implementation("io.realm.kotlin:library-base")),但又想在 jsMain 中完全禁止 Realm 的使用,你需要处理两个层面的问题:


🚫 问题概述

  1. commonMain 中使用 implementation("io.realm.kotlin:library-base"),意味着 所有平台(包括 JS)都会尝试解析该依赖。

  2. 但是 Realm Kotlin 不支持 JS 平台(只支持 JVM 和 Native),所以会导致:

    • 编译错误:JS 无法找到 Realm 的实现
    • 运行错误:JS 没有该库的支持,即使编译通过也会运行崩溃

✅ 最佳做法(禁止 JS 平台使用 Realm)

🔧 1. 使用 expect/actual 分离平台实现(推荐方式)

这是官方推荐的 KMP 设计方式 ------ 接口放在 commonMain,平台实现放在 Android/iOS,JS 中不提供实现。

kotlin 复制代码
sourceSets {
  val commonMain by getting {
    dependencies {
      // 这样做jsMain还是会参与编译(正确的做法是注销掉,保持个平台持有(否则在编译时就会报错⚠️))
      compileOnly("io.realm.kotlin:library-base:1.16.0")
    }
  }
  val androidMain by getting {
    dependencies {
      implementation("io.realm.kotlin:library-sync:1.16.0")
    }
  }
  val iosMain by getting {
    dependencies {
      implementation("io.realm.kotlin:library-base:1.16.0")
    }
  }
}

那么问题来了(怎么设计统一调度呢????)

✅ 结构:

kotlin 复制代码
interface LocalResponse {
    var id: String
    var idToken: String
    var refreshToken: String
    var expiresIn: String
    var localId: String
    var email: String
}

expect fun createLocalResponse(): LocalResponse


interface LocalRealm {

    suspend fun addUser(user: LocalResponse)

    suspend fun deleteUserById(id: String)

    suspend fun updateUserEmail(id: String, newEmail: String)

    suspend fun getAllUsers(): List<LocalResponse>

    suspend fun getUserById(id: String): LocalResponse?

    suspend fun getUsersByName(email: String): List<LocalResponse>
}

expect fun createRealmManager(): LocalRealm

统一调度(直接使用:createLocalResponse ,createRealmManager) ............(^-^)

📌 这样 Realm 的依赖只存在于 android/ios 的 implementation 中,JS 不需要引入 Realm,安全且清晰。


❌ 2. 无法用编译选项跳过 JS 的 Realm 引入

如果你使用的是方案二,在 commonMain 直接使用 implementation("io.realm.kotlin:library-base"),那么 Gradle 会强制所有平台都解析这个依赖 ------ 无法通过 jsMain 禁用。


🚫 方案二无法实现你要的目标

目标 方案二能实现吗?
JS 完全排除 Realm(不加载、不编译、不打包) ❌ 无法做到
Realm 仅存在于 Android / iOS 平台 ❌ 不可能完全排除
JS 编译时和运行时都会报错 不兼容 ⚠️ 高风险

✅ 正确做法总结

推荐做法 说明
expect/actual 模式 JS 平台避免依赖 Realm,同时为其他平台提供实际实现
仅在 androidMain/iosMain 引入 Realm 避免 commonMain 的 implementation("realm")
JS 提供空实现或报错实现 提示用户 JS 不支持 Realm 的操作

🔚 结论:

为了在 jsMain 中完全禁止 Realm 的使用,你必须避免在 commonMain 中使用 implementation 引入 Realm 。 👉 请改用 方案一(平台分离 + expect/actual)实现你的目标。


  • Realm 的平台实现
  • JS 抛出异常实现(可选,根据Js支持部署和定义)
  • 构建配置结构整理
相关推荐
千里马学框架3 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone3 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
不是株3 天前
零到全栈(网页从哪来,服务器怎么架)
全栈
致远ccc3 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
茶底世界之下3 天前
为什么预览、录制、离线导出不能共享同一个背压策略?
ios·swift
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui