包裹:无法编组价值

时间:2017-08-23 13:05:17

标签: android kotlin anko

我正在将Kotlin与Anko一起使用,我想向其他活动发送一个玩家列表。

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

init {
    this.score = 0
 }
}

我的活动:

 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:无法编组值   com.yasin.myapp.Player@4e3940e

我认为我的班级球员有问题,但我不知道是什么。我正在使用kotlin版本1.1.4。有人可以帮帮我吗?

4 个答案:

答案 0 :(得分:4)

您的课程应该实现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实现所需的样板代码,但是每次更改类中的任何属性时都应该记住更新实现代码。

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

答案 1 :(得分:0)

您的课程必须是ParcelableSerializable。您可以使用jet-brains plugin来生成实现(或者您可以使用实验性功能Parcelize)。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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