我想知道在创建状态小部件时将数据传递给有状态小部件的推荐方法是什么。
我见过的两种风格是:
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
的所有字段。
编辑:
这是一个例子:
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")
);
}
}
https://stackoverflow.com/questions/50818770/