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

GetX状态管理下使用Get.rootDelegate导航详情页触发key断言错误

错误原因及解决方案

核心报错诱因

!keyReservation.contains(key)报错本质是路由页面出现重复的GlobalKey,结合你的代码配置,具体由两个问题触发:

  • 子路由跳转路径错误:你将DETAIL_MOVIE配置为HOME_MOVIE的嵌套子路由,嵌套子路由的完整路径为「父路由路径+子路由路径」,直接传DETAIL_MOVIE的局部路径调用根路由跳转时,根路由找不到对应独立路径的页面,会重复生成页面Key触发冲突
  • 复用组件未配置唯一Key:电影和电视的两个详情路由都返回同一个const DetailPage()组件,const组件默认复用同一个GlobalKey,嵌套路由跳转时会触发重复Key校验报错

修复方案

可根据你的业务需求选择任意一种方案修复:

  1. 调整跳转路径,嵌套子路由跳转时传入完整路径
onTap: () {
  // 拼接父路由路径+子路由路径,也可以直接在AppRoutes里把DETAIL_MOVIE定义为完整路径
  Get.rootDelegate.toNamed('${AppRoutes.HOME_MOVIE}${AppRoutes.DETAIL_MOVIE}');
}
  1. 将详情路由从父路由的children中移出,作为和START平级的独立路由,即可直接用根路由跳转
class AppPages {
  static final List<GetPage<dynamic>> routes = <GetPage<dynamic>>[
    GetPage<dynamic>(
      name: AppRoutes.START,
      // 原有配置保持不变,children中删除详情路由配置
    ),
    // 新增独立的详情路由
    GetPage<dynamic>(
      name: AppRoutes.DETAIL_MOVIE,
      page: () => const DetailPage(),
      transition: Transition.cupertino,
      binding: DetailPageBinding(),
    ),
    GetPage<dynamic>(
      name: AppRoutes.DETAIL_TV,
      page: () => const DetailPage(),
      transition: Transition.cupertino,
      binding: DetailPageBinding(),
    ),
  ];
}
  1. 保留嵌套路由结构的前提下,给两个详情页传入不同的Key避免复用冲突
// 电影详情路由配置
GetPage<dynamic>(
  name: AppRoutes.DETAIL_MOVIE,
  page: () => DetailPage(key: Key('movie_detail')),
  transition: Transition.cupertino,
  binding: DetailPageBinding(),
),
// 电视详情路由配置
GetPage<dynamic>(
  name: AppRoutes.DETAIL_TV,
  page: () => DetailPage(key: Key('tv_detail')),
  transition: Transition.cupertino,
  binding: DetailPageBinding(),
),
  1. 改用当前页面的路由跳转方法,自动适配嵌套路由路径
onTap: () {
  Get.toNamed(AppRoutes.DETAIL_MOVIE);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:12:03