Kotlin-parcelize 插件和合成绑定

Posted

技术标签:

【中文标题】Kotlin-parcelize 插件和合成绑定【英文标题】:Kotlin-parcelize plugin and synthetic binding 【发布时间】:2022-01-10 15:27:07 【问题描述】:

我们是一家拥有 10 多个应用程序的公司,所有应用程序都使用 10 多个内部 SDK,所有这些都在 kotlin-android-extensions gradle 插件的辉煌时期进行了编码。我们严重依赖@Parcelize 和合成绑定(我们所有的视图都是用它编码的)。在较新版本的 Kotlin 中,此插件现已弃用,取而代之的是 kotlin-parcelize for @Parcelize 和 View Binding 作为合成绑定的替代品。

我们尝试将 Kotlin 版本从 1.4.10 升级到 1.6.0,同时仍然使用 kotlin-android-extensions 插件。我们突然报告了一个@Parcelize 错误here,在Kotlin 中修复1.5.0。除了修复不在 Kotlin 本身之外,它在 kotlin-parcelize 插件中。当然,当他们弃用 kotlin-android-extensions 时,后者不包含修复程序。所以简而言之,为了解决这个问题,我们必须使用kotlin-parcelize

知道kotlin-parcelize 不能与kotlin-android-extensions 一起使用(构建错误),并且将我们所有的视图从合成视图切换到视图绑定将是一项需要大量时间的工作,什么可以在这里做吗?我们真的希望继续使用合成绑定,同时能够将 Kotlin 升级到最新版本。

【问题讨论】:

有多少类受到影响?正如this comment 所指出的那样,如果没有太多,您可能只是手动实现Parcelable 我想说我们目前有大约 50-60 个类用 @Parcelize 注释,所以无论我们选择不使用 @Parcelize 还是合成绑定,都会有一些工作......而且我真的很喜欢@Parcelize 的简单,老实说我不想不用它。 “我会说我们目前有大约 50-60 个用 @Parcelize 注释的类”——但是,有多少给你错误?我对该错误报告的解释是它与泛型相关。 抱歉,我一开始没听懂。我记得有 7-8 个带有泛型的类给出了错误。我们没有尝试编译我们所有的 SDK,但我认为这个数字应该在 10 左右。所以是的,它确实是一个很好的解决方案,不会花费太多时间。也许我会试一试,没有人有更好的答案。您知道任何用于生成Parcelable 实现的好网站或插件吗?我看到有一个看起来不错的Android Studio插件。 我认为 parcelable.com 上曾经有一个,但它似乎已经消失了。如果你想要一个独立的库,有parceler.org,虽然它似乎会生成Java。 【参考方案1】:

看起来显而易见的选择是,您需要尽快从合成视图转移,尽管由于缺乏资源可能无法实现。

老派方法

解决 Parcelable 问题的一种解决方案是找出未正确打包的类,并以老式方式对它们进行序列化。

序列化为 JSON

我建议你看一下kotlinx-serialization 包,它非常便于读取和写入 JSON。

对于那些不起作用的,您可以提供以下可打包的实现,它是通用的并且可以在代码库中使用:

    确保您的类使用@Serializable 进行注释重要,此类注释来自kotlinx.serialization 包而不是java 包。

使用这个通用函数,您可以将任何@Serializable 对象写入包裹中。

inline fun <reified T> writeToParcel(out: Parcel, data: T) 
   val jsonString = Json.encodeToString(data)
   out.writeInt(jsonString.length)
   out.writeByteArray(jsonString.toByteArray())

使用另一个你应该能够反序列化这样的对象

inline fun <reified T> readFromParcel(input: Parcel): T 
  val size = input.readInt()
  val bytes = ByteArray(size)  input.readByte() 
  val jsonString = bytes.toString()
  return Json.decodeFromString<T>(jsonString)

您可以将它们扩展为Parcel 的函数以编写更少的代码。

这应该可以让您了解Parcelize 扩展存在问题的类;它不如适当的 Parcelable 实现快,但是,它可以工作。

旁注

请注意,代码已直接作为本文的答案编写,因此未经测试,某些部分可能需要修改。当然,查看kotlinx.serialization documentation 了解如何创建Json 编码器和解码器(相当简单)

【讨论】:

以上是关于Kotlin-parcelize 插件和合成绑定的主要内容,如果未能解决你的问题,请参考以下文章

大漠插件相同窗口可以绑定几次

大漠插件解除窗口绑定命令

Kotlin 快速实现序列化(Parcelable)

微信如何解绑京东账号

使用自定义模型绑定器的递归模型绑定

js绑定事件和解绑事件