dart 按下后退按钮后如何刷新页面

hivapdat  于 2023-03-27  发布在  其他
关注(0)|答案(7)|浏览(160)

我有一个“列表页面”。和一个添加页面。用户点击“添加页面”,进入一个新的页面,他们添加一些实体。然后我弹出导航器,用户回到“列表页面”。
在这一点上,我想得到通知,不知何故-回调也许?覆盖一个方法,我不是很确定-并重新读取数据库中的信息。
在Flutter中有没有这样的钩子?或者我应该使用另一种模式?

ycl3bljg

ycl3bljg1#

Navigator.push方法返回Route的泛型类型的future:

Navigator.of(context)
  .push(new MaterialPageRoute<String>(...))
  .then((String value) {
    print(value);
  });

在新的路由中,当你有你需要的值时:

Navigator.of(context).pop('String');
nnt7mjpx

nnt7mjpx2#

如果在列表页面上创建函数retrieveData()来读取数据列表,然后在initState中调用它,如果使用pushNamed路由,简单的解决方案是

Navigator.pushNamed(context, '/adddatapage').whenComplete(retrieveData());

如果你用的是推送路由

Navigator.of(context).push(new MaterialPageRoute(builder: (context) => AddPage())).whenComplete(retrieveData);

这应该是足够的。没有必要在添加页面上的额外代码。这将是工程,如果用户按下返回按钮也,再次,没有额外的代码在添加页面。

zz2j4svz

zz2j4svz3#

在@ian的答案中添加选项

Navigator.of(context)
  .push(new MaterialPageRoute<String>(...))
  .then((value) => setState(() => {}));

这对我很有效。每当页面加载时,它都会重建。

carvr3hs

carvr3hs4#

当重定向到屏幕2时,在下面写代码,

Navigator.pushNamed(context, '/screen2').then((_) {
  // This block runs when you have returned back from screen 2.
  setState(() {
    // code here to refresh data
  });
});

使用
导航器.pop(上下文);
从屏幕2到屏幕1

gupuwyp2

gupuwyp25#

我将一个回调方法作为Navigator路由参数传递到“add”页面。回调是我的列表页面中的一个方法。“add”页面在退出时执行回调。然后回调方法只是刷新数据并调用setState刷新屏幕。
我的架构使用Provider和视图模型,但在标准应用程序中也应该是直接的。

2ul0zpep

2ul0zpep6#

对于命名路由:

Navigator.pushNamed(context, '/page2').then((_) {
  // This block runs when you have returned back to the 1st Page from 2nd.
  setState(() {
    // Call setState to refresh the page.
  });
});

对于未命名路由:

Navigator.push(context, MaterialPageRoute(builder: (_) => Page2())).then((_) {
  // This block runs when you have come back to the 1st Page from 2nd.
  setState(() {
    // Call setState to refresh the page.
  });
});
siv3szwd

siv3szwd7#

我使用Navigator.pushAndRemoveUntil,它将刷新页面并再次加载数据,这是示例:

Navigator.pushAndRemoveUntil(
        context,
        MaterialPageRoute(
            builder: (context) =>
                CustomerMainPage()),
            (Route<dynamic> route) =>
        false);

更新2023,如果你使用GetX,你可以用这个例子:

Get.toNamed(
  routeName,
  arguments: params,
)?.whenComplete(() => doTheProcess());

相关问题