Me pregunto cuál es la forma recomendada de pasar datos a un widget con estado, mientras se crea.
Los dos estilos que he visto son:
class ServerInfo extends StatefulWidget {
Server _server;
ServerInfo(Server server) {
this._server = server;
}
@override
State<StatefulWidget> createState() => new _ServerInfoState(_server);
}
class _ServerInfoState extends State<ServerInfo> {
Server _server;
_ServerInfoState(Server server) {
this._server = server;
}
}
Este método mantiene un valor en ServerInfo
y _ServerInfoState
, lo que parece un poco derrochador.
El otro método es utilizar widget._server
:
class ServerInfo extends StatefulWidget {
Server _server;
ServerInfo(Server server) {
this._server = server;
}
@override
State<StatefulWidget> createState() => new _ServerInfoState();
}
class _ServerInfoState extends State<ServerInfo> {
@override
Widget build(BuildContext context) {
widget._server = "10"; // Do something we the server value
return null;
}
}
Esto parece un poco al revés, ya que el estado ya no se almacena _ServerInfoSate
en el widget, sino que lo hace.
¿Existe una buena práctica para esto?
ServerInfo(this._server);
Respuestas:
No pase parámetros para
State
usar su constructor. Solo debe acceder a estos utilizandothis.widget.myField
.No solo editar el constructor requiere mucho trabajo manual; no trae nada. No hay razón para duplicar todos los campos de
Widget
.EDITAR:
He aquí un ejemplo:
fuente
State
ya tiene acceso a todas las propiedades deStateful
mediante el uso delwidget
campo.void initState()
el estado para establecer el valor inicial. Marque esta opción de hilo C como ejemplo.La mejor manera es no pasar parámetros a la clase State usando su constructor. Puede acceder fácilmente en la clase estatal utilizando
widget.myField
.Por ejemplo
Pasa tus datos cuando navegas por la pantalla:
fuente
Otra respuesta, basada en la respuesta de @ RémiRousselet y para la pregunta de @ user6638204, si desea pasar valores iniciales y aún poder actualizarlos en el estado más tarde:
fuente
MyStateful
tiene un parámetro llamado opcional (propiedad) que puede crear este widget llamandoMyStateful(foo: "my string",)
initState
no resuelve un problema en el siguiente escenario: por ejemplo, creó su widget Statefull con parámetros vacíos y está esperando que se carguen sus datos. Cuando se cargan los datos, desea actualizar su widget Statefull con los datos nuevos y, en este caso, cuando llame a MyStatefull (newData), ¡initState()
no se llamará! En este casodidUpdateWidget(MyStatefull oldWidget)
, se llamará y necesitará comparar sus datos del argumentooldWidget.getData()
conwidget.data
y si no es el mismo, llamarsetState()
para reconstruir el widget.Para pasar valores iniciales (sin pasar nada al constructor)
fuente