【问题标题】:Parcelable isn't working properly in kotlinParcelable 在 kotlin 中无法正常工作
【发布时间】:2021-03-14 07:09:38
【问题描述】:

我将sendDataStartActivity发送到ResultActivity

val sendData = SendData(10, "xyz", "yss")
sendData.e = 933
sendData.f = "hello"
sendData.g = 39

// Log.d("A", "${sendData.toString}")
val intent = Intent(this@StartActivity, ResultActivity::class.java)
intent.putExtra(RESULT_DATA, sendData)
startActivity(intent)
sendData = intent.extras!!.getParcelable(RESULT_DATA)
// Log.d("B", "${sendData.toString}")

模型类如下所示。

@Parcelize
data class SendData(var a: Int, var b: String, var c: String) : Parcelable {
    var e: Int? = null
    var f: String? = null
    var g: Int? = null
    
    var isClicked = false

    override fun toString(): String{
        return JsonUtil.toJson(this) // custom util
    }
}

但是当我检查 Log-A 时,Log-B。

// Log-A
{
   "a": 10,
   "b": "xyz",
   "c": "yss",
   "e": 933,
   "f": "hello",
   "g": 39,
   "isClicked": false
}

// Log-B
{
   "a": 10,
   "b": "xyz",
   "c": "yss",
   "isClicked": false
}

因此,定义为 Nullable 的成员在传递后为空。 这段代码有什么问题?

【问题讨论】:

    标签: android kotlin android-intent parcelable data-class


    【解决方案1】:

    @Parcelize 的工作方式是它只序列化/反序列化主构造函数中的属性。您只在主构造函数中声明了属性abc。因此,编译器只会将abc的值插入到生成的Parcel中,当然,只有这些值会在接收端解组。

    您需要将其他属性添加到主构造函数中,或者自己实现Parcelable 接口,而不是使用@Parcelize

    https://joaoalves.dev/posts/kotlin-playground/parcelable-in-kotlin-here-comes-parcelize/

    另请参阅question 以及答案中的各种建议

    【讨论】:

      【解决方案2】:

      @Parcelize 要求在主构造函数中声明所有序列化属性。该插件使用在类主体中声明的支持字段对每个属性发出警告。此外,如果某些主要构造函数参数不是属性,则不能应用 @Parcelize。

      来自https://developer.android.com/kotlin/parcelize 您必须将 e、f 和 g 变量声明移动到主构造函数 你的模型代码可以是这样的:

      @Parcelize
      data class SendData(var a: Int, var b: String, var c: String, var e: Int? = null, var f: String? = null, var g: Int? = null) : Parcelable { 
          var isClicked = false
      
          override fun toString(): String{
              return JsonUtil.toJson(this) // custom util
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 2015-12-12
        • 2021-11-25
        相关资源
        最近更新 更多