#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
пакет для функционального программирования?