Android Hilt使用@Provides注入子类时出现UninitializedPropertyAccessException异常
Hilt @Provides注入子类导致UninitializedPropertyAccessException的问题解决
错误原因
你在ModuleProvides的getCar()方法里直接手动实例化ElectricCar()和GasolineCar(),这会导致Hilt无法对这些实例执行成员注入操作。父类Car中的@Inject lateinit var engine依赖没有被Hilt初始化,所以调用car.accel()时会抛出UninitializedPropertyAccessException。
而你的AlternativeCarFactory能正常工作,是因为工厂里的electricCar和gasolineCar是由Hilt注入的实例,Hilt已经完成了它们的成员注入(包括父类的engine)。
正确的@Provides写法
要让Hilt处理子类的依赖注入,你需要在@Provides方法中通过参数获取Hilt管理的ElectricCar和GasolineCar实例,而不是手动new:
@Module @InstallIn(SingletonComponent::class) object ModuleProvides { @Provides fun getCar( electricCar: ElectricCar, gasolineCar: GasolineCar ): Car { return if(true) // 你的判断逻辑 electricCar else gasolineCar } }
补充说明
- 因为
ElectricCar和GasolineCar都标注了@Singleton且有@Inject构造函数,Hilt会自动为它们创建实例并完成成员注入(包括父类Car中的engine)。 - 通过参数注入这两个子类后,
getCar()返回的实例已经是完全初始化好的,调用car.accel()不会再出现未初始化异常。
内容的提问来源于stack exchange,提问作者woosuk
相关产品推荐
相关产品推荐

