使用Navigator时GetPage绑定失效:GetView找不到已注册控制器
方案一:修改Bindings,将控制器注册到对应Navigator的实例中
问题核心是:指定Navigator ID跳转时,页面所在的是独立的GetInstance容器,而默认Bindings会把控制器注册到全局容器,导致页面找不到控制器。修改Bindings,明确把控制器注册到目标Navigator对应的实例里:
class DetailsPageBindings extends Bindings { final String navigatorId; DetailsPageBindings({required this.navigatorId}); @override void dependencies() { // 获取对应ID的GetInstance并注册控制器 Get.instanceFor(id: navigatorId).put(DetailsPageController()); } }
生成GetPage时传入匹配的Navigator ID:
GetPage( name: "/detailsPage", page: () => const DetailsPage(), // 此处ID需与跳转时传入的id完全一致 binding: DetailsPageBindings(navigatorId: "your_target_navigator_id"), )
方案二:修改GetView,指定从对应Navigator实例获取控制器
如果不想改动Bindings逻辑,可以重写GetView的controller getter,强制从目标Navigator的实例中获取控制器:
class DetailsPage extends GetView<DetailsPageController> { const DetailsPage({super.key}); // 与跳转时传入的Navigator ID保持一致 final String navigatorId = "your_target_navigator_id"; @override DetailsPageController get controller { return Get.instanceFor(id: navigatorId).find<DetailsPageController>(); } @override Widget build(BuildContext context) { // 正常使用controller即可 return Scaffold( body: Center(child: Text(controller.someData)), ); } }
关键注意事项
- 跳转时传入的
id必须和Bindings/GetView中使用的ID完全匹配,大小写、特殊字符都不能出错 - 若使用
Get.lazyPut或Get.create注册控制器,同样需要通过Get.instanceFor(id: ...)指定对应实例
内容的提问来源于stack exchange,提问作者AviKenz
相关产品推荐
相关产品推荐

