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



这很奇怪,也许你们中有人知道发生了什么:

我的集团有一些事件,下面的一个导致问题(其他尚未实现):

@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');

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

最新更新