You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:20:36