Передача данных в состояние ожидания
Мне интересно, каков рекомендуемый способ передачи данных в виджет с сохранением состояния при его создании.
Два стиля, которые я видел:
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;
}
}
Этот метод сохраняет значение как в ServerInfo
и в _ServerInfoState
, что кажется немного расточительным.
Другой метод заключается в использовании 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;
}
}
Это кажется немного задом наперед, поскольку состояние больше не сохраняется в _ServerInfoSate
а вместо этого в виджете.
Есть ли лучшая практика для этого?
Ответы
Ответ 1
Не передавайте параметры в State
используя его конструктор. Вы должны обращаться к ним только с помощью this.widget.myField
.
Не только редактирование конструктора требует много ручной работы; он ничего не приносит. Нет причин дублировать все поля Widget
.
РЕДАКТИРОВАТЬ :
Вот пример
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);
}
}
Ответ 2
Другой ответ, основанный на @RémiRousselet anwser и вопросе @user6638204, если вы хотите передать начальные значения и все еще иметь возможность обновлять их в состоянии позже:
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);
}
}
Ответ 3
Для передачи начальных значений (не передавая ничего конструктору)
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);
}
}