Problem
Hi great library but I have a use case that I can't seem to get working. I have a bunch of service classes that extend an existing abstract class. The abstract has some default behaviours for methods that need to be inherited to sub classes.
abstract class AbstractSvc<E extends BaseEntity, R extends AbstractRepo> {
R repo;
AbstractSvc({required this.repo});
E Function(Map<String, dynamic>) converter();
// default implementation
Future<E> read(String id) async {
return repo.findById(id, converter());
}
}
An implementation of this abstract class might look like this, here I am overriding a method from the AbstractSvc to make it cached in the sub class. Note I also use GetIt and Injectable with Injectable _Generator libraries to implement dependency injection (Service Locator pattern) of services and repositories.
@LazySingleton()
class ValuelistSvc extends AbstractSvc<Valuelist, ValuelistRepo>{
ValuelistSvc({required super.repo});
@override
Valuelist Function(Map<String, dynamic>) converter() {
return Valuelist.fromJson;
}
@Cached()
@override
Future<Valuelist> read(String id) async {
return repo.findById(id, converter());
}
}
After adding @withcache to the implementation the generated class is invalid as with the error 'The class 'ValuelistSvc' can't be used as a mixin because it extends a class other than 'Object''
part of 'ValuelistSvc.dart';
// **************************************************************************
// CachedGenerator
// **************************************************************************
abstract class _$ValuelistSvc {
ValuelistRepo get repo;
}
class _ValuelistSvc with ValuelistSvc implements _$ValuelistSvc {
_ValuelistSvc({required this.repo});
@override
final ValuelistRepo repo;
final _readCached = <String, Valuelist>{};
@override
Future<Valuelist> read(String id) async {
final cachedValue = _readCached["${id.hashCode}"];
if (cachedValue == null) {
final Valuelist toReturn;
try {
final result = super.read(id);
toReturn = await result;
} catch (_) {
rethrow;
} finally {}
_readCached["${id.hashCode}"] = toReturn;
return toReturn;
} else {
return cachedValue;
}
}
}
Desired Solution
Is using @withcache on a class which extends an abstract class supported? If not do you have any work arounds to resolve the issue. I don't want to have to add a bunch of service interfaces and then have to cut and paste default implementations of crud methods everywhere.
Alternatives Considered
You library is very similar to the ts-method-cache lib in NPM, would be great if we could get it to work in a similar manner without forcing a specific inheritance style. The other option I have is to implement Dio Http Interceptors.
On which platorm do you expect this solution?
All
Problem
Hi great library but I have a use case that I can't seem to get working. I have a bunch of service classes that extend an existing abstract class. The abstract has some default behaviours for methods that need to be inherited to sub classes.
An implementation of this abstract class might look like this, here I am overriding a method from the AbstractSvc to make it cached in the sub class. Note I also use GetIt and Injectable with Injectable _Generator libraries to implement dependency injection (Service Locator pattern) of services and repositories.
After adding @withcache to the implementation the generated class is invalid as with the error 'The class 'ValuelistSvc' can't be used as a mixin because it extends a class other than 'Object''
Desired Solution
Is using @withcache on a class which extends an abstract class supported? If not do you have any work arounds to resolve the issue. I don't want to have to add a bunch of service interfaces and then have to cut and paste default implementations of crud methods everywhere.
Alternatives Considered
You library is very similar to the ts-method-cache lib in NPM, would be great if we could get it to work in a similar manner without forcing a specific inheritance style. The other option I have is to implement Dio Http Interceptors.
On which platorm do you expect this solution?
All