gpt4 book ai didi

dart - 如何在类/有状态小部件外调用 setState?

转载 作者:IT王子 更新时间:2023-10-29 07:12:08 25 4
gpt4 key购买 nike

我有以下变量

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com