Übergeben von Daten an StatefulWidget und Zugreifen auf diese Daten im Status in Flutter

121

Ich habe 2 Bildschirme in meiner Flutter-App: Liste der Datensätze und Bildschirm zum Erstellen und Bearbeiten von Datensätzen.

Wenn ich ein Objekt an den zweiten Bildschirm übergebe, bedeutet dies, dass ich dies bearbeiten werde. Wenn ich null übergebe, bedeutet dies, dass ich ein neues Element erstelle. Der Bearbeitungsbildschirm ist ein Stateful-Widget, und ich bin mir nicht sicher, wie ich diesen Ansatz für meinen Fall verwenden soll: https://flutter.io/cookbook/navigation/passing-data/ .

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) {
   //.....
  }
}

Wie kann ich in _RecordPageState auf recordObject zugreifen ?

Moonvader
quelle
1
Mögliches Duplikat der Datenübergabe an ein Stateful Widget
Herohtar
Wie können wir den Variablenwert 'recordObject' in einer Funktion der Klasse _RecordPageState verwenden?
Kamlesh
Beantwortet das deine Frage?
Übergeben Sie

Antworten:

205

Um recordObject in _RecordPageState zu verwenden, müssen Sie nur widget.objectname wie unten schreiben

class _RecordPageState extends State<RecordPage> {
  @override
  Widget build(BuildContext context) {
   .....
   widget.recordObject
   .....
  }
}
dhuma1981
quelle
9
Diejenigen, die Flutter noch nicht kennen, vergessen nicht, ein Widget wie '@override RecordPage get widget => super.widget;' zu definieren.
hhk
22
@hhk Warum ist das notwendig?
Herohtar
2
Sollte das recordObjectnicht Teil der StateKlasse sein? Logischerweise ist es StatefulWidgetfalsch (in Bezug auf den Zusammenhalt). Außerdem sollten alle Felder von StatefulWidgetunveränderlich sein - was ist, wenn Sie die recordObjectReferenz ändern möchten ?
Alex Semeniuk
Ich habe genau das gleiche und es funktioniert nicht so etwas wie Text(widget.recordObject), es sagt, dass meine var null ist
Dani
Wie können wir den Variablenwert 'recordObject' in einer Funktion der Klasse _RecordPageState verwenden?
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
quelle
1
Bitte erläutern Sie, warum dies ein Statefull-Widget ist.
Localhoost
@atilkan Da das OP-Anfangsskript ein StatefulWidget ist, hat er nur einige Zeilen hinzugefügt, um den Anforderungen zu entsprechen.
Adadion
3
Ich denke nicht, dass es eine so gute Idee ist , recordObjectsowohl Feld Stateals auch StatefulWidgetUnterricht zu haben (obwohl ich Tutorials gesehen habe, die genau dies tun). Der Ansatz des Zugriffs auf Felder StatefulWidgetmithilfe widgetdes StateKlassenfelds scheint korrekter zu sein (obwohl er seine eigenen Probleme hat)
Alex Semeniuk,
20

Vollständiges Beispiel

Sie müssen keine Parameter mit dem Konstruktor an State übergeben. Sie können mit widget.myField einfach darauf zugreifen .

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

Übergeben Sie Ihre Daten, wenn Sie auf dem Bildschirm navigieren:

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