Flutter双击返回退出APP异常:首次点击时间差趋近于0问题排查
问题原因
你代码里的currentBackPressTime是静态变量,它的初始值是App类被加载时的DateTime.now()。如果这个类加载的时间和你首次点击返回按钮的间隔小于1200ms(比如热重载后立刻点击、应用启动后很快点击),就会触发直接退出的逻辑,而不是显示提示。哪怕你等应用渲染完成再点击,只要类加载到点击的时间差没超过1200ms,这个问题就会出现。
解决方法
把App改成StatefulWidget,把currentBackPressTime移到State类里维护,并初始化为一个远早于当前时间的值(比如纪元时间),这样首次点击时时间差必然大于1200ms,就能正常触发提示逻辑。修改后的代码如下:
class App extends StatefulWidget { const App({Key? key}) : super(key: key); @override State<App> createState() => _AppState(); } class _AppState extends State<App> { DateTime currentBackPressTime = DateTime.fromMillisecondsSinceEpoch(0); @override Widget build(BuildContext context) { return GetMaterialApp( title: "Flutter Demo", theme: ThemeData( primarySwatch: Colors.blue, ), builder: EasyLoading.init(), home: WillPopScope( onWillPop: () async { DateTime now = DateTime.now(); print(currentBackPressTime); print(now); if (now.difference(currentBackPressTime) > const Duration(milliseconds: 1200)) { currentBackPressTime = now; EasyLoading.showToast('Press agin to exit!', duration: const Duration(milliseconds: 1200)); return false; } return true; }, child: const MyLayout()), ); } }
补充说明
静态变量是类级别的全局变量,只会在类第一次加载时初始化一次。但在开发环境的热重载场景下,静态变量会被重新初始化,这也会导致你遇到的首次点击时间差过小的问题。改用StatefulWidget的成员变量后,状态会和Widget实例绑定,不会受类加载或热重载的影响,逻辑更可靠。
内容的提问来源于stack exchange,提问作者chi chen
相关产品推荐
相关产品推荐

