293 votes

Passage de données à un widget avec état

Je me demande ce que le moyen recommandé de transmettre les données avec un état de widget, lors de la création, est.

Les deux styles que j'ai vu 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 permet de conserver une valeur en 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 vers l'arrière comme l'état n'est plus stocké dans _ServerInfoSate , mais plutôt dans le widget.

Quelle est la meilleure pratique pour cela?

534voto

Rémi Rousselet Points 45139

Ne passez pas de paramètres à State utilisant son constructeur. Vous ne devez y accéder qu'en utilisant 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 .

ÉDITER :

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

71voto

Sanjayrajsinh Points 1098

La meilleure façon est de ne pas transmettre de paramètres à la classe State en utilisant son constructeur. Vous pouvez facilement y accéder dans la classe State en utilisant widget.myField .

Par exemple

 class UserData extends StatefulWidget {
  final String clientName;
  final int clientID;
  const UserData(this.clientName,this.clientID);

  @override
  UserDataState createState() => UserDataState();
}

class UserDataState extends State<UserData> {
  @override
  Widget build(BuildContext context) {
    return Text(widget.clientName); // Here you direct access using widget
  }
}
 

Transmettez vos données lorsque vous naviguez sur l'écran:

  Navigator.of(context).push(MaterialPageRoute(builder: (context) => UserData("WonderClientName",132)));
 

23voto

Une autre réponse, en s'appuyant sur la réponse de @ RémiRousselet et sur la question de @ user6638204, si vous souhaitez passer les valeurs initiales et pouvoir 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);
  }
}
 

21voto

Daksh Shah Points 1434

Pour passer des valeurs initiales (sans rien passer au constructeur)

 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
  void initState(){
    super.initState();
    // you can use this.widget.foo here
  }

  @override
  Widget build(BuildContext context) {
    return Text(foo);
  }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X