Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android java.lang.InstanceionException<;com.example.MyViewModel>;使用SavedStateViewModelFactory时没有零参数构造函数_Android_Kotlin_Mvvm_Dagger_Dagger Hilt - Fatal编程技术网

Android java.lang.InstanceionException<;com.example.MyViewModel>;使用SavedStateViewModelFactory时没有零参数构造函数

Android java.lang.InstanceionException<;com.example.MyViewModel>;使用SavedStateViewModelFactory时没有零参数构造函数,android,kotlin,mvvm,dagger,dagger-hilt,Android,Kotlin,Mvvm,Dagger,Dagger Hilt,我只是尝试按照以下指南来了解MVVM体系结构: 我的问题:当我在ViewModel类“SavedStateHangle”和“UserRepository”中使用两个参数时,我的应用程序会因以下错误而崩溃: E/AndroidRuntime:at-android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 在android.app.servertransaction.Transaction

我只是尝试按照以下指南来了解MVVM体系结构:

我的问题:当我在ViewModel类“SavedStateHangle”和“UserRepository”中使用两个参数时,我的应用程序会因以下错误而崩溃:

E/AndroidRuntime:at-android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78) 在android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)中 在android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)中 在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1955) 位于android.os.Handler.dispatchMessage(Handler.java:106) 位于android.os.Looper.loop(Looper.java:214) 位于android.app.ActivityThread.main(ActivityThread.java:7058) 位于java.lang.reflect.Method.invoke(本机方法) 位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) 原因:java.lang.InstanceException:java.lang.Class没有零参数构造函数 位于java.lang.Class.newInstance(本机方法) 在androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:219)中

若我从构造函数参数中删除UserRepository(构造函数只有SavedStateHandle),那个么片段可以工作(并没有UserRepository,但它不会因为这个错误而崩溃)

我将我的ViewModel与SavedStateViewModelFactory和Hilt+Dagger库一起使用,就像Android应用程序架构指南中的一样

我在UserProfileFragment上通过以下代码创建ViewModel:

private val viewModel : UserProfileViewModel
    by viewModels(
        factoryProducer = {SavedStateViewModelFactory(activity?.application, this, defaultBundle())}
)
和我的ViewModel代码:

@HiltViewModel
class UserProfileViewModel @Inject constructor(
    savedStateHandle: SavedStateHandle,
    userRepository: UserRepository
) : ViewModel() {
    var userId: String = savedStateHandle["uid"]
            ?: throw IllegalArgumentException("Missing user ID")
    private val _user = MutableLiveData<User>()
    val user : LiveData<User> = _user

    init {
        viewModelScope.launch {
            _user.value = userRepository.getUser(userId)
        }
    }
}
@HiltViewModel
类UserProfileViewModel@Inject构造函数(
savedStateHandle:savedStateHandle,
userRepository:userRepository
):ViewModel(){
var userId:String=savedstateholder[“uid”]
?:抛出IllegalArgumentException(“缺少用户ID”)
private val_user=MutableLiveData()
val用户:LiveData=\u用户
初始化{
viewModelScope.launch{
_user.value=userRepository.getUser(userId)
}
}
}
你可以找到我的项目的完整代码。
也许有人在我之前实施了这个指南,并且已经知道答案了?:)

当您为
视图模型
提供工厂时,您正在为
视图模型
提供一种方法,以创建
视图模型
的实例(如果该实例尚不存在)。
SavedStateViewModelFactory
只提供了一种使用
SavedStateHandle
实例化
ViewModel
的方法,显然它不知道如何在没有您的一些工作的情况下提供自定义存储库

因此,为了给它提供所需的帮助,您可能应该考虑创建一个自定义的
ViewModelProvider.Factory
实现,它要求您实现
create
方法:

class VMF: ViewModelProvider.Factory {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {}
}
然后您将使用您的工厂来代替默认工厂:

private val viewModel : UserProfileViewModel by viewModels {
    VMF(userRepository, arguments)
}

奇怪的是,MVVM指南没有提到这一点。谢谢你的详细解释。
private val viewModel : UserProfileViewModel by viewModels {
    VMF(userRepository, arguments)
}