Передача данных в виджет с отслеживанием состояния - PullRequest
0 голосов
/ 12 июня 2018

Мне интересно, каков рекомендуемый способ передачи данных в виджет с сохранением состояния при его создании.

Два стиля, которые я видел:

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, а вместо этого в виджете.

Есть ли лучший способ для этого?

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Другой ответ, основанный на ответе @ RémiRousselet и на вопрос @ 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);
  }
}
0 голосов
/ 12 июня 2018

Не передавайте параметры 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);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...