![](/img/trans.png)
[英]Flutter - RepaintBoundary causes state reset of StatefulWidget
[英]Flutter reset StatefulWidget state when Widget is recreated
在我的 Flutter 小部件中,我有一个检查snapshot.hasError
的StreamBuilder
,在这种特定情况下,它将返回我的ErrorRetryWidget()
。
builder: (context, AsyncSnapshot<MyObject> snapshot) {
...
if (snapshot.hasError) {
return ErrorRetryWidget();
}
}
ErrorRetryWidget()
仅显示错误消息和重试按钮。 当您按下此按钮时,我将按钮文本替换为进度指示器。 因此我需要使这个小部件有状态,因为它的 state 包含一个isRetrying
变量,我在initState
中将其设置为 false ,然后在按下后设置为 true 。
按下按钮时, ErrorRetryWidget
通过VoidCallback
告诉父级重新触发 stream 逻辑。 它运行良好,但问题是如果错误再次出现,我的StreamBuilder
将再次“返回” ErrorRetryWidget
。
构造函数被称为新时间,但不是initState
。 每次重新创建小部件时,我怎样才能使 state 重置? 因此, isRetrying
已经(或仍然)设置为 true。
我发现的唯一快速解决方案是在我的错误小部件中实现这一点:
@override
void didUpdateWidget(covariant oldWidget) {
super.didUpdateWidget(oldWidget);
setState(() {
retrying = false;
});
}
不确定这是一个好习惯。
传递一个唯一的键,让它创建一个新的小部件。
if (snapshot.hasError) {
return ErrorRetryWidget(key: UniqueKey());
}
正如您所说,我使用 didUpdateWidget 来重置有状态小部件的 state。 它在动画中也很有用。
我要添加的唯一评论是不要像您那样使用 setState,因为当框架调用 didUpdateWidget 时,它会立即调用 build。 因此,您不必在 didUpdateWidget 中触发构建调用。 它最终调用 build 两次。
@override
void didUpdateWidget(covariant oldWidget) {
super.didUpdateWidget(oldWidget);
retrying = false;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.