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 文件 - 无效的绑定语句(未找到)