【发布时间】:2023-03-16 13:48:01
【问题描述】:
有没有办法知道当前页面是否是导航器堆栈中的最后一页,此时调用Navigator.pop() 将关闭应用程序?
【问题讨论】:
标签: flutter
有没有办法知道当前页面是否是导航器堆栈中的最后一页,此时调用Navigator.pop() 将关闭应用程序?
【问题讨论】:
标签: flutter
您可以使用此代码检查路线是否是第一条:
ModalRoute.of(context).isFirst
所以完整的代码将是
if(! ModalRoute.of(context).isFirst)
Navigator.pop();
【讨论】:
如果您只想在应用程序退出之前处理一些事情。就像显示确认对话框一样,您可以使用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;
}
【讨论】:
它没有关闭应用它破坏了最后一个路由显示黑屏。
您可以使用以下命令关闭应用程序:Flutter how to programmatically exit the app
并且您无法访问堆栈或历史记录,因为它在 Navigator 类 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;
}
【讨论】: