将数据传递给有状态的小部件 [英] Passing Data to a Stateful Widget
问题描述
我想知道在创建数据时将数据传递到有状态的小部件的推荐方法是什么。
I'm wondering what the recommended way of passing data to a stateful widget, while creating it, is.
我看到的两种样式是:
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;
}
}
此方法在<$ c $中都保留一个值c> ServerInfo 和 _ServerInfoState
,这似乎有点浪费。
This method keeps a value both in ServerInfo
and _ServerInfoState
, which seems a bit wasteful.
另一种方法是使用 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
中,而是存储在小部件中。
This seems a bit backwards as the state is no longer stored in _ServerInfoSate
but instead in the widget.
是否有最佳做法?
推荐答案
不要使用其构造函数将参数传递给 State
。
您只能使用 this.widget.myField
访问它们。
Don't pass parameters to State
using it's constructor.
You should only access these using this.widget.myField
.
不仅编辑构造函数还需要大量的手工工作;它什么也没带来。没有理由重复小部件
的所有字段。
Not only editing the constructor requires a lot of manual work ; it doesn't bring anything. There's no reason to duplicate all the fields of 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")
);
}
}
这篇关于将数据传递给有状态的小部件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!