【问题标题】:Creating a Parcelable class with a secondary constructor that takes a list as parameter in Kotlin在 Kotlin 中使用将列表作为参数的辅助构造函数创建 Parcelable 类
【发布时间】:2017-12-19 21:19:18
【问题描述】:

我开始使用 Kotlin 并尝试实现一个 parcelable 对象,该对象接收字符串列表作为辅助构造函数的参数。但是,我收到了错误:

在调用超类构造函数之前无法访问“

这是我的代码:

class StringChecker(val stringList : List<String>) : Parcelable {

    var mStringList = stringList

    constructor(parcel: Parcel) : this(parcel.readStringList(mStringList))

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeStringList(mStringList)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<StringChecker> {
        override fun createFromParcel(parcel: Parcel): StringChecker {
            return StringChecker(parcel)
        }

        override fun newArray(size: Int): Array<StringChecker?> {
            return arrayOfNulls(size)
        }
    }

}

我知道在创建对象之前我不能调用成员变量 mStringList,这当然是有道理的,但是 readStringList 方法需要一个字符串列表参数。我该如何解决这个问题?这是我的设计 parcelable 与将列表作为构造函数参数的问题吗?

【问题讨论】:

    标签: android list kotlin parcelable


    【解决方案1】:

    您不能在辅助构造函数中使用字段。使用createStringArrayList() 而不是readStringList(mStringList)

    constructor(parcel: Parcel) : this(parcel.createStringArrayList())
    

    【讨论】:

      【解决方案2】:

      对于这种特殊情况,你可以写成

      constructor(parcel: Parcel) : this(mutableListOf<String>()) {
        parcel.readStringList(mStringList)
      }
      

      但我更愿意让它成为工厂方法,而不是构造函数。特别是因为无论如何您都需要它作为工厂方法。即:

      companion object CREATOR : Parcelable.Creator<StringChecker> {
          override fun createFromParcel(parcel: Parcel): StringChecker {
              val stringList = mutableListOf<String>()
              parcel.readStringList(stringList)
              return StringChecker(stringList)
          }
      
          override fun newArray(size: Int): Array<StringChecker?> {
              return arrayOfNulls(size)
          }
      }
      

      更多:您可能不希望同时拥有 stringListmStringList 属性,就像您的代码当前所做的那样。如果需要var,只需使用class StringChecker(var stringList : List&lt;String&gt;)。也可以看看@Parcelize

      【讨论】:

      • 这很有意义。会试试这个。
      猜你喜欢
      • 1970-01-01
      • 2022-11-26
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多