web-dev-qa-db-fra.com

Passer des données à un widget avec état

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?

51
Mojachiee

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);
  }
}
119
Rémi Rousselet

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);
  }
}
3