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

Flutter点击GestureDetector调用showSearch跳转报StackOverflowError如何解决

报错原因

从报错堆栈可以看到Navigator.push方法出现无限递归调用,最终触发栈溢出,核心诱因通常为以下三类:

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:54:02