【问题标题】:ViewModel has no zero argument constructorViewModel 没有零参数构造函数
【发布时间】:2020-08-09 09:45:23
【问题描述】:

我正在尝试使用 recyclerview 和房间库制作一个简单的 ToDoList 应用程序。我正在关注using room and mvvm architecture 上的 android 开发人员代码实验室,我似乎遇到了困难。我已经设置了应用程序的每一层,但是在尝试使用 ViewModelProvider 实例化 ViewModel 时出现错误。这是我的ViewModel 课程的代码。

class TaskViewModel(application: Application) : AndroidViewModel(application) {

private val repository : TaskRepository

val allTasks : LiveData<List<Task>>



init{
    val tasksDao = TaskRoomDatabase.getDatabase(application)!!.taskDao()
    repository = TaskRepository(tasksDao)
    allTasks = repository.allTasks

}

fun saveTask(task : Task) = viewModelScope.launch(Dispatchers.IO){
    repository.saveTask(task)
}

}

这是我尝试初始化 ViewModel 的 MainFragment 中的代码:

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()
        }
    }

}

}

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

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)

如果问题可能是“Obslite”,请原谅我,但我只是熟悉房间和 mvvm 架构。 感谢您的理解。

【问题讨论】:

标签: android kotlin mvvm android-room viewmodel


【解决方案1】:

尝试替换:

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

sharedTaskViewModel = ViewModelProvider.AndroidViewModelFactory(application)
    .create(TaskViewModel::class.java)

【讨论】:

猜你喜欢
  • 2017-10-26
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 2023-01-02
相关资源
最近更新 更多