Flutter导航:如何返回至索引1并清除所有推送历史?
解决方案:返回指定索引页面并清除路由历史
当然可以实现!Flutter的Navigator组件已经提供了现成的API来完成这个需求,不需要自己写类似returnToIndex0的方法,下面分两种场景给你具体实现方式:
1. 如果你用的是命名路由
假设你要返回的索引1页面对应的路由名称是'/secondPage'(你可以根据自己的实际命名调整),直接用popUntil方法匹配路由名称即可:
Navigator.popUntil(context, ModalRoute.withName('/secondPage'));
这个方法会持续弹出当前栈顶的页面,直到找到你指定名称的路由为止,自动清除该路由之上的所有历史页面。
2. 如果你用的是匿名路由(像你代码里的MaterialPageRoute)
这种情况下可以通过判断路由在栈中的索引来实现,直接在popUntil的回调里做索引校验:
Navigator.popUntil(context, (route) { // 获取当前路由在栈中的位置 final routeIndex = Navigator.of(context).routes.indexOf(route); // 当索引等于1时停止弹出,保留该页面及以下的路由 return routeIndex == 1; });
这里要注意:Navigator.routes返回的列表里,索引0是APP启动的初始页面,索引1就是你要返回的目标页面,完全符合你的需求。
替换你现有代码的示例
把你原来的Navigator.pop(context);替换成上面的代码即可,修改后的完整代码如下:
new ListTile( title: new RaisedButton( child: new Text("返回至索引1页面"), onPressed: () { // 匿名路由场景的实现 Navigator.popUntil(context, (route) { final routeIndex = Navigator.of(context).routes.indexOf(route); return routeIndex == 1; }); // 如果是命名路由,注释掉上面的代码,用下面这行 // Navigator.popUntil(context, ModalRoute.withName('/secondPage')); }, ), ),
小提示:如果不确定目标页面的索引,可以先打印Navigator.of(context).routes.length查看栈的深度,或者打印每个路由的信息来确认位置,避免索引写错~
内容的提问来源于stack exchange,提问作者IrishGringo
相关产品推荐
相关产品推荐

