Ich frage mich, wie die empfohlene Methode zum Übergeben von Daten an ein zustandsbehaftetes Widget beim Erstellen empfohlen wird.
Die zwei Stile, die ich gesehen habe, sind:
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;
}
}
Diese Methode behält einen Wert sowohl in ServerInfo
als auch bei _ServerInfoState
, was etwas verschwenderisch erscheint.
Die andere Methode ist zu verwenden 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;
}
}
Dies scheint etwas rückwärts zu sein, da der Status nicht mehr _ServerInfoSate
im Widget gespeichert wird, sondern im Widget.
Gibt es dafür eine bewährte Methode?
ServerInfo(this._server);
Antworten:
Übergeben Sie keine Parameter an
State
den Konstruktor. Sie sollten nur mit auf diese zugreifenthis.widget.myField
.Das Bearbeiten des Konstruktors erfordert nicht nur viel manuelle Arbeit. es bringt nichts. Es gibt keinen Grund, alle Felder von zu duplizieren
Widget
.EDIT:
Hier ist ein Beispiel:
quelle
State
bereits als Zugriff auf alle EigenschaftenStateful
von über daswidget
Feld.void initState()
, um den Anfangswert festzulegen . Aktivieren Sie diese Thread- Option C als Beispiel.Am besten übergeben Sie keine Parameter mit dem Konstruktor an die State-Klasse. Sie können einfach in der State-Klasse mit zugreifen
widget.myField
.Beispielsweise
Übergeben Sie Ihre Daten, wenn Sie auf dem Bildschirm navigieren:
quelle
Eine weitere Antwort, die auf der Antwort von @ RémiRousselet und der Frage von @ user6638204 aufbaut, wenn Sie Anfangswerte übergeben und diese später noch aktualisieren möchten:
quelle
MyStateful
hat einen optionalen benannten Parameter (Eigenschaft), den Sie dieses Widget erstellen können, indem SieMyStateful(foo: "my string",)
initState
löst im folgenden Szenario kein Problem: Sie haben beispielsweise Ihr Statefull-Widget mit leeren Parametern erstellt und warten darauf, dass Ihre Daten geladen werden. Wenn die Daten geladen sind, möchten Sie Ihr Statefull-Widget mit den neuen Daten aktualisieren. In diesem Fall wird MyStatefull (newData)initState()
nicht aufgerufen, wenn Sie MyStatefull (newData) aufrufen . In diesem FalldidUpdateWidget(MyStatefull oldWidget)
wird aufgerufen und Sie müssten Ihre Daten aus ArgumentoldWidget.getData()
mit vergleichenwidget.data
und wenn es nicht dasselbe ist - rufen SiesetState()
auf, um das Widget neu zu erstellen.Zum Übergeben von Anfangswerten (ohne etwas an den Konstruktor zu übergeben)
quelle