Error: No se puede acceder al miembro de la instancia... en un inicializador

Resuelto Cassergio asked hace 3 años • 5 respuestas

¿Por qué este código?

class _SequentialTextPageState {
  String jsonTextPref = 'seqtext';
  int jsonTextSuff = 10;
  String jsonText = jsonTextPref + jsonTextSuff.toString();
}

generar estos errores?

Error: The instance member 'jsonTextPref' can't be accessed in an initializer.

Error: The instance member 'jsonTextSuff' can't be accessed in an initializer.

¿Me parece que la concatenación entre Stringy intes correcta?

Cassergio avatar Jan 07 '21 01:01 Cassergio
Aceptado

Dart inicializa objetos en múltiples fases . La inicialización de miembros directamente ("inicializadores de campo") ocurre temprano en la inicialización del objeto, antes de thisque sea válida, por lo que esa fase no puede inicializar miembros que dependen de otras partes del objeto.

Dart proporciona varias formas de inicializar miembros , por lo que si un miembro necesita depender de otro, puede inicializarlo en una fase posterior utilizando un mecanismo diferente. Por ejemplo, podrías hacer uno de:

  • Agregue la latepalabra clave para que el miembro dependiente se inicialice de forma diferida.
  • Mueva la inicialización del miembro dependiente al cuerpo del constructor.
  • En el caso de un Statesubtipo de Flutter, podrías inicializar el miembro dependiente en su initStatemétodo, lo cual en algunos casos es más apropiado .

Tenga en cuenta que, en algunos casos, también puede considerar reemplazar la variable miembro con un captador de solo lectura . Por ejemplo, en tu caso, quizás podrías utilizar:

String get jsonText => jsonTextPref + jsonTextSuff.toString();

Eso sería apropiado si siemprejsonText dependiera de y , nunca necesitaría tener un valor independiente, y si es aceptable devolver un nuevo objeto cada vez que se accede a él.jsonTextPrefjsonTextSuffjsonText

jamesdlin avatar May 21 '2021 20:05 jamesdlin

Dart no permite que los inicializadores de campo hagan referencia al objeto en sí. Los campos siempre deben inicializarse completamente antes de otorgar acceso al objeto que comienza a crearse. Los inicializadores solo pueden acceder a variables estáticas y de nivel superior, no a variables de instancia en el objeto mismo.

Con seguridad nula, se le permitirá escribir late String jsonText = this.something + this.other;. Ese campo no se inicializará hasta que se lea o escriba por primera vez, lo que necesariamente ocurre después de que se haya creado el objeto.

lrn avatar Jan 07 '2021 22:01 lrn