我想知道在创建数据时,将数据传递给有状态小部件的推荐方法是什么。
我见过的两种风格是:
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 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);
}
}