ステートフル ウィジェットを作成するときに、データを渡すための推奨される方法は何でしょうか。
私が見た 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
ではなくウィジェットに保存されるので、これは少し逆のように思えます。
これに関するベストプラクティスはありますか?
ベストアンサー1
コンストラクターを使用して にパラメータを渡さないでくださいState
。 のみを使用してパラメータにアクセスする必要がありますthis.widget.myField
。
コンストラクターの編集には多くの手作業が必要なだけでなく、何も得られません。 のすべてのフィールドを複製する理由はありませんWidget
。
編集 :
次に例を示します。
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")
);
}
}