Flutter BLoC:单个Cubit使用两个Repository的注入报错问题
解答
首先明确:单个Cubit中注入、使用多个Repository是完全可行的,不存在框架层面的限制。你遇到的参数缺失报错,和Cubit依赖多个Repository的逻辑无关,是context.read的用法错误导致的。
错误原因
你的LoginCubit构造函数明确定义了2个必填的位置参数:
class LoginCubit extends Cubit<LoginState> { LoginCubit(this._authRepository, this._authenticationRepository) : super(const LoginState()); final FirebaseAuthRepository _authenticationRepository; final AuthRepository _authRepository; }
而你编写的初始化代码中,context.read<AuthRepository, FirebaseAuthRepository>()是不符合API规范的写法:context.read单次仅支持传入1个泛型参数,对应从依赖容器中获取1个已注册的实例,因此这行代码实际只向LoginCubit构造函数传了1个参数,和构造函数要求的2个参数不匹配,才触发"缺少1个位置参数"的linter错误。
正确实现步骤
- 提前在组件树上层通过
RepositoryProvider注册两个需要用到的Repository(建议使用MultiRepositoryProvider统一管理):
// 一般放在应用根节点、或者对应页面的父节点 MultiRepositoryProvider( providers: [ RepositoryProvider(create: (_) => AuthRepository()), RepositoryProvider(create: (_) => FirebaseAuthRepository()), ], child: const LoginPage(), )
- 初始化
LoginCubit时,分别调用两次context.read获取两个Repository实例,按构造函数的参数顺序传入即可:
BlocProvider( create: (context) => LoginCubit( context.read<AuthRepository>(), context.read<FirebaseAuthRepository>(), ), )
注意事项
如果FirebaseAuthRepository是AuthRepository的实现类,不需要重复注册两个同类型的实现,只需要按你注册时声明的类型读取即可,避免出现依赖找不到的错误。
内容的提问来源于stack exchange,提问作者Sunshine
相关产品推荐
相关产品推荐

