flutter - cubit 发射后 BlocBuilder 不更新

标签 flutter bloc flutter-bloc

更新找到 onChange 覆盖方法后,似乎没有发出更新的状态#confused
更新 2 进一步调试显示,当更新状态尝试发出时,StreamController 似乎已关闭。
出于某种原因,我的应用程序中的 BlocBuilders 1 在 Cubit 发射后拒绝重绘,对于我的一生,我无法弄清楚为什么,运行或调试时没有错误,状态数据正在更新并传递到发射中。
目前,它是一个钩子(Hook)小部件,但我已经尝试使其无状态,有状态,在 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();
            }
          },
        ),
      ),
    );
  }
}
肘法 :
  Future<void> fetchDomainOptions() async {
    final inputEither = await getDomainOptions();

    return inputEither.fold(
      _handleFailure,
      (options) {
        emit(state.copyWith(
          domainOptions: options,
          status: CoreStatus.loaded,
        ));
      },
    );
  }
我还有一些其他小部件可以处理卡住的数据类和相同的状态键逻辑而没有任何问题,我什至尝试在其上添加 lastUpdated 时间戳键以进行更多数据更改,但在初始状态 domainOptions为空且 status是 CoreStatus.loading,应该已经足够触发 UI 更新了。
TIA

最佳答案

我还没有弄清楚为什么会发生这种情况,但我相信我们正在处理某种竞争条件。
此外,我不知道解决该问题的正确解决方案,但我发现在短时间内延迟调用 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

关于flutter - cubit 发射后 BlocBuilder 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64370986/

相关文章:

flutter - 无法在此小部件上方找到正确的提供程序 - Flutter

flutter - Flutter BLoC 库中带有验证的文本字段

flutter - 如何多次触发具有相同状态的 block 监听器?

asynchronous - 初始化我的 BLoC 时应该如何处理异步调用?

flutter - Bloc-是否可以产生导航堆栈中上一页的状态?

flutter - Flutter 中热重载 native 代码更改(插件开发)

ios - iOS 的 Flutter 风格在运行时会出现 SharedPreference 错误

flutter - 使用 Navigator 时,如何解决方法 'ancestorStateOfType' 在 null 上被调用?

flutter - : Error: The getter 'ut' isn't defined for the class 'BlocBase<State>'

flutter - 业务逻辑和 UI 逻辑有什么区别?