GetX状态管理下使用Get.rootDelegate导航详情页触发key断言错误
错误原因及解决方案
核心报错诱因
!keyReservation.contains(key)报错本质是路由页面出现重复的GlobalKey,结合你的代码配置,具体由两个问题触发:
- 子路由跳转路径错误:你将
DETAIL_MOVIE配置为HOME_MOVIE的嵌套子路由,嵌套子路由的完整路径为「父路由路径+子路由路径」,直接传DETAIL_MOVIE的局部路径调用根路由跳转时,根路由找不到对应独立路径的页面,会重复生成页面Key触发冲突 - 复用组件未配置唯一Key:电影和电视的两个详情路由都返回同一个
const DetailPage()组件,const组件默认复用同一个GlobalKey,嵌套路由跳转时会触发重复Key校验报错
修复方案
可根据你的业务需求选择任意一种方案修复:
- 调整跳转路径,嵌套子路由跳转时传入完整路径
onTap: () { // 拼接父路由路径+子路由路径,也可以直接在AppRoutes里把DETAIL_MOVIE定义为完整路径 Get.rootDelegate.toNamed('${AppRoutes.HOME_MOVIE}${AppRoutes.DETAIL_MOVIE}'); }
- 将详情路由从父路由的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(), ), ]; }
- 保留嵌套路由结构的前提下,给两个详情页传入不同的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(), ),
- 改用当前页面的路由跳转方法,自动适配嵌套路由路径
onTap: () { Get.toNamed(AppRoutes.DETAIL_MOVIE); }
内容的提问来源于stack exchange,提问作者Hazar Belge
相关产品推荐
相关产品推荐

