- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有以下变量
String _warningMessage;
bool _warningVisibility;
我想通过一个实现接口(interface)的类来更新
class _UserSignupInterface extends _SignupSelectUsernamePageState
implements UserSignupInterface {
@override
void onSuccess() {
_hideWarning();
_navigateToUserPage();
}
@override
void onError(String message) {
_isSignupClickable = true;
if(message != null) {
_displayWarning(message);
}
}
}
使用 _displayWarning 代码(位于 _SignupSelectUsernamePageState
内)
void _displayWarning(String message) {
if (message != null) {
setState(() {
widget._warningMessage = message;
widget._warningVisibility = true;
});
}
}
但是,每当我从 _SignupSelectUsernamePageState
外部调用 _displayWarning(message)
时。我收到一条错误消息
Unhandled Exception: setState() called in constructor
是否有适当的方法在他们的类(class)之外更新这些可变状态?在我的例子中,我从另一个实现接口(interface)的类调用 _displayWarning(message)
最佳答案
您必须决定这是在小部件内部更改的值,还是在小部件外部更改的值。
如果它是内部的,常见的事情是将它们放在 State
类中,上面带有 _,它们可以从一个值开始,例如在 initState
上设置并且每次他们更改时,您都会调用 setState
来表明这一点。
但是,如果它们在小部件外部发生变化,那么您将它们放在 StatefulWidget
类中(正如您似乎所做的那样),您将它们留在没有 _ 的位置,因为它们实际上是公开的,您甚至使它们最终化并将它们放在构造函数中以允许设置它们。
在最后一种情况下,如果在 State
类中您必须知道小部件的更改,您可以实现 didUpdateWidget
,但这不是强制性的。
当然你可以混合这两种东西,在 State
中有一个 _warningMessage
,所以你可以用 setState
更新它,但是用一个来自小部件的 initState
中定义的初始值。
同样,如果小部件在外部发生变化,您可以使用新的小部件值再次更新 _warningMessage
的值。
类似的东西:(我没有测试这段代码)
class YourWidget extends StatefulWidget {
YourWidget({this.warningMessage});
final String warningMessage;
@override
State<YourWidget> createState() => new _YourWidgetState();
}
class _YourWidgetState extends State<YourWidget> {
String _warningMessage;
@override
void initState() {
super.initState();
_warningMessage = widget.warningMessage;
}
@override
didUpdateWidget(ReorderableListSimple oldWidget) {
super.didUpdateWidget(oldWidget);
_warningMessage = widget.warningMessage;
}
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Text(_warningMessage),
RaisedButton(
child: Text("Change Message"),
onPressed: () {
setState(() {
_warningMessage = "new message from within the State class";
});
}
)
],
);
}
}
因此在此示例中,您可以在外部更改 warningMessage
,就像在 parent
小部件中一样,您可以传递不同的消息。但是,如果需要,您也可以使用 setState
在内部设置它,因为它发生在按钮的 onPressed
中。
您可能会检查您是否真的需要在 Widget
中公开该属性,也许您不需要!然后,该示例将如下所示:
class YourWidget extends StatefulWidget {
@override
State<YourWidget> createState() => new _YourWidgetState();
}
class _YourWidgetState extends State<YourWidget> {
String _warningMessage;
@override
void initState() {
super.initState();
_warningMessage = "default message, no need for widget";
}
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
Text(_warningMessage),
RaisedButton(
child: Text("Change Message"),
onPressed: () {
setState(() {
_warningMessage = "new message from within the State class";
});
}
)
],
);
}
}
关于dart - 如何在类/有状态小部件外调用 setState?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55455055/
我是一名优秀的程序员,十分优秀!