不再发出 Bloc 初始状态

Posted

技术标签:

【中文标题】不再发出 Bloc 初始状态【英文标题】:Bloc initial state is not emitted anymore 【发布时间】:2020-12-09 18:08:32 【问题描述】:

我有一个听另一个集团的集团。将flutter_bloc包更新为version 6.0.2后,初始状态下监听器将不再调用。

class BlocA extends Bloc 
  final BlocB blocB = ...;

  ...

  blocA.blocB.listen((state) 
    DO SOMTTHING...
  );

  ...

我找到了这个解决方案:

class BlocB extends Bloc<..., ...> with BehaviorSubjectBloc 
  ...


mixin BehaviorSubjectBloc<TEvent, TState> on Bloc<TEvent, TState> 
  @override
  StreamSubscription<TState> listen(
    void Function(TState state) onData, 
    Function onError,
    void Function() onDone,
    bool cancelOnError,
  ) 
    onData(this.state);

    return super.listen(
      onData,
      onError: onError,
      onDone: onDone,
      cancelOnError: cancelOnError,
    );
  

不知道有没有更好的解决方案?

【问题讨论】:

你需要完成什么?从 BlocB 构造函数访问 blocA.state 并将其视为特殊情况不是解决方案吗?这是一个已知的重大更改(可悲),记录在(迁移页面](bloclibrary.dev/#/…) 上。 【参考方案1】:

flutter_bloc repo 中有一个关于它的问题: https://github.com/felangel/bloc/issues/1641

问题在待办事项列表上。 您可以修复您的 yaml 以强制使用以前的版本,使用单引号并删除“^”或任何其他符号。删除您的~/.pub-cache/... 文件夹和您的pubspec.lock 文件,再次运行flutter packages get 并开心。

请注意,pub-cache 文件夹在您的所有项目之间共享,因此您可以尝试仅删除其中的特定包。 您可以使用flutter packages pub deps 调查传递依赖关系,以查看flutter_bloc 依赖关系并将它们也删除。

【讨论】:

只是对您的回答的补充:Migration to 6.0.0 Documentation 中说明了此重大更改。

以上是关于不再发出 Bloc 初始状态的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Bloc 对 Blocs 初始状态的反应

Flutter Bloc 不会改变 TextFormField 的初始值

FLutter - 如何在 BLoC 初始化时调度事件

flutter_bloc :使 initialState 方法异步

Bloc如何收听流并发出状态

Flutter - Bloc 仅在状态未扩展 Equatable 时发出状态