BLoC 的事件映射器未执行,尽管调试表明它应该 8-/

Posted

技术标签:

【中文标题】BLoC 的事件映射器未执行,尽管调试表明它应该 8-/【英文标题】:event mapper of BLoC not executed, though debugging suggests it should 8-/ 【发布时间】:2021-10-16 20:08:49 【问题描述】:

这很奇怪,也许你们中的一个人知道会发生什么:

我的集团有一些事件,以下事件会导致问题(其他尚未实施):

@freezed
abstract class ProblemManagerEvent with _$ProblemManagerEvent 
  const factory ProblemManagerEvent.pmDataSyncRequested() = PmDataSyncRequested;

这应该会导致集团发出一个状态

@injectable
class ProblemManagerBloc extends Bloc<ProblemManagerEvent, ProblemManagerState> 
  final IJournalsRepository journalsRepository;
  final IProblemsRepository problemsRepository;

  ProblemManagerBloc(this.journalsRepository, this.problemsRepository) : super(PmInitial());
  @override
  Stream<ProblemManagerState> mapEventToState(
    ProblemManagerEvent event,
  ) async* 
    print('before map $event');    // <<<<<<<<<<<<<<<<<<<<<<<<
    event.map(
      pmDataSyncRequested: (e) async* 
        print('in map $e');    // <<<<<<<<<<<<<<<<<<<<<<<<<<<<
        final Either<StorageFailure, Unit> response = await problemsRepository.syncProblems();
        response.fold (
          (f) async* yield PmSyncFailed(f);,
          (s) async* yield PmInitial(););
        print('yep');
        yield ProblemManagerState.initial();
      ,
      pmClassProblemRequested: (e) async* 
        yield ProblemManagerState.initial(); //todo
      ,
      pmRandomProblemRequested: (e) async* 
        yield ProblemManagerState.initial();  //todo
      
    );
    print('post map');    // <<<<<<<<<<<<<<<<
  
  

这会产生以下输出

Restarted application in 4.549ms.
flutter: before map ProblemManagerEvent.pmDataSyncRequested()
flutter: post map
flutter: before map ProblemManagerEvent.pmDataSyncRequested()
flutter: post map

因此,即使它打印了正确的事件,mapEventToState 也不会触发与该事件关联的代码。尽管如此,它还是完成了该集团的代码并出于任何原因第二次运行该事件(有些出于任何原因重建)。事件就是这样触发的,下面的小部件都呈现在屏幕上。

class ProblemPage extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    final StackRouter router = context.router;
    return PlatformScaffold(
      appBar: PlatformAppBar(title: const Text('Home')),
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            BlocBuilder<ProblemManagerBloc, ProblemManagerState>(
            builder: (context, state) 
              context.read<ProblemManagerBloc>().add(PmDataSyncRequested());
              return Column (children:[
              Text('Hello world!'),
              TextButton(child:Text('los'),
                onPressed: () print('home');

【问题讨论】:

我认为你应该在event.map(...)之前添加yield 抱歉,我怎么能错过呢?!我看了。并一直尝试并错过了这一点。实际上它必须是产量*。很高兴接受它作为答案。非常感谢! 【参考方案1】:

yield*event.map(...) 之前缺失。现在,它基本上与拥有不返回/产生任何内容的 void 函数相同。

【讨论】:

以上是关于BLoC 的事件映射器未执行,尽管调试表明它应该 8-/的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis 无法识别映射器 xml 文件 - 无效的绑定语句(未找到)

我应该如何创建我的数据映射器/域对象/服务?

使用 RestTemplate 时如何配置内部 Jackson 映射器?

在可视化映射器中将命名空间添加到根节点

设备映射器,使用虚拟设备启动

对象引用未设置为对象实例的自动映射器问题