当@Provides继承子类@Inject时Android Hilt UninitializedPropertyAccessException

问题描述 投票:0回答:1

我在我的Android应用程序项目中使用hilt

我正在尝试使用 @Provides 和 @Inject 注入继承的子类,如下所示......

但始终存在 UninitializedPropertyAccessException 问题

在我的代码中使用 Hilt 的方法是否有错误?(https://github.com/woosuk0410/MyHilt)

我有一个使用工厂的替代解决方案来解决它,但如果可能的话我想使用@Provides

如果您能提供帮助,我将不胜感激

谢谢

@Singleton
class Engine @Inject constructor() { 
    fun accel()  {
        Log.e("SAMPLE", "engine accel")
    }
}


@Singleton
open class Car @Inject constructor() {
    @Inject
    lateinit var engine: Engine
    fun accel() {
        engine.accel()
    }
}

@Singleton
class ElectricCar @Inject constructor() : Car()

@Singleton
class GasolineCar @Inject constructor() : Car() 

@Module
@InstallIn(SingletonComponent::class)
object ModuleProvides {
    @Provides
    fun getCar() :Car {
        return if(true) // some condition
             ElectricCar()
        else
            GasolineCar()
    }
}

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    @Inject
    lateinit var car: Car
    @Inject
    lateinit var factory: AlternativeCarFactory
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //this works fine
//        val altCar = factory.getInstance()
//        altCar.accel()

        // this always makes UninitializedPropertyAccessException a
        car.accel()
    }
}

@Singleton
class AlternativeCarFactory @Inject constructor() {
    @Inject
    lateinit var electricCar: ElectricCar
    @Inject
    lateinit var gasolineCar: GasolineCar
    fun getInstance(): Car {
         return if (true) electricCar else gasolineCar
    }
}
android dagger-hilt inject
1个回答
0
投票

汽车类

open class Car @Inject constructor(private val engine: Engine) {

    fun accel() {
        engine.accel()
    }
}

电动车

@Singleton
class ElectricCar @Inject constructor(private  val engine: Engine) : Car(engine){
}

汽油车

@Singleton
class GasolineCar @Inject constructor(private val engine: Engine) : Car(engine) {
}

模块提供

@Provides
fun getCar(engine: Engine): Car {
    return if (true) // some condition
        ElectricCar(engine)
    else
        GasolineCar(engine)
}
© www.soinside.com 2019 - 2024. All rights reserved.