Либо внутри Blockprovider не возвращает значение

#flutter #flutter-bloc

#сбой #сбой-блок

Вопрос:

Я хочу использовать 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 amp;amp; badges.isNotEmpty) {
        return Right(badges.firstWhere((element) => element.orgId == orgId));
      } else {
        log('badges are empty');
        return Left(BadgeNotFoundFailure());
      }
    } on Exception catch (_) {
      return Left(BadgeNotFoundFailure());
    }
  }
  

Комментарии:

1. пожалуйста, убедитесь, что это state.profile. безопасно для null, используя state.profile?.getBadgeByOrgId . не могли бы вы, пожалуйста, поделиться целым блоком кода, связанным с этим блоком, чтобы я мог попытаться поделиться ответом?

2. профиль не равен нулю. Я добавил nullcheck, но результат тот же

Ответ №1:

Я думаю, что вам нужно явное return , например
return badgeOrFailure.fold(...

Можете ли вы, пожалуйста, попробовать это?

Комментарии:

1. Это сработало, но я также должен сохранить внутренние возвраты. Довольно странно, что он не может вернуть виджет изнутри метода fold самостоятельно. Потому что в соответствии с этим синтаксисом я логически думаю, что хочу вернуть не Widget, а Either.

2. правильно, внутренние возвраты также должны оставаться. p.s. я не выполнял функциональную прогу внутри Dart, но похожая ситуация возникает, когда вы используете асинхронные вызовы, и внутренние возвраты теряются. таким образом, это привело меня к предположению, что аналогичный случай и для вашей ошибки.

3. используете ли вы dartz пакет для функционального программирования?