是否可以使用 navigator.pop 刷新或重新加载页面...比如第 1(nav.push=>2)页面到第 2 页,然后从第 2(nav.pop,值)返回到第 1 页?

Posted

技术标签:

【中文标题】是否可以使用 navigator.pop 刷新或重新加载页面...比如第 1(nav.push=>2)页面到第 2 页,然后从第 2(nav.pop,值)返回到第 1 页?【英文标题】:is it possible to refresh or reload page with navigator.pop... like 1st (nav.push=>2) page to 2nd page and back from 2nd (nav.pop, value) to 1st page? 【发布时间】:2019-09-10 04:51:37 【问题描述】:

我想使用 navigator.pop 将值从第二页传递到第一页并使用 initstate 中的新值刷新或重新加载我的第一页或任何其他解决方法?

我能够在第一页中获取这些值,但无法使用 initstate 中的新值刷新或重新加载页面,我想在 API 中传递新数据 n 获取响应...

有什么帮助吗?

我正在从这里重定向到列表页面...

getBrand(BuildContext context) async 
    tempBrand = await Navigator.push(context,
        MaterialPageRoute(builder: (context) => BrandList(widget.subCatID)));
    selectedBrand = tempBrand.name;
    selectedBrandID = tempBrand.id;
  

现在我在 navigator.pop 中传递这些值

在此处获取价值并返回第一页。

Container(
          padding: EdgeInsets.all(10),
          child: ListView.separated(
              separatorBuilder: (context, index) =>
                  Divider(color: Color(0xffcccccc)),
              itemCount: prodBrands.length,
              itemBuilder: (BuildContext context, int index) 
                return GestureDetector(
                  child: InkWell(
                    onTap: () 
                      tempProdBrand = ProdBrandListModel.Message(
                        id: prodBrands[index].id,
                        name: prodBrands[index].name,
                      );

                      Navigator.pop(context, tempProdBrand);

                    ,
                    child: Container(
                      child: Text(prodBrands[index].name),
                      padding: EdgeInsets.all(10.0),
                    ),
                  ),
                );
              ),
        )

想在这里使用新值...

submitProduct() 
    api
        .newbiz(
      selectedBrandID,
    )
        .then((response) 
      setState(() 
        productID = response.message;
      );
    );
    setState(() );
  

当我使用 pop 函数中传递的新值返回第一页时,只想从 initstate 或任何其他方式刷新我的页面。

【问题讨论】:

你必须在从Navigator.push()返回后重建你的第一页——例如通过调用State#setState()方法 请添加代码示例?我已经尝试过,但是从第二页(弹回第一页)开始……第一页甚至不接受 setstate.. 这是 3 分钟的谷歌搜索:***.com/a/49806432/2252830 感谢链接 Force Flutter navigator to reload state when popping的可能重复 【参考方案1】:

从第1页导航到第2页

通常你使用 Navigator.push() 例如:

// Page1
    Navigator.push(context, MaterialPageRoute(builder: (context) => Page2()));

当您在 Page2 中时,您会做一些工作,例如将一些数据保存在共享首选项中,然后返回到 Page1 并刷新 Page1 以从共享首选项中获取新数据,您可以做的是使用弹出到 Page1

//Page2
    Navigator.pop(context);

这不足以刷新您的 Page1 所以你需要在 Page1 Navigator 中附加一个 .then 作为回调,当你从 page2 弹出时它将被调用,并且 .then 应该有一个设置状态来触发重建只需在设置状态内调用一个东西来导致重建 像这样:

//Page1
    Navigator.push(context, MaterialPageRoute(builder: (context) => Page2())).then((value) 
                  setState(() 
                    // refresh state of Page1
                  );
                );

【讨论】:

以上是关于是否可以使用 navigator.pop 刷新或重新加载页面...比如第 1(nav.push=>2)页面到第 2 页,然后从第 2(nav.pop,值)返回到第 1 页?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 从 AppBar 返回上一页不会刷新页面,使用 Navigator.pop(context)

如何在 Navigator.Pop 或 Push 中刷新状态

允许获取 chrome 浏览器通知后如何刷新或重定向用户?

来自 FutureBuilder 的 Navigator.pop

Navigator.pop() - 如何传递 `context` 以供导航器读取 -

使用 page_transition 更改 Navigator.pop() 动画持续时间