Flutter中同时使用Snackbar、Splash Screen与Navigator时页面跳转失效
问题分析与解决方案
核心问题
点击登录按钮后无法跳转的原因有两个:
getanimatedscreen()方法未传入页面的BuildContext,Navigator跳转必须依赖有效上下文,导致MySplashScreen内部无法触发路由切换。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
相关产品推荐
相关产品推荐

