我在Flutter中有一个带有按钮的StatefulWidget,它使用Navigator.push()将我导航到另一个StatefulWidget。在第二个小部件上,我正在更改全局状态(一些用户首选项)。当我从第二个小部件回到第一个时,使用Navigator.pop(),第一个小部件处于旧状态,但我想强制它重新加载。知道怎么做吗?我有一个想法,但看起来很难看:

弹出以删除第二个小部件(当前小部件) 再次弹出以删除第一个小部件(前一个) 推送第一个小部件(它应该强制重绘)


当前回答

把这个放在你要推到第二个屏幕的地方(在一个异步函数中)

Function f;
f= await Navigator.pushNamed(context, 'ScreenName');
f();

把这个放在你要弹的地方

Navigator.pop(context, () {
 setState(() {});
});

在弹出闭包中调用setState来更新数据。

其他回答

这段简单的代码让我找到根目录并重新加载状态:

    ...
    onPressed: () {
         Navigator.of(context).pushNamedAndRemoveUntil('/', ModalRoute.withName('/'));
                },
    ...

把这个放在你要推到第二个屏幕的地方(在一个异步函数中)

Function f;
f= await Navigator.pushNamed(context, 'ScreenName');
f();

把这个放在你要弹的地方

Navigator.pop(context, () {
 setState(() {});
});

在弹出闭包中调用setState来更新数据。

需要强制重建我的一个无状态小部件。不想使用有状态的。我想出了这个解决方案:

await Navigator.of(context).pushNamed(...);
ModalRoute.of(enclosingWidgetContext);

注意,context和enclosingWidgetContext可以是相同的上下文,也可以是不同的上下文。例如,如果你从StreamBuilder内部推送,它们将是不同的。

我们在这里没有用ModalRoute做任何事情。仅订阅行为就足以强制重新构建。

您可以在弹出上下文时传递回一个动态结果,然后在值为true时调用setState((){}),否则就保持状态不变。

我粘贴了一些代码片段供您参考。

handleClear() async {
    try {
      var delete = await deleteLoanWarning(
        context,
        'Clear Notifications?',
        'Are you sure you want to clear notifications. This action cannot be undone',
      );
      if (delete.toString() == 'true') {
        //call setState here to rebuild your state.

      }
    } catch (error) {
      print('error clearing notifications' + error.toString());
             }
  }



Future<bool> deleteLoanWarning(BuildContext context, String title, String msg) async {

  return await showDialog<bool>(
        context: context,
        child: new AlertDialog(
          title: new Text(
            title,
            style: new TextStyle(fontWeight: fontWeight, color: CustomColors.continueButton),
            textAlign: TextAlign.center,
          ),
          content: new Text(
            msg,
            textAlign: TextAlign.justify,
          ),
          actions: <Widget>[
            new Container(
              decoration: boxDecoration(),
              child: new MaterialButton(
                child: new Text('NO',),
                onPressed: () {
                  Navigator.of(context).pop(false);
                },
              ),
            ),
            new Container(
              decoration: boxDecoration(),
              child: new MaterialButton(
                child: new Text('YES', ),
                onPressed: () {
                  Navigator.of(context).pop(true);
                },
              ),
            ),
          ],
        ),
      ) ??
      false;
}

问候, Mahi

非常简单地使用"then"在你推送后,当导航器弹出时,它将触发setState,视图将刷新。

领航员...废话的push()。然后(价值)= > setState署(){})