Flutter 在重新创建 Widget 时重置 StatefulWidget 状态
Flutter reset StatefulWidget state when Widget is recreated
在我的 Flutter Widget 中,我有一个 StreamBuilder
检查 snapshot.hasError
并且在这种特定情况下它将 return 我的 ErrorRetryWidget()
.
builder: (context, AsyncSnapshot<MyObject> snapshot) {
...
if (snapshot.hasError) {
return ErrorRetryWidget();
}
}
ErrorRetryWidget()
仅显示一条错误消息和一个重试按钮。当您按下此按钮时,我会用进度指示器替换按钮文本。因此我需要让这个小部件有状态,因为它的状态包含一个 isRetrying
变量,我在 initState
中设置为 false,然后在按下后设置为 true。
按下按钮时,ErrorRetryWidget
通过 VoidCallback
告诉父级重新触发流逻辑。它运行良好,但问题是如果错误再次出现,我的 StreamBuilder
将再次 "return" ErrorRetryWidget
。
构造函数被调用了一个新的时间,而不是initState
。我怎样才能做到每次重新创建小部件时状态都会重置?因此,isRetrying
已经(或仍然)设置为 true。
我找到的唯一快速解决方案是在我的错误小部件中实现它:
@override
void didUpdateWidget(covariant oldWidget) {
super.didUpdateWidget(oldWidget);
setState(() {
retrying = false;
});
}
不确定这是一个好的做法。
传递一个唯一的键让它创建一个新的小部件。
if (snapshot.hasError) {
return ErrorRetryWidget(key: UniqueKey());
}
正如您所说,我使用 didUpdateWidget 来重置有状态小部件的状态。它在动画中也很有用。
我要添加的唯一评论是不要像您那样使用 setState,因为当框架调用 didUpdateWidget 时,它会立即调用 build。因此,您不必在 didUpdateWidget 中触发构建调用。它最终调用了两次构建。
@override
void didUpdateWidget(covariant oldWidget) {
super.didUpdateWidget(oldWidget);
retrying = false;
}
在我的 Flutter Widget 中,我有一个 StreamBuilder
检查 snapshot.hasError
并且在这种特定情况下它将 return 我的 ErrorRetryWidget()
.
builder: (context, AsyncSnapshot<MyObject> snapshot) {
...
if (snapshot.hasError) {
return ErrorRetryWidget();
}
}
ErrorRetryWidget()
仅显示一条错误消息和一个重试按钮。当您按下此按钮时,我会用进度指示器替换按钮文本。因此我需要让这个小部件有状态,因为它的状态包含一个 isRetrying
变量,我在 initState
中设置为 false,然后在按下后设置为 true。
按下按钮时,ErrorRetryWidget
通过 VoidCallback
告诉父级重新触发流逻辑。它运行良好,但问题是如果错误再次出现,我的 StreamBuilder
将再次 "return" ErrorRetryWidget
。
构造函数被调用了一个新的时间,而不是initState
。我怎样才能做到每次重新创建小部件时状态都会重置?因此,isRetrying
已经(或仍然)设置为 true。
我找到的唯一快速解决方案是在我的错误小部件中实现它:
@override
void didUpdateWidget(covariant oldWidget) {
super.didUpdateWidget(oldWidget);
setState(() {
retrying = false;
});
}
不确定这是一个好的做法。
传递一个唯一的键让它创建一个新的小部件。
if (snapshot.hasError) {
return ErrorRetryWidget(key: UniqueKey());
}
正如您所说,我使用 didUpdateWidget 来重置有状态小部件的状态。它在动画中也很有用。
我要添加的唯一评论是不要像您那样使用 setState,因为当框架调用 didUpdateWidget 时,它会立即调用 build。因此,您不必在 didUpdateWidget 中触发构建调用。它最终调用了两次构建。
@override
void didUpdateWidget(covariant oldWidget) {
super.didUpdateWidget(oldWidget);
retrying = false;
}