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

Flutter自定义Splashscreen启动页如何阻止返回键回退到启动页

Flutter阻止回退到Splash启动页的解决方案

问题根因

你当前使用Navigator.push方法跳转主页,会将MainScreen直接压入现有路由栈,Splash页面(MyHomePage)会一直保留在栈中,点击系统返回键默认会弹出栈顶路由,因此会回退到启动页。

最优解决方案

跳转主页时使用pushReplacement替代push,直接替换路由栈顶的Splash页面,跳转完成后Splash页面会被自动从路由栈移除,不存在回退的可能,也符合启动页的业务逻辑,无需额外拦截返回事件。
修改后的代码如下:

@override
void initState() {
  super.initState();
  Future.delayed(const Duration(seconds: 4), () {
    // 替换原有push方法为pushReplacement
    Navigator.of(context).pushReplacement(
      PageRouteBuilder(
        transitionDuration: const Duration(milliseconds: 1000),
        pageBuilder: (BuildContext context, Animation<double> animation,
            Animation<double> secondaryAnimation) {
          return MainScreen();
        },
        transitionsBuilder: (BuildContext context,
            Animation<double> animation,
            Animation<double> secondaryAnimation,
            Widget child) {
          return Align(
            child: FadeTransition(
              opacity: animation,
              child: child,
            ),
          );
        },
      ),
    );
  });
}

替代方案:拦截返回事件

如果有特殊场景需要保留Splash页面在路由栈中,可以在MainScreen外层包裹WillPopScope实现返回拦截,之前拦截不生效大概率是onWillPop方法返回值错误或者没有包裹在页面根节点:

class MainScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return WillPopScope(
      onWillPop: () async {
        // 返回false表示拦截当前返回事件,不执行路由弹出
        // 如需实现双击返回退出APP等逻辑可以在这里扩展
        return false;
      },
      child: const Scaffold(
        // 你的原有页面代码
      ),
    );
  }
}

内容的提问来源于stack exchange,提问作者D3vr00T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 01:36:04