Flutter使用flutter_phoenix执行rebirth后无法跳转指定页面如何解决
Flutter phoenix rebirth后无法跳转指定页面的解决方案
问题根因
你现有代码的问题在于Phoenix.rebirth是异步触发的Widget树重建操作,执行完rebirth方法后立刻调用的navigatorKey.currentState?.pushNamed,用的是重建前已经失效的导航器实例:rebirth会销毁旧的根Widget树、生成新的实例,旧的navigatorKey关联的State已经被释放,跳转操作自然不会作用到新的应用实例上,所以只会展示重建后的首页。
解决方案
核心逻辑是提前存储待跳转的路由信息,等rebirth完成、新的应用实例完全初始化后,再读取存储的信息执行跳转。
具体实现步骤
- 定义全局的待跳转配置存储(flutter_phoenix的rebirth仅重建Widget树,不会清空内存全局变量,因此可以直接用内存存储,无需落盘)
/// 待跳转路由配置 class PendingRouteConfig { final String routeName; final dynamic arguments; PendingRouteConfig({ required this.routeName, this.arguments, }); } // 全局变量存储待跳转任务 PendingRouteConfig? globalPendingRoute;
- 调整通知点击时的逻辑,先存待跳转配置再执行rebirth
// 先存储待跳转的任务详情页配置 globalPendingRoute = PendingRouteConfig( routeName: taskDetailsRoute, arguments: TaskDetailsPageArgs(taskId: taskId), ); // 再执行应用重建 Phoenix.rebirth(navigatorKey.currentContext!);
- 在应用根组件初始化完成、导航器实例已经就绪后,判断是否有待跳转任务,执行跳转后清空存储
// 放在MaterialApp初始化完成后的生命周期回调中,比如initState的addPostFrameCallback @override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { // 存在待跳转路由则执行跳转 if (globalPendingRoute != null) { navigatorKey.currentState?.pushNamed( globalPendingRoute!.routeName, arguments: globalPendingRoute!.arguments, ); // 跳转完成后清空配置,避免后续重复触发 globalPendingRoute = null; } }); }
注意事项
如果你的跳转参数依赖DI容器的实例,需要确保DI容器重建完成后再读取参数,或者直接使用字符串、数字等基础类型作为跳转参数,避免参数失效。
内容的提问来源于stack exchange,提问作者Tarek Alabd
相关产品推荐
相关产品推荐

