dart - Pasando datos a un widget de estado
flutter (2)
Me pregunto cuál es la forma recomendada de pasar datos a un widget con estado, mientras lo 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 tanto en
ServerInfo
como en
_ServerInfoState
, lo que parece un poco inútil.
El otro método es usar
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 hacia atrás ya que el estado ya no se almacena en
_ServerInfoSate
sino en el widget.
¿Hay una mejor práctica para esto?
No pase parámetros al
State
usando su constructor.
Solo debes acceder a estos usando
this.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:
Aquí un ejemplo
class MyStateful extends StatefulWidget {
final String foo;
const MyStateful({Key key, this.foo}): super(key: key);
@override
_MyStatefulState createState() => _MyStatefulState();
}
class _MyStatefulState extends State<MyStateful> {
@override
Widget build(BuildContext context) {
return Text(widget.foo);
}
}
Otra respuesta, basándose en la respuesta de @RémiRousselet y en la pregunta de @ user6638204, si desea pasar valores iniciales y aún así poder actualizarlos en el estado más adelante:
class MyStateful extends StatefulWidget {
final String foo;
const MyStateful({Key key, this.foo}): super(key: key);
@override
_MyStatefulState createState() => _MyStatefulState(foo: this.foo);
}
class _MyStatefulState extends State<MyStateful> {
String foo;
_MyStatefulState({this.foo});
@override
Widget build(BuildContext context) {
return Text(foo);
}
}