Je me demande quelle est la manière recommandée de 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 à l'envers car l'état n'est plus stocké dans _ServerInfoSate
mais plutôt dans le widget.
Existe-t-il une meilleure pratique pour cela?
ServerInfo(this._server);
Réponses:
Ne transmettez pas de paramètres à l'
State
utilisation de son constructeur. Vous ne devez y accéder qu'en utilisantthis.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
.ÉDITER :
Voici un exemple:
la source
State
déjà comme accès à toutes les propriétés deStateful
en utilisant lewidget
champ.void initState()
état pour définir la valeur initiale. Cochez cette option de filetage C comme exemple.Le meilleur moyen est de ne pas transmettre de paramètres à la classe State en utilisant son constructeur. Vous pouvez facilement accéder à la classe State en utilisant
widget.myField
.Par exemple
Transmettez vos données lorsque vous naviguez sur l'écran:
la source
Une autre réponse, en s'appuyant sur la réponse de @ RémiRousselet et pour la question de @ user6638204, si vous voulez passer les valeurs initiales et pouvoir encore les mettre à jour dans l'état plus tard:
la source
MyStateful
a un paramètre nommé facultatif (propriété) que vous pouvez créer ce widget en appelantMyStateful(foo: "my string",)
initState
ne résout pas un problème dans le scénario suivant: par exemple, vous avez créé votre widget Statefull avec des paramètres vides et vous attendez que vos données se chargent. Lorsque les données sont chargées, vous souhaitez mettre à jour votre widget Statefull avec les données fraîches et dans ce cas, lorsque vous appelez MyStatefull (newData), il neinitState()
sera pas appelé! Dans ce cas,didUpdateWidget(MyStatefull oldWidget)
il sera appelé et vous devrez comparer vos données d'argumentoldWidget.getData()
avecwidget.data
et si ce n'est pas la même chose - appelezsetState()
pour reconstruire le widget.Pour passer des valeurs initiales (sans rien passer au constructeur)
la source