Passer des données à StatefulWidget et y accéder dans son état dans Flutter

125

J'ai 2 écrans dans mon application Flutter: liste des enregistrements et écran pour créer et éditer des enregistrements.

Si je passe l'objet au deuxième écran, cela signifie que je vais le modifier et si je passe null, cela signifie que je crée un nouvel élément. L'écran d'édition est un widget avec état et je ne sais pas comment utiliser cette approche https://flutter.io/cookbook/navigation/passing-data/ pour mon cas.

class RecordPage extends StatefulWidget {
  final Record recordObject;

  RecordPage({Key key, @required this.recordObject}) : super(key: key);

  @override
  _RecordPageState createState() => new _RecordPageState();
}

class _RecordPageState extends State<RecordPage> {
  @override
  Widget build(BuildContext context) {
   //.....
  }
}

Comment puis-je accéder à recordObject dans _RecordPageState ?

Moonvader
la source
1
Copie possible de la transmission
comment pouvons-nous utiliser la valeur de la variable «recordObject» dans une fonction de la classe _RecordPageState?
Kamlesh

Réponses:

209

Pour utiliser recordObject dans _RecordPageState, vous devez simplement écrire widget.objectname comme ci-dessous

class _RecordPageState extends State<RecordPage> {
  @override
  Widget build(BuildContext context) {
   .....
   widget.recordObject
   .....
  }
}
dhuma1981
la source
9
Ceux qui sont nouveaux sur Flutter, n'oubliez pas de définir un widget comme '@override RecordPage get widget => super.widget;'
hhk
22
@hhk Pourquoi est-ce nécessaire?
Herohtar
2
Ne devrait-il recordObjectpas faire partie de la Stateclasse? Logiquement, l'avoir dans StatefulWidgetest incorrect (en termes de cohésion). De plus, tous les champs de StatefulWidgetdoivent être immuables - que faire si vous souhaitez modifier la recordObjectréférence?
Alex Semeniuk
J'ai exactement la même chose et ça ne marche pas en faisant quelque chose comme Text(widget.recordObject), ça dit que mon var est nul
Dani
comment pouvons-nous utiliser la valeur de la variable «recordObject» dans une fonction de la classe _RecordPageState?
Kamlesh
32
class RecordPage extends StatefulWidget {
  final Record recordObject;

  RecordPage({Key key, @required this.recordObject}) : super(key: key);

  @override
  _RecordPageState createState() => new _RecordPageState(recordObject);
}

class _RecordPageState extends State<RecordPage> {
  Record  recordObject
 _RecordPageState(this. recordObject);  //constructor
  @override
  Widget build(BuildContext context) {.    //closure has access
   //.....
  }
}
John Mcfetridge
la source
1
Veuillez expliquer pourquoi il s'agit d'un widget complet.
localhoost
@atilkan parce que le script initial OP est un StatefulWidget, il vient d'ajouter quelques lignes pour répondre aux besoins.
adadion
3
Je ne pense pas qu'avoir un recordObjectchamp à la fois dans Stateet dans les StatefulWidgetclasses soit une si bonne idée (même si j'ai vu des tutoriels faire exactement cela). L'approche d'accès aux champs StatefulWidgeten utilisant le widgetchamp de Stateclasse semble être une approche plus correcte (même si elle a ses propres problèmes)
Alex Semeniuk
22

Exemple complet

Vous n'avez pas besoin de passer de paramètres à State en utilisant son constructeur. Vous pouvez facilement y accéder en utilisant widget.myField .

class MyRecord extends StatefulWidget {
  final String recordName;
  const MyRecord(this.recordName);

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

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

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

 Navigator.of(context).push(MaterialPageRoute(builder: (context) => MyRecord("WonderWorld")));
Sanjayrajsinh
la source