PopScope实现双击返回退出APP仅显示空白屏,如何正确实现?
解决PopScope双击返回退出APP显示空白屏的问题
问题原因
你的代码中,当判断需要退出时调用了Navigator.of(context).pop(),但这只是从导航栈中移除当前页面。如果当前是应用的根页面,pop后导航栈为空,就会显示空白屏,而非真正退出应用。
正确实现方案
需要替换导航栈pop的逻辑为退出整个应用,同时适配Android和iOS平台:
修改后的完整代码
import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:fluttertoast/fluttertoast.dart'; class RootScaffold extends StatefulWidget { final Widget body; const RootScaffold({required this.body, super.key}); @override State<RootScaffold> createState() => _RootScaffoldState(); } class _RootScaffoldState extends State<RootScaffold> { DateTime? lastBackPressTime; bool onWillPop() { DateTime now = DateTime.now(); if (lastBackPressTime == null || now.difference(lastBackPressTime!) > const Duration(seconds: 2)) { lastBackPressTime = now; Fluttertoast.showToast(msg: 'Press back again to exit.'); return false; } return true; } @override Widget build(BuildContext context) { return PopScope( canPop: false, onPopInvoked: (bool didPop) async { if (didPop) return; final shouldPop = onWillPop(); if (shouldPop && context.mounted) { // 退出整个应用,而非仅pop导航栈 SystemNavigator.pop(); // 针对iOS平台的额外处理(可选):如果SystemNavigator.pop不生效,可使用下面的代码 // if (Platform.isIOS) { // exit(0); // } else { // SystemNavigator.pop(); // } } }, child: Scaffold(body: widget.body), ); } }
关键修改点
- 引入
flutter/services.dart包,使用SystemNavigator.pop()方法退出应用,这是Flutter官方推荐的退出方式,会正确清理应用资源。 - 移除
Navigator.of(context).pop(),替换为SystemNavigator.pop(),避免根页面pop后出现空白。 - 可选:针对iOS平台,若
SystemNavigator.pop()不生效(iOS默认无物理返回键,双击退出场景较少),可结合Platform判断使用exit(0),但需注意exit(0)是强制退出,可能不会触发应用生命周期回调。
额外说明
canPop: false必须保留,这样才能拦截系统返回事件,交由onPopInvoked处理。- 双击时间间隔的逻辑保持不变,确保用户在2秒内双击才会触发退出。
内容的提问来源于stack exchange,提问作者deka
相关产品推荐
相关产品推荐

