Flutter Bloc 测试“bloc.add”空安全问题

Posted

技术标签:

【中文标题】Flutter Bloc 测试“bloc.add”空安全问题【英文标题】:Flutter Bloc test "bloc.add" null safety issue 【发布时间】:2021-08-13 08:04:59 【问题描述】:

我有一个flutter bloc_test,由于最近Flutter 升级涉及空安全性而失败。

我有以下代码

blocTest('get the usecase name',
        build: () 
          when(() => mockGetUseCaseName(any()))
              .thenAnswer((_) async => Right(name));
          return bloc;
        ,
        act: (bloc) => bloc.add(GetUseCaseName(name)),
        verify: (_) => verify(
            () => mockGetUseCaseName(Params(string: name))));

我在“bloc.add”行得到错误

“'add'方法不能被无条件调用,因为receiver可以是'null'”

有什么想法吗?

【问题讨论】:

【参考方案1】:

我找到了答案——对于其他有同样问题的人。我通过强制转换 bloc 类型来修复它(因为 act/bloc 是 Object? 类型)

act: (bloc) => cast<UseCaseBloc>(bloc).add(GetUseCaseName(name))

祝你有美好的一天。

起亚卡哈,

迈克·史密斯

【讨论】:

【参考方案2】:

最正确的解决方案是明确数据类型

之前:

blocTest('get the usecase name',
    build: () 
      when(() => mockGetUseCaseName(any()))
          .thenAnswer((_) async => Right(name));
      return bloc;
    ,
    act: (bloc) => bloc.add(GetUseCaseName(name)),
    verify: (_) => verify(
        () => mockGetUseCaseName(Params(string: name))));

之后:

blocTest<ClassBloc, ClassState>('get the usecase name',
    build: () 
      when(() => mockGetUseCaseName(any()))
          .thenAnswer((_) async => Right(name));
      return bloc;
    ,
    act: (bloc) => bloc.add(GetUseCaseName(name)),
    verify: (_) => verify(
        () => mockGetUseCaseName(Params(string: name))));

【讨论】:

以上是关于Flutter Bloc 测试“bloc.add”空安全问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 Flutter bloc_test 测试特定状态

如何在集成测试中模拟 BLoC

Flutter bloc emmitInOrder 不会发出初始状态,但会发出

如何在 Flutter 上实现 BLoC 模式的 TDD

如何在 Flutter 小部件测试中等待未来完成?

Flutter Bloc Test:空值检查运算符用于空值(空安全)