首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin-parcelize插件和合成绑定

Kotlin-parcelize插件和合成绑定
EN

Stack Overflow用户
提问于 2021-12-04 18:14:20
回答 1查看 132关注 0票数 1

我们是一家拥有10+应用程序的公司,所有应用程序都使用10+内部SDK,所有这些都是在kotlin-android-extensions gradle插件的辉煌时期编写的。我们在很大程度上依赖于@Parcelize和合成绑定(我们所有的视图都是用它编写的)。

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

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

EN

回答 1

Stack Overflow用户

发布于 2021-12-04 19:47:44

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

老式方法

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

序列化到JSON

对于那些不起作用的,你可以提供以下可打包的实现,它将是通用的,并且可以绕过代码库:

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

代码语言:javascript
复制
inline fun <reified T> writeToParcel(out: Parcel, data: T) {
   val jsonString = Json.encodeToString(data)
   out.writeInt(jsonString.length)
   out.writeByteArray(jsonString.toByteArray())
}

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

代码语言:javascript
复制
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实现那么快,但是,嘿,它是有效的。

旁注

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70228239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档