Flutter injectable注册子类后无法显式获取实现类如何解决?
问题根因
你当前的配置仅将ImplementedA作为A接口的实现类注册到prod环境,injectable生成的注册代码只会绑定A类型到ImplementedA的工厂,不会单独为ImplementedA自身类型生成注册规则,因此无法直接通过ImplementedA类型请求实例。
解决方案
方案1:添加测试环境专属注册(无生产侵入风险)
给ImplementedA新增一个仅作用于test环境的@Injectable注解,不需要绑定抽象类,这样仅在test环境下会注册ImplementedA自身类型,prod环境的原有逻辑完全不受影响:
abstract class A {} @Injectable(as: A, env: ["prod"]) @Injectable(env: ["test"]) // 仅测试环境注册自身类型 class ImplementedA extends A {}
配置后效果:
- prod环境:仅
getIt<A>()可正常返回实例,getIt<ImplementedA>()仍会抛出未注册错误,符合生产侧封装要求 - test环境:
getIt<A>()和getIt<ImplementedA>()都可以正常返回实例,满足测试需求
方案2:测试侧手动注册(完全不修改生产代码)
如果不想改动生产侧的注入注解,可以在测试初始化逻辑中手动注册ImplementedA类型,所有逻辑都收敛在测试代码内:
// 测试初始化代码,例如写在setUp方法中 setUp(() { // 直接手动注册ImplementedA实例 getIt.registerSingleton<ImplementedA>(ImplementedA()); // 如果ImplementedA依赖其他已注入的实例,也可以先拿到A的实例再强转注册 // getIt.registerSingleton<ImplementedA>(getIt<A>() as ImplementedA); });
内容的提问来源于stack exchange,提问作者reza
相关产品推荐
相关产品推荐

