Flutter点击GestureDetector调用showSearch跳转报StackOverflowError如何解决
报错原因
从报错堆栈可以看到Navigator.push方法出现无限递归调用,最终触发栈溢出,核心诱因通常为以下三类:
- 你对
Navigator.push方法做了自定义重写/扩展,重写逻辑中没有正确调用父类的push实现,反而重复调用自身的push方法,形成无限递归 - 你传入
PatientSearchBarDelegate的父上下文被错误使用,在PatientSearchBarDelegate的初始化、build相关生命周期方法中,未加限制条件就触发了showSearch或者Navigator.push逻辑,每次跳转后又会再次执行跳转逻辑,形成无限循环 - 项目中存在嵌套
Navigator的场景,调用跳转时默认获取到子Navigator实例,子Navigator的push逻辑实现错误触发递归
修复方案
- 优先检查项目中是否对
Navigator类做了自定义扩展、重写了push方法:
如果存在重写逻辑,确保方法内调用的是父类的push实现,不要调用自身的push方法,示例正确写法:
@override Future<T?> push<T extends Object?>(Route<T> route) { // 自定义逻辑(埋点、权限校验等) return super.push(route); // 禁止替换为this.push(route) }
- 检查
PatientSearchBarDelegate的相关实现:
不要在delegate的buildSuggestions、buildResults、build等高频触发生命周期方法中执行showSearch、Navigator.push等跳转逻辑;如果确实有跳转需求,必须添加触发条件限制,避免每次build都执行跳转。
不需要额外给delegate传递父上下文,showSearch只要传入当前路由树内的有效context即可,可先简化原有写法验证:
GestureDetector( child: textField, onTap: () { showSearch(context: context, delegate: PatientSearchBarDelegate()); }, )
- 存在嵌套Navigator场景的适配:
如果项目有多路由栈嵌套的实现,需要指定使用根Navigator执行跳转,调整写法如下:
GestureDetector( child: textField, onTap: () { final rootContext = Navigator.of(context, rootNavigator: true).context; showSearch(context: rootContext, delegate: PatientSearchBarDelegate()); }, )
内容的提问来源于stack exchange,提问作者xie
相关产品推荐
相关产品推荐

