1. ホーム
  2. flutter

[解決済み】FlutterでStateful Widgetにデータを渡す

2022-04-14 20:04:42

質問

ステートフルウィジェットを作成する際に、データを渡す推奨される方法は何なのか気になります。

私が見たことのあるスタイルは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 というのは、ちょっともったいない気がします。

もう一つの方法は 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 でなく、ウィジェットの中にあります。

これに対するベストプラクティスはあるのでしょうか?

どのように解決するのですか?

にパラメータを渡さない。 State は、コンストラクタを使用しています。 パラメータにアクセスするには this.widget.myField .

コンストラクタを編集するには多くの手作業が必要なだけでなく、何ももたらしません。のすべてのフィールドを重複させる理由はありません。 Widget .

EDIT :

以下はその一例です。

class ServerIpText extends StatefulWidget {
  final String serverIP;

  const ServerIpText ({ Key? key, this.serverIP }): super(key: key);

  @override
  _ServerIpTextState createState() => _ServerIpTextState();
}

class _ServerIpTextState extends State<ServerIpText> {
  @override
  Widget build(BuildContext context) {
    return Text(widget.serverIP);
  }
}

class AnotherClass extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
      child: ServerIpText(serverIP: "127.0.0.1")
    );
  }
}