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
相关产品推荐
相关产品推荐

