1

我尝试使用类型安全参数创建存储库。为此,我将函数参数创建为 typedef 并使用Dartz 包,以便能够返回失败或所需的结果。

问题是,如果我想传递 typedef 类型的参数,我必须创建一个特定的函数。

typedef FailOrModel<T> = Future<Either<Failure, T>> Function();

class Repository {

  Future<Either<Failure, T>> _runAfterSync<T>(FailOrModel func) async {
    await synchronize().then(
      (value) => value.fold(
        (failure) {
          log.e('Synchronization error: $failure');
        },
        (_) {},
      ),
    );
    return await func();
  }
  
  Future<Either<Failure, Storage>> getStorage(int id) async {
    // Todo: Find out why lambda does not work
    Future<Either<Failure, Storage>> func() async {
      try {
        final model = await localDataSource.getStorage(id);
        return Right(model);
      } on CacheException {
        log.e('Could not load storage with id $id');
        return Left(CacheFailure());
      }
    }

    return await _runAfterSync<Storage>(func);
  }
}

当我按照我的意愿直接将相同的函数体作为 lambda 函数传递时,会出现运行时错误:

  Future<Either<Failure, Storage>> getStorage(int id) async {
    return await _runAfterSync<Storage>(() async {
      try {
        final model = await localDataSource.getStorage(id);
        return Right(model);
      } on CacheException {
        log.e('Could not load storage with id $id');
        return Left(CacheFailure());
      }
    });
  }

type 'Right<Failure, dynamic>' 不是类型 'FutureOr<Either<Failure, Storage>>' 的子类型

这没什么大不了的,但也许有人可以启发我,我如何在这里使用 lambda 函数,或者如果我使用 lambda 函数,为什么会出现此错误。

4

0 回答 0