GetIt/Injectable 抽象类上缺少可注入装饰器?

问题描述 投票:0回答:3

我正在使用 GetItInjectable,但我在使用 GetIt 时遇到了一些问题。

看来我没有注册我的

DiscordRepository
类,但我无法使用 @injectable 装饰器注册它,因为它是一个抽象类。 这种情况我该怎么办?

我像这样初始化了我的依赖注入:


final getFromDependencyGraph = GetIt.instance;

@injectableInit
Future<void> setupDependencyInjection() async {
  await $initGetIt(getFromDependencyGraph);
}

flutter pub run build_runner build
给我这个输出:

[WARNING] injectable_generator:injectable_config_builder on lib/misc/dependencies.dart:
Missing dependencies in discordlogin/misc/dependencies.dart

[AuthenticationService] depends on unregistered type [DiscordRepository] from package:discordlogin/data/repository/discord_repository.dart

Did you forget to annotate the above class(s) or their implementation with @injectable?

我的完整代码在这里:https://github.com/BLKKKBVSIK/DiscordLogin 为网络构建它。然后启动应用程序并单击屏幕右下角的 FAB 以查看应用程序中的错误。

flutter flutter-web
3个回答
0
投票

对我来说,问题是在flutter 2.0之后,该项目是由某些插件自动更改为null-safety,它提供了不必要的字段,即null-safety(?),在我清理它之后,警告消失了


0
投票

即使底层类被标记为 @injectable,也只会生成不可为 null 的构造函数对象参数。

解决方案是删除可为空的 ?指令并替换为所需的关键字,如下所示:

改变:

class SomeSingleton{
 
final SomeInjectable? injectable;

SomeSingleton({this.injectable])
}

至:

class SomeSingleton{
 
final SomeInjectable injectable;

SomeSingleton({required this.injectable])
}

现在上面代码片段的 SomeInjectable 对象不能为 null,因此生成器将相应地注入它。


0
投票

我知道已经晚了,但这里有一些方法可以为路过的人解决这个问题:

  1. 在抽象类中创建一个返回实现的工厂方法
abstract class DiscordRepository {
  @factoryMethod
  static DiscordRepository create() => DiscordRepositoryImpl();
  // ...
}
  1. 通过使用
    @Injectable()
    @Singletone()
    @LazySingletone()
    注解实现类,将类绑定到实现,并使用
    as
    指定抽象类
@Injectable(as: DiscordRepository)
class DiscordRepositoryImpl implements DiscordRepository {
  // ...
}
  1. 在注册模块中注册一个实现
@module
abstract class AppModule {
  DiscordRepository get discordRepository => DiscordRepositoryImpl();
}
© www.soinside.com 2019 - 2024. All rights reserved.