使用dartz是否可以将失败传递给折叠我的函数



我有以下代码

class GetAuthUserUseCase {
final AuthRepository _authRepository;
GetAuthUserUseCase({
required AuthRepository authRepository,
}) : _authRepository = authRepository;
Future<Either<Failure, AuthUser>> call() async {
final userResponse = await _authRepository.getUser();
var user = userResponse.fold(
(Failure l) => //How can I return the failure from the call function?,
(AuthUser r) => r,
);
final accessTokenExpiresAtMilliseconds =
user.accessTokenIssuedAtMilliseconds + user.accessTokenExpiresInMilliseconds;
final accessTokenExpiresAtDateTime =
DateTime.fromMillisecondsSinceEpoch(accessTokenExpiresAtMilliseconds);
if (DateTime.now().isBefore(accessTokenExpiresAtDateTime)) {
return userResponse;
}
return _authRepository.refreshUser(
user: user,
);
}
}

在我的用例中,我有一些业务逻辑来确定是否需要刷新用户访问令牌。在此基础上刷新我的用户。但是我需要首先用getUser()加载我的用户,以便确定访问令牌是否已经过期。

getUser()将返回一个Either<Failure,AuthUser>,所以我折叠它来获得用户。但是我想要的是传播失败,因此它终止调用方法并从调用方法输出该失败。

如果可能的话,我希望避免对Failure或AuthUser进行类型检查,因为我认为这会使我的程序不那么健壮。

这可能吗?

对于这种情况,可以使用isLeft()检查失败。和isRight()

Future<Either<Failure, AuthUser>> call() async {
final userResponse = await _authRepository.getUser();
if(userResponse.isLeft()){
// do your stuffs       
}

在这里面,你可能喜欢直接访问数据,这个扩展将帮助

extension EitherX<L, R> on Either<L, R> {
R asRight() => (this as Right).value; //
L asLeft() => (this as Left).value;
}

最新更新