是否有办法知道当前页面是否是Navigator Stack中的最后一个页面,并且此时调用Navigator.pop()将关闭应用程序?
Navigator.pop()
zfciruhq1#
您可以使用此代码检查路线是否为第一条:
ModalRoute.of(context).isFirst
所以完整的代码是
if(! ModalRoute.of(context).isFirst) Navigator.pop();
uwopmtnx2#
它没有关闭应用程序,它破坏了最后一条路线,显示黑屏。您可以使用以下命令关闭应用程序:Flutter how to programmatically exit the app并且您无法访问堆栈或历史记录,因为它在Navigator类Navigator._history中是私有的,但您可以使用此解决方案来检查当前路线是否是最后一条路线:
Navigator._history
Future<bool> isCurrentRouteFirst(BuildContext context) { var completer = new Completer<bool>(); Navigator.popUntil(context, (route) { completer.complete(route.isFirst); return true; }); return completer.future; }
brc7rcf03#
如果你只是想在应用程序退出之前处理一些事情,比如显示一个确认对话框,你可以使用WillPopScope。示例
WillPopScope
@override Widget build(BuildContext context) { return WillPopScope( onWillPop: _showDialog, child: Scaffold( body: Center( child: Text("This is the first page"), ), ), ); } Future<bool> _showDialog() { return showDialog( context: context, builder: (context) { return AlertDialog( title: Text("Are you sure?"), content: Text("You want to exit app"), actions: <Widget>[ FlatButton( child: Text("Yes"), onPressed: () => Navigator.of(context).pop(true), ), FlatButton( child: Text("No"), onPressed: () => Navigator.of(context).pop(false), ) ], ); }) ?? false; }
0mkxixxg4#
我在AppBar小部件的源代码中找到了这个。
AppBar
final ModalRoute<dynamic>? parentRoute = ModalRoute.of(context); final bool canPop = parentRoute?.canPop ?? false;
当canPop为false时,您位于根屏幕。
canPop
false
4条答案
按热度按时间zfciruhq1#
您可以使用此代码检查路线是否为第一条:
所以完整的代码是
uwopmtnx2#
它没有关闭应用程序,它破坏了最后一条路线,显示黑屏。
您可以使用以下命令关闭应用程序:Flutter how to programmatically exit the app
并且您无法访问堆栈或历史记录,因为它在Navigator类
Navigator._history
中是私有的,但您可以使用此解决方案来检查当前路线是否是最后一条路线:brc7rcf03#
如果你只是想在应用程序退出之前处理一些事情,比如显示一个确认对话框,你可以使用
WillPopScope
。示例
0mkxixxg4#
我在
AppBar
小部件的源代码中找到了这个。当
canPop
为false
时,您位于根屏幕。