2017-12-18 18 views
0

Kotlin을 시작하고 보조 생성자의 매개 변수로 문자열 목록을받는 parcelable 개체를 구현하려고합니다. 그러나, 나는 오류 받고 있어요 : 그러나,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를 호출 할 수 있음을 이해하고 물론 그 의미가 있습니다 : 여기

Cannot access '< this >' before super class constructor has been called

은 내 코드입니다 readStringList 메소드에는 문자열 목록 매개 변수가 필요합니다. 이 문제를 어떻게 해결할 수 있습니까? 이 내 디자인 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<String>)을 대신 입력하십시오. 또한 @Parcelize을보십시오.

+0

많은 의미가 있습니다. 이것을 시도 할 것이다. – alexm