Error: No se puede acceder al miembro de la instancia... en un inicializador
¿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 String
y int
es correcta?
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 this
que 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
late
palabra 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
State
subtipo de Flutter, podrías inicializar el miembro dependiente en suinitState
mé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.jsonTextPref
jsonTextSuff
jsonText
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.