【问题标题】:Either inside BlocProvider is not returning valueBlocProvider 内部没有返回值
【发布时间】:2020-08-20 07:31:50
【问题描述】:

我想使用Either 将结果存储在BlocBuilder 中。根据结果​​我想显示特定的Widget。但是使用Either 会抛出BlocBuilder 返回null 的异常。我调试了那个代码,fold 分支被正确调用,所以它应该返回Widget。我不明白它怎么会返回null

代码:

...
else if (state is Loaded) {
  final badgeOrFailure = state.profile.getBadgeByOrgId(orgId);
  badgeOrFailure.fold((err) {
       return MessageDisplay(
         message: err.message,
       );
  }, (badge) {
      return BadgeWidget(
       desc: badge.desc,
       code: badge.code,
     );
   });
...

个人资料代码:

Either<BadgeNotFoundFailure, Badge> getBadgeByOrgId(int orgId) {
    try {
      if (badges != null && badges.isNotEmpty) {
        return Right(badges.firstWhere((element) => element.orgId == orgId));
      } else {
        log('badges are empty');
        return Left(BadgeNotFoundFailure());
      }
    } on Exception catch (_) {
      return Left(BadgeNotFoundFailure());
    }
  }

【问题讨论】:

  • 请使用state.profile?.getBadgeByOrgId 确保state.profile. 是空安全的。您能否分享与此 BLoC 相关的整个代码块,以便我可以尝试分享答案?
  • 配置文件不为空。我添加了 nullcheck 但结果相同

标签: flutter flutter-bloc


【解决方案1】:

我认为您需要一个明确的return,例如
return badgeOrFailure.fold(...

你可以试试吗?

【讨论】:

  • 这行得通,但我还必须保持内部回报。有点奇怪,它不能自己从 fold 方法内部返回 Widget。因为根据这种语法,我逻辑上认为我想返回的不是 Widget,而是 Either。
  • 没错,内在回报也必须保持不变。 p.s.我还没有在 Dart 中完成函数式编程,但是当你使用异步调用并且内部返回丢失时会发生类似的情况。所以这让我也为你的错误假设了类似的情况。
  • 你在使用dartz包进行函数式编程吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 2018-07-22
  • 2020-03-21
  • 2019-02-02
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多