我想知道,在创建有状态小部件时,向它传递数据的推荐方法是什么。
我见过的两种风格是:
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
中,而是存储在小部件中。
对此是否有最佳实践?
8条答案
按热度按时间x9ybnkn61#
不要使用
State
的构造函数将参数传递给State
。只能使用this.widget.myField
访问参数。不仅编辑构造函数需要大量的手工工作;它不会带来任何东西,没有必要复制
Widget
的所有字段。编辑:
下面是一个例子:
zdwk9cvp2#
widget.myField
**在State类中轻松访问。7dl7o3gd3#
另一个答案,基于@RémiRousselet的anwser和@user6638204的问题,如果你想传递初始值,并且以后仍然能够在状态中更新它们:
cotxawn74#
用于传递初始值(不向构造函数传递任何内容)
falq053o5#
Flutter的有状态小部件API有点笨拙:将数据存储在Widget中,以便在
State
对象中的build()
方法中访问它🤦如果您不想使用一些更大的状态管理选项(Provider,BLoC),请使用flutter_hooks(https://pub.dev/packages/flutter_hooks)-它是SatefullWidget
s的更好、更干净的替代品:2jcobegt6#
@Rémi Rousselet,@Sanjayrajsinh,@Daksh Shah也更好。但我也定义了这是在起点。哪个参数是哪个值
uxh89sit7#
最佳实践是将有状态小部件类定义为不可变,这意味着定义所有依赖项(到达参数)作为最终参数。并通过状态类中的
widget.<fieldName>
访问它们。如果要更改它们的值(如重新分配),则应在状态类中定义相同类型的属性,并在initState
函数中重新分配它们。强烈建议不要在有状态的小部件类中定义任何非final属性,并将其设置为mutable类。类似于以下模式:uoifb46i8#
要将
data
传递给有状态小部件,首先创建两个页面,现在从第一个页面打开第二个页面并传递数据。