ステートフルウィジェットにデータを作成する際に、データを渡す推奨される方法は何だろうと思っています。
私が見た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
ではなくウィジェットに保存されるため、これは少し逆に思えます。
これにベストプラクティスはありますか?
コンストラクターを使用して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);
}
}
@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);
}
}