首页 > 解决方案 > Flutter 可注入抽象类

问题描述

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

@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

无法理解我错过了什么。

标签: flutterdependency-injectioninjectable

解决方案


@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)  
}

推荐阅读