Flutter 可注入抽象类

rez*_*eza 0 dependency-injection injectable flutter

我正在尝试在我的项目中使用可注入,但是当我尝试这部分代码时:

@injectable
abstract class TodoRepository {
  Future<Either<Failure, DayTodosEntity>> getDayDodo(DateEntity date);
}  
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

不明白我错过了什么。

Sal*_*lah 6

@injectable 装饰器标记要由 di(依赖注入)包处理的类。

当您稍后要求时,di 应该为您提供此类的实例。但您还将该类标记为“抽象”,并且抽象类无法实例化。

如果你有这个抽象的单一实现,你只需要为实现添加装饰器

@Injectable(as: AbstractClass) 
class ConcreteClass implements AbstractClass {}
Run Code Online (Sandbox Code Playgroud)

如果您有多个实现,您可以通过以下方式实现

@Named("impl1")  
@Injectable(as: AbstractClass)  
class ConcreteClassImpl1 implements AbstractClass {}  
  
@Named("impl2")  
@Injectable(as: AbstractClass)  
class ConcreteClassImpl2 implements AbstractClass {} 
Run Code Online (Sandbox Code Playgroud)

消耗预期的实现

@injectable  
class Consumer {  
   final AbstractClass abstractClass;  
    Consumer(@Named('impl1') this. abstractClass)  
}
Run Code Online (Sandbox Code Playgroud)