Flutter项目模块化后使用Get It依赖注入无法注册Package中的类报错求助
兄弟,看了你的报错和代码,问题其实一目了然——你只在GetIt里注册了DatabaseRepository,但你的StartUpViewModel在尝试获取的AuthenticationService完全没在locator里注册!
先拆解下报错核心
报错信息已经说得非常明确:
类型为AuthenticationService的对象/工厂未在GetIt中注册。(您是否意外写成了
GetIt sl=GetIt.instance();而非GetIt sl=GetIt.instance;?是否忘记注册它?)
从调用栈也能定位到,是StartUpViewModel的第13行在尝试获取这个实例,但它根本没被添加到GetIt的注册列表里。
你的代码问题点
看你提供的locator.dart,只完成了DatabaseRepository的注册:
import 'package:user_repo/user_repo.dart'; final locator = GetIt.instance; void setupLocator() { locator.registerLazySingleton<DatabaseRepository>(() =>FirestoreRepo()); // 这里完全没有AuthenticationService的注册代码! }
另外关于你担心的「注册外部Package中的类」——完全没问题!你已经成功注册了user_repo包里的DatabaseRepository,说明Package的导入和访问逻辑是正常的,问题不在这。
解决步骤
注册AuthenticationService
首先在setupLocator()里补充AuthenticationService的注册,根据这个类的实际实现调整,比如如果它也在user_repo包里:import 'package:user_repo/user_repo.dart'; final locator = GetIt.instance; void setupLocator() { locator.registerLazySingleton<DatabaseRepository>(() =>FirestoreRepo()); // 新增AuthenticationService的注册,替换成你的实际实现类 locator.registerLazySingleton<AuthenticationService>(() => AuthenticationServiceImpl()); }确认类的导出权限
如果AuthenticationService在user_repo包里,要确保它是公开可访问的:- 类名首字母必须大写(遵循Dart的public访问规则)
- 在
user_repo.dart里要导出对应的文件,比如:library user_repo; import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; part 'src/services/firestore_repo.dart'; part 'src/services/authentication_service.dart'; // 添加上这个part导入
确认setupLocator的调用时机
一定要在runApp之前调用setupLocator(),比如在main.dart里:void main() { setupLocator(); // 必须先完成注册再启动App runApp(MyApp()); }
做完这几步,你的StartUpViewModel就能正常获取到AuthenticationService的实例了。
内容的提问来源于stack exchange,提问作者chk.buddi

