flutter 有了dartz,是否有可能将失败传递给正在折叠我的either的函数

zi8p0yeb  于 2023-01-06  发布在  Flutter
关注(0)|答案(1)|浏览(148)

我有下面的代码

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进行类型检查,因为我认为这会使我的程序不那么健壮。
这可能吗?

bqucvtff

bqucvtff1#

对于这种情况,可以使用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;
}

相关问题