我已经为这个问题苦苦挣扎了几天,但一直找不到解决方案,因此发了这篇文章。 在我的应用程序中的某个时刻,我需要从导航器堆栈中弹出 2 条路线并推送一条新路线。在研究了执行此操作的最佳方法之后,我发现使用
pushNamedAndRemoveUntil
是最好的方法,因为我可以指定 ModalRoute.withName('/<route_name>')
,它会弹出路线,直到到达 /<route_name>
,此时它将停止并推送新路线。这是我一直在使用的线路Navigator.of(context).pushNamedAndRemoveUntil('/raceadmin_reporting', ModalRoute.withName('/raceadmin_page'));
。
但我的问题是它对我不起作用。我在
/<route_name>
中输入什么似乎并不重要,pushNamedAndRemoveUntil
会弹出所有路线,这让我相信 ModalRoute.withName
永远不会返回 true。
我也尝试过
Navigator.of(context).pushNamedAndRemoveUntil('/raceadmin_reporting', (route) => route == RaceAdminPage.route());
,也没有用。
当我查看调试器时,我看到的是: 应用程序导航器堆栈
我尝试弹出的路线是
RaceAdmin
页面,该页面显然在堆栈中。在该类的定义中,我添加了行 static const routeName = '/raceadmin_page';
,这就是我在 ModalRoute.withName('/raceadmin_name')
中所说的内容,但它不起作用。
我的路线在
routes.dart
文件中定义,如下所示:
static Route<dynamic> generateRoute(RouteSettings settings) {
switch (settings.name) {
case '/':
return MaterialPageRoute(builder: (context) => RailMeatApp());
case '/raceadmin_page':
return MaterialPageRoute(builder: (context) => const RaceAdminPage());
case '/raceadmin_pendinglist':
return MaterialPageRoute(builder: (context) => PendingResultsList());
case '/raceadmin_pendingresults':
final args = settings.arguments as Map<String?, String?>;
return MaterialPageRoute(
builder: (context) => PendingResultsPage(
raceId: args['raceId'] as String,
));
case '/raceadmin_reporting':
return MaterialPageRoute(builder: (context) => RaceAdminReporting());
default:
return _errorRoute();
}
}
我的
MaterialApp
定义如下:
return MaterialApp(
navigatorKey: _navigatorKey,
home: _railmeatHome(),
onGenerateRoute: RailmeatRoutes.generateRoute,
);
}
在 Flutter 调试器中,我可以查看
MaterialApp
小部件,我可以在其状态中看到导航器的 _history
属性中有 4 个条目,如下所示:
MaterialApp 小部件属性
如果我单击
_history
中的任何条目,我会看到如下相同的信息:
_history 中的路线属性
如你所见,
name
下的_settings
属性是null
,在我看来,这可以解释为什么ModalRoute.withName
找不到正确的路线,但我不确定我的想法是否准确.
我应该采取哪些不同措施才能使
pushNamedAndRemoveUntil
发挥作用?
提前非常感谢, 伯特兰。
试试这个吧
Navigator.of(context)
.pushNamedAndRemoveUntil('/routename', (Route<dynamic> route) => false);
Or
Navigator.of(context).popUntil(ModalRoute.withName('/root'));
你对此有答案吗?我想删除顶部的一些路线,直到特定路线(在您的情况下是 /raceadmin_page )。我尝试使用 pushNamedAndRemoveUntil('/to_route', ModalRoute.withName('/history_specific_route')) 并清除所有历史记录。我正在寻找这个问题的解决方案。我的目的是仍然保留导航历史记录,只清除导航器堆栈顶部的 4 条路线并刷新我推送到的页面。