web-dev-qa-db-ja.com

ステートフルウィジェットにデータを渡す

ステートフルウィジェットにデータを作成する際に、データを渡す推奨される方法は何だろうと思っています。

私が見た2つのスタイルは次のとおりです。

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の両方に値を保持しますが、これは少し無駄に思えます。

もう1つの方法は、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ではなくウィジェットに保存されるため、これは少し逆に思えます。

これにベストプラクティスはありますか?

51
Mojachiee

コンストラクターを使用して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);
  }
}
119
Rémi Rousselet

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