包裹:无法整理价值

Parcel: unable to marshal value

我正在将 Kotlin 与 Anko 一起使用,我想发送给另一个 activity 玩家列表。

class Player(var name: String?) {
var score: Int = 0

init {
    this.score = 0
 }
}

我的activity:

 class MainActivity: AppCompatActivity() {
         override fun onCreate(savedInstanceState: Bundle ? ) {
             btn.setOnClickListener {
                 val players = ArrayList <Player> ()
                 players.add(Player("John"))
                 players.add(Player("Jeff"))

                 startActivity <ScoreActivity> ("key" to players)
             }
         }
 }

当代码到达 startActivity 行时,出现此错误:

java.lang.RuntimeException: Parcel: unable to marshal value com.yasin.myapp.Player@4e3940e

我想我的 class 播放器有问题,但我不知道是什么。我使用的是科特林版本 1.1.4。有人可以帮助我吗?

您的 class 应该实现 Parcelable(或 Serializable,尽管 Parcelable 是 Android 上的建议实现)以便能够传递对象使用 Intent Activity。

使用 Kotlin 1.1.4 和 Android Extensions Plugin,您可以添加 @Parcelize 注释以获取 Parcelable 实现。

@Parcelize
class Player(var name: String?) : Parcelable {

// ...

参考blog post

此功能是实验性的,因此您在 build.gradle 文件中打开了一个实验性标志:

androidExtensions {
    experimental = true
}

另一种选择是使用 this plugin 生成 Parcelable 实现所需的样板代码,但您应该记得在每次更改 [=37= 中的任何属性时更新实现代码].

或者您可以编写自己的 Parcelable 实现。

您的 class 需要 ParcelableSerializable。有一个 jet-brains plugin 可用于生成实现(或者您可以使用实验性功能 Parcelize)。

Serializable 通常不那么复杂,可能就是您所需要的。

使用 Java Just Your Class 应该实现 Parcelable 和 whit 方法: writeToParcel(Parcel 包裹, int i)

对于使用 jetpack-compose 的任何人,此问题是由于 rememberSavable(),请使用 remember() 或将值存储在 viewModel