Flutter实现双击返回退出时点击返回键回到Main.dart而非退出应用如何解决
问题原因
你出现这个问题的核心原因有两个:
- 你从登录页跳转首页时使用的是
Navigator.push方法,登录页仍然存在于路由栈中,系统默认的pop返回操作会回到栈内上一个页面(也就是登录页) - 你当前
onWillPop中第二次点击返回true,代表允许系统执行默认的返回逻辑,自然就会跳回登录页
解决方案
方案1:修改登录跳转逻辑(更推荐)
登录成功跳转到首页时,清空路由栈中登录页的记录,让首页成为路由栈唯一的页面,此时默认返回操作就会直接退出应用。
将登录页中跳转首页的代码替换为:
// 直接替换当前路由,路由栈中仅保留首页 Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => 你的首页类名())); // 或者更彻底清空所有历史路由,适合有多级登录相关页面的场景 Navigator.pushAndRemoveUntil( context, MaterialPageRoute(builder: (context) => 你的首页类名()), (route) => false, // 清空所有之前的路由 );
该方案不需要修改你现有的首页WillPopScope代码即可生效。
方案2:修改首页返回逻辑(无需调整跳转逻辑)
直接在第二次点击返回时手动调用系统退出方法,不走默认的路由pop逻辑,首先需要导入对应包:
import 'package:flutter/services.dart'; // 如果需要兼容iOS强制退出可额外导入 import 'dart:io';
然后将你首页的onWillPop逻辑修改为:
onWillPop: () async { final difference = DateTime.now().difference(timeBackPressed ?? DateTime(2000)); final isExitWarning = difference >= const Duration(seconds: 2); timeBackPressed = DateTime.now(); if (isExitWarning) { const message = "Press Back Again To Exit"; Fluttertoast.showToast( msg: message, fontSize: 18, backgroundColor: Colors.white, textColor: Colors.black.withOpacity(0.95)); return false; } else { Fluttertoast.cancel(); // 安卓直接退出应用 SystemNavigator.pop(); // iOS如果需要强制退出可以用下面的代码,注意苹果官方不建议主动退出应用,可能影响审核 // exit(0); return false; // 阻止默认pop逻辑 } },
内容的提问来源于stack exchange,提问作者Abhi sharma
相关产品推荐
相关产品推荐

