【问题标题】:How to refresh state when navigating back导航返回时如何刷新状态
【发布时间】:2020-02-16 21:15:08
【问题描述】:

我希望能够导航到我的应用程序中的上一页,但我不希望该页面保持之前的状态。我该怎么做呢?

【问题讨论】:

    标签: flutter dart navigation


    【解决方案1】:

    返回上一页后可以在Navigator中使用then调用setState:

    Navigator.push(context,MaterialPageRoute(builder: (context) =>NextPage())).then((_) {
      setState(() {});
    });
    

    【讨论】:

    • 我希望在导航回页面时进行重建,而不是在离开页面时进行重建。
    • 当你回到页面时它正在重建。当您从 NextPage 返回时,推送到 NextPage 的页面将重建。 "then" 在完成某事时使用,所以当你从 NextPage 返回时,Navigator.push 完成,它会运行 "then" 中的代码
    【解决方案2】:

    您使用哪种状态管理?

    如果是经典的 stful stless,您可能需要回调。

    假设您在下一页

                 onPressed: () {
                    // return to the parent ancestor the [value]
                    Navigator.pop(context, value);
                  },
    

    您返回带有一些“价值”的上一页; 您需要修改让您处理推送到下一页的 Navigator;

     onPressed: () async {
                      var value = await Navigator.push(
                        context,
                        MaterialPageRoute(
                          builder: (context) {
                            return SecondPage();
                          },
                        ),
                      );
                      // get the callback
                      // handle error
                      if (value != null) {
                        try {
                          setState(() {
                            // update your current state by the value you get from the second page
                             myUserName = value;
                          });
                        } catch (e) {
                          print('Errors');
                        }
                      }
                    },
    

    您可以通过多种方式实现这一目标。如果您正在使用其他状态管理,请告诉我。

    【讨论】:

    • 我好像没有解释清楚。我没有将数据从第二页发送到第一页。假设我在第 1 页上发出一些 api 请求以加载一些帖子,我导航到第 2 页,然后返回第 1 页,我第一次访问第 1 页时加载的帖子仍然存在......我想要当我返回第 1 页时,它会发出另一个 api 请求。我正在使用 Provider btw。
    【解决方案3】:

    你可以管理你知道的价值吗? 想象一下这个值是'bool':

        onPressed: () async {
                  var value = await Navigator.push(
                    context,
                    MaterialPageRoute(
                      builder: (context) {
                        return SecondPage();
                      },
                    ),
                  );
                  // get the callback
                  // handle error
                  if (value) {
                    try {
                      // reload your api call ?
                    } catch (e) {
                      print('Errors');
                    }
                  }
                },
    

    您还可以通过从顶部手动滚动来将数据包装在刷新指示器中以刷新数据。在这种情况下,您可以随时刷新您的 api 调用...

    这样想,您的页面数据需要以某种方式重建以刷新数据。通过只是导航回来它不会。屏幕需要来自某个地方的命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 2016-08-10
      • 2021-04-30
      • 2012-08-12
      • 1970-01-01
      相关资源
      最近更新 更多