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

如何通过Go Router共享Cubit实例?

如何通过Go Router共享Cubit实例?

我完全懂你现在的烦恼——想在RouteA和RouteB之间共用同一个Cubit实例,但试了用extra传报错,用BlocProvider.value又找不到实例。别慌,我给你讲两种靠谱的解决思路,对应不同的场景:

场景1:RouteB是RouteA的子路由(你的当前结构)

这种情况下,最合理的做法是在RouteA的页面里创建并提供Cubit,子路由RouteB就能自动从父级上下文里获取到这个实例:

  1. 在RouteA的组件中用BlocProvider初始化Cubit
class RouteA extends StatelessWidget {
  const RouteA({super.key});

  @override
  Widget build(BuildContext context) {
    // 在这里创建Cubit,它的作用域会覆盖所有子路由
    return BlocProvider(
      create: (context) => YourCubit(),
      child: Scaffold(
        appBar: AppBar(title: const Text('Route A')),
        body: Center(
          child: ElevatedButton(
            onPressed: () => context.push('/route-a/route-b'),
            child: const Text('跳转到Route B'),
          ),
        ),
      ),
    );
  }
}
  1. 在RouteB中直接使用Cubit
    因为RouteB是RouteA的子路由,它的上下文已经包含了父级提供的Cubit,不需要额外传递,直接用BlocBuilder或BlocConsumer监听状态就行:
class RouteB extends StatelessWidget {
  const RouteB({super.key});

  @override
  Widget build(BuildContext context) {
    return BlocConsumer<YourCubit, YourState>(
      listener: (context, state) {
        // 在这里处理状态变化的副作用,比如弹窗、导航
      },
      builder: (context, state) {
        return Scaffold(
          appBar: AppBar(title: const Text('Route B')),
          body: Center(
            child: Text('当前状态:${state.toString()}'),
          ),
        );
      },
    );
  }
}

场景2:需要在多个无关路由间共享Cubit

如果你的Cubit需要被更多路由访问,不止RouteA和RouteB,可以在Go Router的根层级提供Cubit,让所有路由都能拿到:

MaterialApp.router(
  routerDelegate: GoRouter(
    routes: [
      TypedGoRoute<RouteA>(
        path: '/route-a',
        routes: [
          TypedGoRoute<RouteB>(
            path: 'route-b',
          ),
        ],
      ),
    ],
  ).delegate(),
  // 在根builder里包裹BlocProvider,作用域覆盖整个路由体系
  builder: (context, child) {
    return BlocProvider(
      create: (context) => YourCubit(),
      child: child,
    );
  },
);

为什么你之前的方法行不通?

  • 用extra传递:state.extra是Object?类型,直接用会有类型问题,而且extra不适合传递Cubit这种带状态的对象——路由跳转时可能会涉及序列化,很容易导致状态丢失或异常。
  • 直接在RouteB用BlocProvider.value:你之前应该是在RouteB的build里直接调用,但此时RouteB的上下文还没包含RouteA的Cubit,自然找不到实例。必须让Cubit的提供者在父级路由的层级里。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 08:22:58