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

Flutter Bloc emit状态无法触发BlocBuilder状态变更问题

问题根源

你通过getIt<LocationBloc>().add(...)触发事件时,使用的Bloc实例和BlocBuilder从Widget树中获取的实例不是同一个,导致emit的状态无法被BlocBuilder捕获。

解决方法

两种可行方案选其一即可:

方案一:统一使用get_it的单例实例提供给BlocProvider

修改main.dart中的BlocProvider配置,直接传入get_it中的单例,而非每次新建:

@override
Widget build(BuildContext context) {
  return MultiBlocProvider(
      providers: [
         BlocProvider(create: (context) => PlacesCubit()),
         // 改为用value传入get_it的单例
         BlocProvider.value(value: getIt<LocationBloc>()),
      ],
      child: MaterialApp.router(
        title: 'Great Places',
        theme: AppTheme.darkTheme,
        routerConfig: _appRouter.config(),
      ));
}

同时确保get_it中注册的是单例:

// 注册示例
getIt.registerSingleton<LocationBloc>(LocationBloc(getIt()));

方案二:通过BuildContext获取Bloc实例触发事件

在需要触发事件的Widget中,通过context获取Bloc实例,替代get_it调用:

// 替换原来的getIt调用
context.read<LocationBloc>().add(GetLocation(LocationRequestModel()));

这种方式能确保触发的是BlocProvider提供给当前Widget树的Bloc实例,状态变更会被对应的BlocBuilder捕获。

额外检查项
  • 修正main.dart中BlocProvider的拼写错误:conetxt改为context,避免潜在上下文问题。
  • 确认所有状态类的props已正确覆盖:你当前的LocationLoading已将test加入props,这部分无问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:43:26