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。

你可能感兴趣的:(Flutter,flutter)