Flutter 在重新创建 Widget 时重置 StatefulWidget 状态

标签 flutter widget statefulwidget

在我的 Flutter 小部件中,我有一个 StreamBuilder检查 snapshot.hasError在这种特定情况下,它将返回我的 ErrorRetryWidget() .

builder: (context, AsyncSnapshot<MyObject> snapshot) {
...
    if (snapshot.hasError) {
        return ErrorRetryWidget();
    }
}
ErrorRetryWidget()只显示错误消息和重试按钮。当您按下此按钮时,我会用进度指示器替换按钮文本。因此我需要让这个小部件有状态,因为它的状态包含 isRetrying我在 initState 中设置为 false 的变量,然后在按下后变为真。

当按下按钮时,ErrorRetryWidget通过 VoidCallback 告诉父级重新触发流逻辑。它运行良好,但问题是如果错误再次出现,我的 StreamBuilder将“返回”ErrorRetryWidget再来一次。

构造函数被称为新时间,但不是 initState .我怎样才能做到每次重新创建小部件时都会重置状态?因此,isRetrying已经(或仍然)设置为 true。

我找到的唯一快速解决方案是在我的错误小部件中实现它:
@override
void didUpdateWidget(covariant oldWidget) {
    super.didUpdateWidget(oldWidget);
    setState(() {
        retrying = false;
    });
  }

不确定这是一个好习惯。

最佳答案

传递一个唯一的键,让它创建一个新的小部件。

if (snapshot.hasError) {
    return ErrorRetryWidget(key: UniqueKey());
}

关于Flutter 在重新创建 Widget 时重置 StatefulWidget 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62332971/

相关文章:

flutter - 在 Flutter Windows 应用程序中双击时选择 TextField 中的文本

flutter/Dart : Subclass a freezed data class

ios - 重命名今日小部件标题

javascript - 如何创建一个独立的 DOM 元素?一个不从 parent 那里继承 css 等

javascript - 我可以在本地浏览器中打开 XSS 吗?

function - 在它之外调用小部件自己的功能

class - 同一个 Statefulwidget 的多个实例似乎共享同一个 State 对象?

flutter - zsh:找不到命令: flutter

android - Flutter 工作管理器返回 "Worker result FAILURE for Work [ id=XXXXXxXXXXxXXXX tags={ be.tramckrijte.workmanager.BackgroundWorker } ]"

checkbox - 在构造函数中调用 SetState()