Android ViewModel没有零参数构造函数

Android ViewModel没有零参数构造函数,android,kotlin,mvvm,android-room,viewmodel,Android,Kotlin,Mvvm,Android Room,Viewmodel,我正在尝试使用recyclerview和room库创建一个简单的ToDoList应用程序。我正在关注android开发者代码实验室,我似乎遇到了麻烦。我已经设置了应用程序的每一层,但是在尝试使用ViewModelProvider实例化时出现了一个错误。这是我班上的代码 class TaskViewModel(应用程序:应用程序):AndroidViewModel(应用程序){ 专用val存储库:TaskRepository val-allTasks:LiveData 初始化{ val tasks

我正在尝试使用recyclerview和room库创建一个简单的ToDoList应用程序。我正在关注android开发者代码实验室,我似乎遇到了麻烦。我已经设置了应用程序的每一层,但是在尝试使用ViewModelProvider实例化时出现了一个错误。这是我班上的代码

class TaskViewModel(应用程序:应用程序):AndroidViewModel(应用程序){
专用val存储库:TaskRepository
val-allTasks:LiveData
初始化{
val tasksDao=TaskRoomDatabase.getDatabase(应用程序)!!.taskDao()
repository=TaskRepository(tasksDao)
allTasks=repository.allTasks
}
fun saveTask(task:task)=viewModelScope.launch(Dispatchers.IO){
repository.saveTask(任务)
}
}

下面是我的MainFragment中的代码,我正试图从中初始化ViewModel:

class MainFragment() : Fragment() {

private lateinit var recyclerView : RecyclerView
private lateinit var sharedTaskViewModel : TaskViewModel
private lateinit var fab : FloatingActionButton
var tasks = emptyList<Task>()
private lateinit var adapter : MainRecyclerViewAdapter

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    val view = inflater.inflate(R.layout.fragment_main, container, false)
    fab = view.findViewById(R.id.floatingActionButton)
    //Initialize the recyclerview
    recyclerView = view.findViewById(R.id.main_recyclerview)
    adapter = MainRecyclerViewAdapter()
    recyclerView.adapter = adapter
    recyclerView.layoutManager = LinearLayoutManager(view.context)


    return view
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    sharedTaskViewModel = ViewModelProvider(this).get(TaskViewModel::class.java)


    fab.setOnClickListener {
        fragmentManager!!.beginTransaction().apply {
            replace(R.id.fl_fragment_main, NewTaskFragment())
            commit()
        }
    }

}
class MainFragment():Fragment(){
私有lateinit var recyclerView:recyclerView
私有lateinit var sharedTaskViewModel:TaskViewModel
私有lateinit var fab:FloatingActionButton
var tasks=emptyList()
专用lateinit变量适配器:MainRecycleServiceAdapter
覆盖创建视图(
充气器:布局充气器,容器:视图组?,
savedInstanceState:捆绑?
):查看{
//为该碎片膨胀布局
val视图=充气机。充气(R.layout.fragment_main,容器,错误)
fab=view.findViewById(R.id.floatingActionButton)
//初始化recyclerview
recyclerView=view.findViewById(R.id.main\u recyclerView)
适配器=mainRecycleServiceAdapter()
recyclerView.adapter=适配器
recyclerView.layoutManager=LinearLayoutManager(view.context)
返回视图
}
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
sharedTaskViewModel=ViewModelProvider(this).get(TaskViewModel::class.java)
fab.setOnClickListener{
碎片管理器!!.beginTransaction().apply{
替换(R.id.fl_fragment_main,NewTaskFragment())
提交()
}
}
}
}

当我运行代码时,会收到以下消息:

2020-08-09 11:31:00.734 27860-27860/com.robybp.todolist E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.robybp.todolist, PID: 27860
java.lang.RuntimeException: Cannot create an instance of class com.robybp.todolist.view_models.TaskViewModel
    at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
    at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
    at com.robybp.todolist.view.fragments.MainFragment.onViewCreated(MainFragment.kt:45)
 Caused by: java.lang.InstantiationException: java.lang.Class<com.robybp.todolist.view_models.TaskViewModel> has no zero argument constructor
    at java.lang.Class.newInstance(Native Method)
2020-08-09 11:31:00.734 27860-27860/com.robybp.todolist E/AndroidRuntime:致命异常:main
进程:com.robybp.todolist,PID:27860
java.lang.RuntimeException:无法创建类com.robybp.todolist.view\u models.TaskViewModel的实例
在androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)中
位于androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187)
位于androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150)
在com.robybp.todolist.view.fragments.MainFragment.onViewCreated上(MainFragment.kt:45)
原因:java.lang.InstanceException:java.lang.Class没有零参数构造函数
位于java.lang.Class.newInstance(本机方法)
如果这个问题可能是“猥亵的”,请原谅我,但我只是对room和mvvm架构有所了解。 感谢您的理解。

尝试更换:

sharedTaskViewModel = ViewModelProvider(this).get(TaskViewModel::class.java)

尝试替换:

sharedTaskViewModel = ViewModelProvider(this).get(TaskViewModel::class.java)


这回答了你的问题吗?这回答了你的问题吗?嘿,这里需要帮助-->嘿,这里需要帮助-->
sharedTaskViewModel = ViewModelProvider.AndroidViewModelFactory(application)
    .create(TaskViewModel::class.java)