[英]GetIt/Injectable missing injectable decorator on abstract class?
[英]GetIt not being able to correctly find registered type based on abstract class/interface, but succeeds with concrete class
语境
我在用:
Flutter (Channel stable, 2.5.3, on macOS 11.6 20G165 darwin-x64, locale en-US)
get_it: ^7.2.0
。 我有以下注入器,其中包括CategoryRepositoryAdapter
服务(实现CategoryRepositoryPort
):
// injector.dart
final injector = GetIt.instance;
Future<void> initializeDependencies() async {
// Rest Client
injector.registerSingleton<Dio>(Dio());
// Database Client
final database = await $FloorMoneyDatabase
.databaseBuilder(kDatabaseName)
.build();
injector.registerSingleton<MoneyDatabase>(database);
// Database Mappers and Repositories
injector.registerSingleton<CategoryEntityMapper>(
CategoryEntityMapper()
);
injector.registerSingleton<CategoryRepositoryPort>( // <--- problem is here
CategoryRepositoryAdapter(injector(), injector())
);
// UI Handlers
injector.registerSingleton<CategoryHandlerPort>(
CategoryHandler(injector())
);
// Blocs
injector.registerFactory<LocalCategoryBloc>(
() => LocalCategoryBloc(injector())
);
}
调用该服务的类如下所示:
// category.handler.dart
class CategoryHandler implements CategoryHandlerPort {
final CategoryRepositoryPort _repository; // <--- problem is here
const CategoryHandler(this._repository);
Stream<Category?> findAllCategories() {
...
}
Future<Category?> findCategoryById(int id) {
...
}
...
}
要注入的具体服务如下所示:
// category.repository_adapter.dart
class CategoryRepositoryAdapter implements CategoryRepositoryPort {
final MoneyDatabase _database;
final CategoryEntityMapper _map;
const CategoryRepositoryAdapter(this._database, this._map);
@override
Stream<Category> findAllCategories() async* {
...
}
@override
Future<Category?> findCategoryById(int id) async {
...
}
@override
Future<void> insertCategory(Category category) {
...
}
@override
Future<void> removeCategory(Category category) {
...
}
}
错误
当我使用上述内容运行应用程序时,出现错误:
Object/factory with type CategoryRepositoryAdapter is not registered inside GetIt.
(Did you accidentally do GetIt sl=GetIt.instance(); instead of GetIt sl=GetIt.instance;
Did you forget to register it?)
解决方法
如果我注册具体类CategoryRepositoryAdapter
而不是它实现的抽象类CategoryRepositoryPort
,并在调用类中引用前者,一切正常:
// injector.dart
...
injector.registerSingleton<CategoryRepositoryAdapter>( // <-- changed this to point to concrete class
CategoryRepositoryAdapter(injector(), injector())
);
...
// category.handler.dart
class CategoryHandler implements CategoryHandlerPort {
final CategoryRepositoryAdapter _repository; // <-- changed this to point to concrete class
const CategoryHandler(this._repository);
...
概括
get_it
在使用具体类时注册服务成功;get_it
在使用抽象类时不注册服务。任何线索可能是错误的?
解决了。 环顾四周,发现我在别处调用了具体的类CategoryRepositoryAdapter
; 这让get_it
感到困惑。
到处调用抽象类CategoryRepositoryPort
解决了它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.