Как я могу определить тип возвращаемого значения лямбда-функции в Dart?

Я пытаюсь создать репозиторий с типобезопасными параметрами. Для этого я создал параметр функции как 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);
  }
}

Когда я передаю идентичное тело функции напрямую как лямбда-функцию, как мне хотелось бы, я получаю сообщение об ошибке выполнения:

  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' не является подтипом типа 'FutureOr>'

Это не имеет большого значения, но, возможно, кто-нибудь может просветить меня, как я могу использовать здесь лямбда-функцию или почему я получаю эту ошибку, если я использую лямбда-функцию.

1 ответ

Ожидаемый тип возвратаgetStorage(int)из будущего - этоEither<Failure, Storage>. Несоответствие происходит, потому что вы пытаетесь вернутьRight<Failure, dynamic>.

Как было упомянуто в комментариях, вы можете пройтиFailOrModel<T>в_runAfterSyncчтобы решить проблему.

Другие вопросы по тегам