Flutter 主页面双击返回键退出应用不返回历史页面如何实现?
问题原因
你的原实现中onWillPop返回true时会执行系统默认返回逻辑,即弹出当前路由栈顶页面。如果进入主页面时未清空之前的路由栈,主页面并非路由栈唯一页面,默认返回行为就会依次退回历史页面,不会直接退出应用。
解决方案
方案1:跳转主页面时清空路由栈(推荐)
在从其他页面(如欢迎页、登录页)跳转进入主页面时,使用pushAndRemoveUntil方法清除所有历史路由,让主页面成为路由栈唯一页面,此时原有的双击返回逻辑即可正常触发退出应用。
跳转示例代码:
Navigator.of(context).pushAndRemoveUntil( MaterialPageRoute(builder: (context) => const HomePage()), (route) => false // 移除所有历史路由 );
方案2:修改返回逻辑主动退出应用(兜底)
主动调用系统退出方法,跳过路由弹栈逻辑,直接关闭应用,无需依赖路由栈状态。
首先引入系统服务依赖:
import 'package:flutter/services.dart';
修改后的WillPopScope逻辑代码:
// 在State类中声明变量存储上次点击时间 DateTime preBackpress = DateTime.now(); @override Widget build(BuildContext context) { return WillPopScope( onWillPop: () async { final timeGap = DateTime.now().difference(preBackpress); final cantExit = timeGap >= const Duration(seconds: 2); preBackpress = DateTime.now(); if(cantExit){ const snack = SnackBar( content: Text('再按一次返回键退出应用'), duration: Duration(seconds: 2), ); ScaffoldMessenger.of(context).showSnackBar(snack); return false; }else{ // 直接调用系统退出方法 SystemNavigator.pop(); return true; } }, child: const Scaffold( // 主页面原有内容 ), ); }
适配说明
Flutter 3.16及以上版本中WillPopScope已被标记为弃用,推荐使用PopScope组件实现相同逻辑,适配高版本系统返回手势,代码示例:
import 'package:flutter/services.dart'; // 在State类中声明变量存储上次点击时间 DateTime preBackpress = DateTime.now(); @override Widget build(BuildContext context) { return PopScope( canPop: false, onPopInvoked: (didPop) { if (didPop) return; final timeGap = DateTime.now().difference(preBackpress); final cantExit = timeGap >= const Duration(seconds: 2); preBackpress = DateTime.now(); if(cantExit){ const snack = SnackBar( content: Text('再按一次返回键退出应用'), duration: Duration(seconds: 2), ); ScaffoldMessenger.of(context).showSnackBar(snack); }else{ SystemNavigator.pop(); } }, child: const Scaffold( // 主页面原有内容 ), ); }
内容的提问来源于stack exchange,提问作者mafortis
相关产品推荐
相关产品推荐

