Je me demande quelle est la méthode recommandée pour transmettre des données à un widget avec état, lors de sa création.
Les deux styles que j'ai vus sont:
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;
}
}
Cette méthode conserve une valeur à la fois dans ServerInfo
et _ServerInfoState
, ce qui semble un peu inutile.
L'autre méthode consiste à utiliser 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;
}
}
Cela semble un peu en arrière car l'état n'est plus stocké dans _ServerInfoSate
mais dans le widget.
Y at-il une meilleure pratique pour cela?
Ne transmettez pas les paramètres à State
en utilisant son constructeur. Vous ne devriez y accéder qu'avec this.widget.myField
.
Non seulement l'édition du constructeur nécessite beaucoup de travail manuel; ça n'apporte rien. Il n'y a aucune raison de dupliquer tous les champs de Widget
.
EDIT:
Voici un exemple
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);
}
}
Une autre réponse, basée sur la réponse de @ RémiRousselet et sur la question de @ user6638204, si vous souhaitez transmettre les valeurs initiales tout en pouvant les mettre à jour ultérieurement:
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);
}
}