gpt4 book ai didi

android - 如何使用依赖注入(inject)在 ViewModel 中注入(inject)构造函数

转载 作者:行者123 更新时间:2023-12-02 14:56:06 25 4
gpt4 key购买 nike

我正在尝试在 https://developer.android.com/jetpack/docs/guide 上实现示例。这解释了 android 应用程序应该如何构建。

当我使用相同的代码时,出现以下错误。

java.lang.Class<com.example.UserProfileViewModel> has no zero argument constructor

我可以发现这个错误与以下内容有关

viewModel = ViewModelProviders.of(this).get(UserProfileViewModel.class);
<小时/>

当我为 ViewModel 编写默认的零输入构造函数时,出现以下错误。

Attempt to invoke virtual method 'void android.arch.lifecycle.LiveData.observe(android.arch.lifecycle.LifecycleOwner, android.arch.lifecycle.Observer)' on a null object reference

我无法找出此错误的原因以及如何解决它。

最佳答案

如果您想在 Fragment 中为 viewmodel 提供构造函数作为依赖项,则有一种不同的方法,

假设您有一个如下所示的 View 模型类,

class SampleViewmModel(dataManager:DataManager):ViewModel(){
//some logic
}

然后您需要创建一个工厂类来支持上面的 View 模型,如下所示,

class SampleFactory @Inject constructor(var dataManager:DataManager): ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(SampleViewModel::class.java)) {
return SampleViewModel(dataManager) as T
}
throw IllegalStateException()
}

}

现在在您的模块类中,您可以如下注入(inject)上述类,(注意 Datamanager 类是可注入(inject)的)

//Provide Factory
@Provides
fun provideFactory(dataManager:DataManager): SampleFactory {
return SampleFactory(dataManager)
}

//Provide actual viewmodel
@Provides
fun provideViewModel(sampleFactory: SampleFactory): SampleViewModel {
return ViewModelProviders.of(fragment, sampleFactory)[SampleViewModel::class]
}

不,在您的 fragment 中,您可以像任何其他依赖项一样注入(inject) View 模型,

@Injetct
lateinit viewModel:SampleViewModel

关于android - 如何使用依赖注入(inject)在 ViewModel 中注入(inject)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50949221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com