繁体   English   中英

GetIt 无法根据抽象类/接口正确找到注册类型,但通过具体类成功

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM