gpt4 book ai didi

android - ViewModel没有零参数构造函数

转载 作者:行者123 更新时间:2023-12-03 10:25:04 26 4
gpt4 key购买 nike

我正在尝试使用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)
}
}
这是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()
}
}

}
}
当我运行代码时,我收到以下消息:
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架构。
谢谢你的理解。

最佳答案

尝试更换:

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

关于android - ViewModel没有零参数构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63324824/

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