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

Flutter中同时使用Snackbar、Splash Screen与Navigator时页面跳转失效

问题分析与解决方案

核心问题

点击登录按钮后无法跳转的原因有两个:

  1. getanimatedscreen()方法未传入页面的BuildContext,Navigator跳转必须依赖有效上下文,导致MySplashScreen内部无法触发路由切换。
  2. initState中提前调用了getanimatedscreen(),会导致页面刚初始化就尝试跳转,完全不符合登录流程逻辑。

修改步骤

1. 修正getanimatedscreen方法,传入Context参数

修改方法定义,让它接收当前页面的上下文,确保Navigator能正常工作:

void getanimatedscreen(BuildContext context) {
  MySplashScreen().getSplashScreen(context, HomePage());
}

2. 确保MySplashScreen的跳转逻辑正确

检查MySplashScreen类的getSplashScreen方法,必须通过传入的context执行Navigator操作,示例如下:

class MySplashScreen {
  void getSplashScreen(BuildContext context, Widget targetPage) {
    // 这里添加你需要的动画逻辑,比如延迟跳转配合动画
    Future.delayed(const Duration(seconds: 2), () {
      Navigator.pushReplacement(
        context,
        MaterialPageRoute(builder: (ctx) => targetPage),
      );
    });
  }
}

3. 调整登录按钮的回调逻辑

在点击登录按钮时,调用getanimatedscreen时传入当前context:

onPressed: () {
  final snackBar = SnackBar(
    content: const Text("You've been Successfully Signed In"),
    duration: const Duration(seconds: 2),
  );
  ScaffoldMessenger.of(context).showSnackBar(snackBar);
  // 传入context
  getanimatedscreen(context);
},

4. 删除initState中的错误调用

移除页面初始化时的跳转触发,否则页面一加载就会跳走,完全跳过登录流程:

@override
void initState() {
  // 删掉这一行:getanimatedscreen();
  super.initState();
}

额外优化提示

Sign-Up按钮中先执行Navigator.pushNamed再显示SnackBar的逻辑有问题,因为页面跳转后当前页面已被移出栈,SnackBar无法显示。可以调整为先显示SnackBar,再延迟跳转:

onPressed: () {
  final snackBar = SnackBar(
    content: const Text("Your Sign Up Page is Loading"),
    duration: const Duration(seconds: 2),
  );
  ScaffoldMessenger.of(context).showSnackBar(snackBar);
  // 延迟跳转,等SnackBar显示完成
  Future.delayed(const Duration(seconds: 2), () {
    Navigator.pushNamed(context, 'firstRoute');
  });
},

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:25:40