Передача данных в состояние ожидания

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

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

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