#flutter #dependency-injection #injectable
Вопрос:
Я пытаюсь использовать инъекции для своего проекта, но когда я пробую эту часть кода:
@injectable
abstract class TodoRepository {
Future<Either<Failure, DayTodosEntity>> getDayDodo(DateEntity date);
}
после run build_runner
возникновения этой ошибки:
[TodoRepository] is abstract and can not be registered directly!
if it has a factory or a create method annotate it with @factoryMethod
не могу понять, чего мне не хватает.
Ответ №1:
@injectable декоратор отмечает класс, который будет обрабатываться пакетом di (инъекция зависимостей).
предполагается, что di предоставит вам экземпляр этого класса, когда вы попросите об этом позже. но вы также отметили класс как «абстрактный», а абстрактные классы не могут быть созданы.
Если у вас есть одна реализация для этой абстракции, вам нужно только добавить декоратора для реализации
@Injectable(as: AbstractClass)
class ConcreteClass implements AbstractClass {}
Если у вас несколько реализаций, вы можете достичь этого с помощью
@Named("impl1")
@Injectable(as: AbstractClass)
class ConcreteClassImpl1 implements AbstractClass {}
@Named("impl2")
@Injectable(as: AbstractClass)
class ConcreteClassImpl2 implements AbstractClass {}
использование предполагаемой реализации
@injectable
class Consumer {
final AbstractClass abstractClass;
Consumer(@Named('impl1') this. abstractClass)
}
Комментарии:
1. у меня также есть реализация для этого класса. не могли бы вы, пожалуйста, привести мне пример того, как связать их вместе?
2. конечно, если у вас есть одна реализация для этой абстракции: вам нужно только добавить декоратора для реализации « @Вводимый(как: абстрактный класс) класс ConcreteClass реализует абстрактный класс {} «