重新创建窗口小部件时,颤振器重置StatefulWidget状态

时间:2020-06-11 20:25:05

标签: flutter widget statefulwidget

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

builder: (context, AsyncSnapshot<MyObject> snapshot) {
...
    if (snapshot.hasError) {
        return ErrorRetryWidget();
    }
}

ErrorRetryWidget()仅显示错误消息和重试按钮。当您按下此按钮时,我将用进度指示器替换按钮文本。因此,我需要使此小部件成为有状态的,因为它的状态包含一个isRetrying变量,我在initState中将其设置为false,然后在按下时设置为true。

按下按钮时,ErrorRetryWidget通过VoidCallback通知父级重新触发流逻辑。效果很好,但问题是,如果错误再次出现,我的StreamBuilder将再次“返回” ErrorRetryWidget

该构造函数称为新时间,但不称为initState。我怎样才能使状态在每次重新创建小部件时重置?因此,isRetrying已(或仍然)设置为true。

我发现的唯一快速解决方案是在我的错误小部件中实现此目标:

@override
void didUpdateWidget(covariant oldWidget) {
    super.didUpdateWidget(oldWidget);
    setState(() {
        retrying = false;
    });
  }

不确定这是一个好习惯。

2 个答案:

答案 0 :(得分:2)

传递唯一密钥以使其创建新的小部件。

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

答案 1 :(得分:2)

正如您所说,我使用 didUpdateWidget 来重置有状态小部件的状态。它在动画中也很有用。

我要添加的唯一注释是不要像您那样使用 setState,因为当框架调用 didUpdateWidget 时,它会立即调用 build。因此,您不必在 didUpdateWidget 中触发构建调用。它最终调用了两次 build。

@override
void didUpdateWidget(covariant oldWidget) {
    super.didUpdateWidget(oldWidget);
    retrying = false;
  }