Constructor que toma el constructor plotble en la class derivada de kotlin

Esta es una continuación de una pregunta que hice antes. Estoy usando el complemento Android Parcelable de https://github.com/nekocode/android-plotble-intellij-plugin-kotlin Siguiendo la sugerencia de Bennyl, cambié el código generado para que los constructores

class ChessClock(context:Context) : TextView(context), Parcelable { lateinit var player:String constructor(context:Context, p:String, angle:Float) : this(context) { player = p rotation = angle } } 

y esto eliminó los errores de syntax que había preguntado. Ahora tengo otro problema que pasé por alto al principio.

El complemento generó este código para writeToParcel :

 override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeString(player) parcel.writeFloat(rotation) parcel.writeLong(mTime) parcel.writeInt(mState) } 

y este constructor:

 constructor(parcel: Parcel) :this() { player = parcel.readString() rotation = parcel.readFloat() mTime = parcel.readLong() mState = parcel.readInt() } 

(En realidad, agregué las líneas con rotation, pero eso no es importante).

Ahora, el constructor no comstackrá. this está subrayado y veo la información sobre herramientas enter image description here Esperaría ver algo así como,

 constructor(parcel: Parcel) :this(context, parcel.readString(), parcel.readFloat()) { mTime = parcel.readLong() mState = parcel.readInt() } 

pero si bash eso, aparece el post "No se puede acceder al context antes de que se haya llamado al constructor de la superclass". Soy bastante nuevo en kotlin (y android) y no entiendo lo que está sucediendo aquí. Intenté invocar super , pero me dice que se espera una llamada al constructor primario. También he intentado invocar TextView () pero me dice que se espera una llamada a this o super .

No veo que haya una forma de escribir el context en el package (y no estoy seguro de lo que esto significaría).

¿Puede decirme cómo debe modificarse el código y, lo que es más importante, puede explicar por qué?

context debe ser suministrado para llamar a los constructores this(context,...) . Pero, no puede cambiar su constructor(parcel: Parcel) al constructor(context: Context, parcel: Parcel) porque Parcelable requiere el `constructor (package: Parcela)

¿Que esta pasando? Su class se deriva de TextView que requiere un Context para crear instancias. Tu constructor principal está haciendo eso …

 class ChessClock(context: Context) : TextView(context) ... 

La documentation dice …

Si la class tiene un constructor primario, el tipo base puede (y debe) inicializarse allí mismo, utilizando los parameters del constructor primario.

Ya que ha elegido usar un constructor primario, la class base debe ser inicializada por ese constructor, y los constructores secundarios se separan de la primaria.

  constructor(context:Context, p:String, angle:Float) : this(context) ... // notice how the secondary constructor has the context with which to // call the primary constructor 

El error que está viendo se debe a que el segundo constructor secundario no proporciona un context al constructor al que está llamando (está llamando al primer constructor secundario).

  constructor(parcel: Parcel) :this(context, parcel.readString(), parcel.readFloat()) ... // compiler error because "context" has no source, there is no // parameter "context" being supplied 

Más importante aún , el constructor Parcel fue agregado por la herramienta Parcelable Plug-in cuando agregó la Interfaz Parcelable a la inheritance ( ver el ejemplo de una implementación Parcelable ). Y, como tal, el método Parcelable.Creator (la Interfaz de Parcelable.Creator requerida) espera encontrar un constructor que solo tome una Parcel . Es posible que deba ajustar su layout porque un Context no es serializable y, por lo tanto, no debe (no puede) colocarse en un Parcel . Podrías mirar el código CREATOR y ver cómo modificar eso, pero recomendaría un cambio de layout.

La "Mejor práctica" es separar su lógica empresarial de su lógica de UI. Aquí ha vinculado su ChessClock a un object de interfaz de usuario TextView . Me suena a un "ChessClock" como UI, así que tal vez necesites una class ChessClockData para pasarla como Parcelable lugar de la IU del reloj.

  • Beneficios de LINQ sobre el método funcional chaines
  • Kotlin: método @JvmStatic NoClassDefFoundError / ClassNotFoundException durante la testing unitaria
  • ¿Cuáles son los casos de uso de las properties en línea de Kotlin?
  • Gradle Project Sync falló, Kotlin
  • No se puede hacer que el nodo se centre en un StackPane con TornadoFX
  • variable de reference de kotlin no resuelta
  • Spring Boot no actualiza el html estático (con Kotlin / Intellij)
  • Obtiene N últimos objects emitidos por observables en RxJava2
  • ¿Por qué no puedo referirme a un object nested de val o typealias que se refiere a un object?
  • (Kotlin) propiedad tardía 'VAL variable' no se ha inicializado
  • En Kotlin, ¿cómo extiendo una class que tiene múltiples constructores?