如何在Dart中定义lambda函数的返回类型?

yruzcnhs  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(100)

我尝试创建一个具有类型安全参数的存储库。为此,我将函数参数创建为typedef,并使用Dartz package,以便能够返回失败或期望的结果。
问题是,如果我想传递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());
      }
    });
  }


类型“Right< Failure,dynamic>”不是类型“FutureOr< Failure,Storage>”的子类型
这不是一个大问题,但也许有人可以启发我,我如何能够在这里使用lambda函数,或者为什么我会得到这个错误,如果我使用lambda函数。

rjee0c15

rjee0c151#

Future的getStorage(int)的预期返回类型是Either<Failure, Storage>。发生不匹配是因为您试图返回Right<Failure, dynamic>
正如在注解中提到的,您可以在_runAfterSync中传递FailOrModel<T>来解决这个问题。

相关问题