Как я могу определить тип возвращаемого значения лямбда-функции в 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
чтобы решить проблему.