【问题标题】:lateinit property ViewModelFactory has not been initializedlateinit 属性 ViewModelFactory 尚未初始化
【发布时间】:2019-11-07 07:45:56
【问题描述】:

我在我的 android 项目中使用 dagger 2.25.2 和 androidx.lifecycle 进行依赖注入。但是我有错误 ViewModelFactory has not been initialized

这是我的代码

class PropertyActivity : AppCompatActivity() {

    @Inject
    lateinit var propertyViewModelFactory: PropertyViewModelFactory
    lateinit var propertyViewModel: PropertyViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.property_activity)

        propertyViewModel = ViewModelProviders.of(this, propertyViewModelFactory).get(
        PropertyViewModel::class.java)

        propertyViewModel.loadProperties()
}

ViewModelFactory:

class PropertyViewModelFactory @Inject constructor(
    private val propertyViewModel: PropertyViewModel) : ViewModelProvider.Factory {

    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(PropertyViewModel::class.java!!)) {
            return propertyViewModel as T
        }
        throw IllegalArgumentException("Unknown class name")
    }
}

应用模块:

@Module
class AppModule(val app: Application){

    @Provides
    @Singleton
    fun provideApplication(): Application = app

    @Provides
    @Singleton
    fun providePropertyViewModelFactory(factory: PropertyViewModelFactory): ViewModelProvider.Factory = factory

}

BuildersModule:

@Module
abstract class BuildersModule {

    @ContributesAndroidInjector
    abstract fun contributePropertyActivity(): PropertyActivity
}

应用组件:

@Singleton
@Component(modules = arrayOf(AndroidInjectionModule::class,BuildersModule::class, AppModule::class))interface PlotComponent {

    fun inject(app: Application)
}

应用类:

class PlotApplication : Application(), HasAndroidInjector {
    @Inject
    lateinit var activityInjector: DispatchingAndroidInjector<Any>

    override fun onCreate() {
        super.onCreate()

        DaggerPlotComponent.builder()
            .appModule(AppModule(this))
            .build().inject(this)
    }
    override fun androidInjector(): AndroidInjector<Any> = activityInjector
}

【问题讨论】:

    标签: android kotlin mvvm


    【解决方案1】:

    我看不到您在活动中注入依赖项的位置。问题可能出在这。

    添加

    AndroidInjection.inject(this)
    

    在你的 onCreate 中

    【讨论】:

    • AndroidSupportInjection 不是片段的权利吗?我尝试在我的 onCreate 上添加 AndroidInjection.inject(this) 但我有错误 lateinit property activityInjector has not been initialized
    • 你使用了 apply plugin: 'kotlin-kapt' 吗?
    • 是的,我做到了。是因为我使用的是 dagger 2.25 版吗?因为在另一个项目中,我使用了 2.13 版它的工作
    • 尝试开启这个版本并检查
    • 你节省了我的时间。太好了!
    猜你喜欢
    • 2018-10-12
    • 2017-03-03
    • 1970-01-01
    • 2020-12-31
    • 2021-06-11
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多