flutter BlocBuilder在cubit发射后未更新

to94eoyn  于 2023-05-08  发布在  Flutter
关注(0)|答案(2)|浏览(155)
  • UPDATE* 在找到onChange覆盖方法后,似乎没有发出更新的状态#confused
  • UPDATE 2* 进一步的调试显示,当更新的状态尝试发出时,StreamController似乎已关闭。

由于某种原因,我的应用程序中的1个BlocBuilders在Cubit发出后拒绝重新绘制,对于我的生活,我无法弄清楚为什么,运行或调试时没有错误,状态数据正在更新并传递到发出中。
目前,它是一个钩子小部件,但我已经尝试使其无状态,有状态,在context.block上调用cubit方法。
我试过让它成为一个消费者,没有什么使它进入听,甚至试图搞乱listenWhen和buildWhen,没有任何迹象表明为什么这不是建设。
它呈现加载状态,并在此结束。

Widget

class LandingView extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final hasError = useState<bool>(false);

    return Scaffold(
      key: const Key(LANDING_VIEW_KEY),
      body: BlocProvider<CoreCubit>(
        create: (_) => sl<CoreCubit>()..fetchDomainOptions(),
        child: BlocBuilder<CoreCubit, CoreState>(
          builder: (context, state) {
            switch (state.status) {
              case CoreStatus.loaded:
                return LandingViewLoaded();
              case CoreStatus.error:
                return LandingViewError();
              case CoreStatus.loading:
              default:
                return AppIcon();
            }
          },
        ),
      ),
    );
  }
}

腕尺法

Future<void> fetchDomainOptions() async {
    final inputEither = await getDomainOptions();

    return inputEither.fold(
      _handleFailure,
      (options) {
        emit(state.copyWith(
          domainOptions: options,
          status: CoreStatus.loaded,
        ));
      },
    );
  }

我还有一些其他的小部件,可以在冻结的数据类上工作,并且可以使用相同的状态键逻辑,没有任何问题,我甚至尝试添加一个lastUpdated timestamp键来使更多的数据更改,但在初始状态下domainOptions为空,status为CoreStatus.loading,这应该已经足以触发UI更新了。
TIA

6za6bjd0

6za6bjd01#

我还没有弄清楚为什么会发生这种情况,但我相信我们正在处理一些种族条件在这里。另外,我不知道解决这个问题的合适的解决方案,但我发现短时间延迟调用emit()可以防止这个问题发生。

void load() async {
  try {
    emit(LoadingState());
    final vats = await provider.all();
    await Future<void>.delayed(const Duration(milliseconds: 50));
    emit(LoadedState(vats));
  } catch (e) {
    print(e.toString());
    emit(ErrorState());
  }
}

在发出新状态之前添加await Future<void>.delayed(const Duration(milliseconds: [whatever is needed]));
我在Cubit的GitHub上阅读了这个问题后得出了这个结论:Emitted state not received by CubitBuilder

fwzugrvs

fwzugrvs2#

我解决了我的问题,我用的是getIt。我添加了参数bloc。我的问题是没有接收到肘(bloc)的事件(emit

child: BlocBuilder<CoreCubit, CoreState>(
  bloc: getIt<CoreCubit>(), // <- this
  builder: (context, state) {},
),

相关问题