【问题标题】:How to deal with annotations in kotlin multiplatform data classes?如何处理 kotlin 多平台数据类中的注释?
【发布时间】:2020-09-01 12:48:34
【问题描述】:

最近我将我的 KMP 项目拆分为全栈项目和一个核心库(主要由常见的数据类组成),并发现我需要在现在定义的数据类之一上使用 JVM 库中的注释在一个公共模块中。

似乎无法在 Kotlin 通用代码中使用 Java 库中的注解。

有哪些可能的方法来解决此类问题,最好避免通过 expect 声明此类数据类,然后在 actual 平台上重复其实现但使用不同的注释?

【问题讨论】:

    标签: kotlin-multiplatform


    【解决方案1】:

    你可以expect/actual自己的注解。

    说,如果你有这样的 JVM 注释,@Entity

    你可以拥有像src/commonMain/Entity.kt这样的文件

      expect annotation class Entity()
    

    在src/androidMain/Entity.kt

      actual typealias Entity = package.to.Entity
    

    在src/iosMain/Entity.kt

      actual annotation class Entity()
    

    现在你可以继续在你的公共代码中使用它

    @Entity
    data class Movies(
      val title: String,
      val release: Int
    )
    

    【讨论】:

    • 好的,但是如果我在 JVM 和 JS(不同的库)上有不同的注解签名怎么办。如何将公共注解统一为 typealias 不会简单地做到这一点?
    • 实际上,如果您有不同的目标,typealias 就可以解决问题。但是为了帮助你更多,我可能应该知道更多。你对 jvm 和 js 有两个不同的注解吗? o 您是否有一个具有不同实现的注释?如果它是一个具有不同实现的注释,那么 typealias 就可以解决问题
    • 好吧,我的数据类有一些多态性,这需要一些注释来支持我必须使用的序列化库。目前有 Jackson for JVM 和 Kotlin Serialization on JS。它们有不同的 API。我还不确定如何处理 Korlin 序列化。
    • 迟到的回复:Kotlin 序列化在 JVM 和 JS 上都有效。最好的办法是随它去。好消息是它现在甚至稳定了。在生产环境中运行 1.0.1
    猜你喜欢
    • 2020-05-04
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2023-03-04
    相关资源
    最近更新 更多