肘关节发出后BlocBuilder无法更新

时间:2020-10-15 11:51:10

标签: flutter bloc flutter-bloc

UPDATE 找到onChange重写方法后,似乎没有发出更新状态#confused

UPDATE 2 进一步的调试显示,当尝试发出更新的状态时,StreamController似乎已关闭。

由于某种原因,我的应用程序中的BlocBuilders中的1个在Cubit发出后拒绝重绘,并且出于我的生命,我无法弄清为什么在运行或调试时没有错误,状态数据正在更新并传递到发射。

当前,它是一个钩子小部件,但我尝试使其变为无状态,有状态,并在context.bloc上有效地调用了cubit方法。

我试图使它成为一个消费者,没有使它成为听众,甚至尝试弄乱listenWhen和buildWhen,也没有任何迹象表明为什么它没有构建。

它呈现加载状态,并在此终止。

小部件

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();
            }
          },
        ),
      ),
    );
  }
}

Cubit方法

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

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

我还有其他一些小部件可以处理冻结的数据类,并且可以处理相同的状态键逻辑而没有任何问题,我什至尝试在其上添加lastUpdated时间戳键来进行更多数据更改,但是初始状态domainOptions为null,status为CoreStatus.loading,应该足以触发UI更新。

TIA

1 个答案:

答案 0 :(得分:1)

我还没有弄清楚为什么会发生这种情况,但是我相信我们在这里处理某种比赛条件。 另外,我不知道解决此问题的适当解决方案,但我发现延迟一小段时间来延迟调用generate()可以防止此问题的发生。

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