我正在使用 GetIt 和 Injectable,但我在使用 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 2.0之后,该项目是由某些插件自动更改为null-safety,它提供了不必要的字段,即null-safety(?),在我清理它之后,警告消失了
即使底层类被标记为 @injectable,也只会生成不可为 null 的构造函数对象参数。
解决方案是删除可为空的 ?指令并替换为所需的关键字,如下所示:
改变:
class SomeSingleton{
final SomeInjectable? injectable;
SomeSingleton({this.injectable])
}
至:
class SomeSingleton{
final SomeInjectable injectable;
SomeSingleton({required this.injectable])
}
现在上面代码片段的 SomeInjectable 对象不能为 null,因此生成器将相应地注入它。
我知道已经晚了,但这里有一些方法可以为路过的人解决这个问题:
abstract class DiscordRepository {
@factoryMethod
static DiscordRepository create() => DiscordRepositoryImpl();
// ...
}
@Injectable()
、@Singletone()
或 @LazySingletone()
注解实现类,将类绑定到实现,并使用 as
指定抽象类@Injectable(as: DiscordRepository)
class DiscordRepositoryImpl implements DiscordRepository {
// ...
}
@module
abstract class AppModule {
DiscordRepository get discordRepository => DiscordRepositoryImpl();
}