当前位置: 首页 > 知识库问答 >
问题:

ViewModel没有零参数构造函数

施鸿
2023-03-14

我正在尝试使用recyclerview和room库创建一个简单的ToDoList应用程序。在使用room和mvvm架构方面,我正在遵循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的main片段中的代码:

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)

如果这个问题可能是“粗俗的”,请原谅我,但我只是对room和mvvm体系结构有所了解。谢谢你的理解。

共有1个答案

钦楚青
2023-03-14

尝试替换:

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

具有

sharedTaskViewModel = ViewModelProvider.AndroidViewModelFactory(application)
    .create(TaskViewModel::class.java)
 类似资料:
  • 我通过本文档了解LiveData和ViewModel。在文档中,ViewModel类具有构造函数, 但是,当我运行代码时,会出现异常: 原因:java.lang.运行时异常:无法创建类的实例UserViewModel原因:java.lang.实例异常:java.lang.类没有零参数构造函数

  • 我正在使用并试图将我的导入我的类。 当使用ViewModel查看Google的hilt文档时,我们可以看到他们能够将注入到所述

  • 我是新的Android和Java,并试图使基于位置的应用程序。 编辑 我做了一个非常非常简单的测试代码,得到了同样的错误。这是java: 我也犯了同样的错误。以下是我的应用程序级构建中的依赖项。格雷德尔: 原帖 我试图使用ViewModel和LiveData来更新用户位置,因为我知道这是生命周期感知的最佳方式。我有一个默认的地图活动... 一个扩展LiveData以存储用户位置的类。。。 以及一个

  • 注:在标记为副本之前,请仔细阅读。我已经尝试了所有现有的答案。 我在用匕首2。 视图模型实例已在活动中成功创建,但当我从同一活动中打开BottomSheet对话框时,无法创建实例。 日志: 用户界面。搜索viewmodel。SearchViewModel

  • 我得到了MyViewModel,它的构造函数是空的 我想提供这样的新模型,但有一个问题: 我确实实现了ViewModelProvider.Factory 但我不知道该怎么办,把没有指标的工厂退回去。如何实现? 谢谢

  • 我手动将我的应用程序从dagger2迁移到了刀柄。我没有遇到任何编译或构建错误。但当我尝试运行我的应用程序时,它会在启动屏幕上崩溃: 它说它不能创建那个viewmodel的实例,因为它没有零参数构造函数,但是:1-我的viewmodel类是用hilt注入的(BaseViewModel是抽象的): 2-我的活动用Android Entry Point注释(Base活动是抽象的): 3-视图模型所依赖