Flutter Android开发实用技巧

一,当前页面路由处在栈中“最底部”的位置时,按两次返回键退出app。

第一次按返回键弹出“再按一次退出”的提示。

  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。

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值