Flutter执行Navigator.pop(context)时出现RangeError等手势异常该如何解决?
问题产生原因
报错栈中出现的CupertinoBackGestureController相关日志说明错误触发和iOS风格的侧滑返回手势直接相关,根本原因是重复执行pop操作导致路由栈索引越界:
当你点击返回按钮执行Navigator.pop的同时,不小心触发了系统自带的侧滑返回手势,两个pop逻辑同时执行:第一次pop已经把当前页面从路由栈弹出,第二次pop执行时路由栈对应索引变为-1,就会抛出越界错误。部分场景下如果你的页面存在异步回调隐性调用pop的逻辑,也会触发同样的问题。
修复方案
方案1:pop前先判断路由是否可弹出
修改返回按钮的点击逻辑,调用Navigator.canPop先判断当前是否还有可弹出的路由,再执行pop操作,避免空弹:
GestureDetector( onTap: () { if (Navigator.canPop(context)) { Navigator.pop(context); } }, child: Padding( padding: EdgeInsets.only( top: size.width * .010, left: size.width * .025, ), child: SvgPicture.asset( "assets/arrow-left-s-line.svg", ), ), ),
方案2:禁用当前页面的侧滑返回手势
从根源避免手势和点击返回的逻辑冲突,可选两种实现:
- 使用
MaterialPageRoute时设置全屏对话框属性:
Navigator.push( context, MaterialPageRoute( builder: (context) => const CreateAccountPage(), fullscreenDialog: true, ), );
- 改用
CupertinoPageRoute直接关闭侧滑手势:
Navigator.push( context, CupertinoPageRoute( builder: (context) => const CreateAccountPage(), popGesture: false, ), );
方案3:全局关闭Cupertino侧滑返回手势
如果你的应用不需要适配iOS侧滑返回的交互特性,可以在MaterialApp的主题配置中统一关闭:
MaterialApp( theme: ThemeData( pageTransitionsTheme: const PageTransitionsTheme( builders: { TargetPlatform.iOS: CupertinoPageTransitionsBuilder(allowSnapshotting: false), TargetPlatform.android: ZoomPageTransitionsBuilder(), }, ), ), // 其余原有配置保持不变 )
内容的提问来源于stack exchange,提问作者roee attias
相关产品推荐
相关产品推荐

