第一次按返回键弹出“再按一次退出”的提示。
DateTime? lastPressedTime; //上一次的最后点击时间
@override
Widget build(BuildContext context) {
return PopScope(
canPop: false,
onPopInvoked: (bool didPop) {
if (didPop) return;
SmartDialog.showToast('再按一次退出', alignment: Alignment.center);
if (lastPressedTime == null ||
DateTime.now().difference(lastPressedTime!) >
const Duration(seconds: 1)) {
// 两次点击间隔超过1秒则重新计时
lastPressedTime = DateTime.now();
return;
}
SystemNavigator.pop();
},
child: widget.child,
);
}
在摸索如何使用自定义返回图标或按钮时发现了Navigator.of(context).canPop(),Navigator.of(context).maybePop() 这两个方法很有意思。当配合PopScope Widget一起使用时竟和上面“按两次返回键退出app”有同样的效果。
pageBack() {
Navigator.of(context).maybePop();
}
canPop(): 这个方法用于检查当前路由栈是否可以执行弹出(pop)操作,也就是是否可以返回到上一个页面。它返回一个布尔值,如果返回true,表示可以执行pop操作,存在可以返回的上一个页面;如果返回false,表示无法执行pop操作,因为当前已经是路由栈的底部,没有更多的页面可以返回。
bool canPop = Navigator.of(context).canPop();
if (canPop) {
// 可以执行pop操作
} else {
// 无法执行pop操作
}
maybePop(): 这个方法尝试执行弹出(pop)操作,但与pop()方法不同的是,它不会抛出异常,即使路由栈已经为空。当你不确定是否可以安全地执行pop操作时,可以使用这个方法。
Navigator.of(context).maybePop();
maybePop()会返回一个Future,当pop操作成功时,future的结果为true,否则为false。你可以选择等待future的结果来确定pop操作是否成功:
Future<bool> result = Navigator.of(context).maybePop();
result.then((bool success) {
if (success) {
// pop操作成功
} else {
// pop操作失败或者被取消
}
});
总的来说,canPop()用于检查是否可以执行pop操作,而maybePop()用于尝试执行一个可能的安全的pop操作,并提供了一个可以处理结果的future。