Zastanawiam się, jaki jest zalecany sposób przekazywania danych do widgetu stanowego podczas jego tworzenia.
Dwa style, które widziałem to:
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;
}
}
Ta metoda zachowuje wartość zarówno w, jak ServerInfo
i _ServerInfoState
, co wydaje się nieco marnotrawne.
Inną metodą jest użycie 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;
}
}
Wydaje się to trochę wstecz, ponieważ stan nie jest już przechowywany w _ServerInfoSate
widgecie.
Czy istnieje najlepsza praktyka?
ServerInfo(this._server);
Odpowiedzi:
Nie przekazuj parametrów do
State
jego konstruktora. Powinieneś uzyskać do nich dostęp tylko za pomocąthis.widget.myField
.Nie tylko edycja konstruktora wymaga dużo pracy ręcznej; to nic nie przynosi. Nie ma powodu, aby powielać wszystkie pola
Widget
.EDYTOWAĆ :
Oto przykład:
źródło
State
już jako dostęp do wszystkich właściwościStateful
za pomocąwidget
pola.void initState()
stan w celu ustawienia wartości początkowej. Zaznacz opcję C wątku jako przykład.Najlepszym sposobem jest nie przekazywanie parametrów do klasy State przy użyciu jej konstruktora. Możesz łatwo uzyskać dostęp w klasie State za pomocą
widget.myField
.Na przykład
Przekaż swoje dane podczas nawigacji na ekranie:
źródło
Kolejna odpowiedź, opierając się na anwser @ RémiRousselet i dla pytania @ user6638204, jeśli chcesz przekazać wartości początkowe i nadal mieć możliwość ich późniejszej aktualizacji w stanie:
źródło
MyStateful
ma jeden opcjonalny nazwany parametr (właściwość), który możesz utworzyć, dzwoniącMyStateful(foo: "my string",)
initState
nie rozwiązuje problemu w następującym scenariuszu: na przykład utworzyłeś widget Statefull z pustymi parametrami i czekasz na załadowanie danych. Po załadowaniu danych chcesz zaktualizować widget Statefull o świeże dane, aw tym przypadku, gdy wywołasz MyStatefull (newData),initState()
nie zostanie on wywołany! W takim przypadkudidUpdateWidget(MyStatefull oldWidget)
zostanie wywołany i będziesz musiał porównać dane z argumentuoldWidget.getData()
z,widget.data
a jeśli nie jest to to samo - wywołaj,setState()
aby odbudować widget.Do przekazywania wartości początkowych (bez przekazywania niczego do konstruktora)
źródło