【问题标题】:how to fix 'Cannot create an instance of class com.example.todolist.ui.task.TaskViewModel'如何修复“无法创建 com.example.todolist.ui.task.TaskViewModel 类的实例”
【发布时间】:2021-03-26 09:28:18
【问题描述】:

TasksFragment.kt

@AndroidEntryPoint
class TasksFragment: Fragment(R.layout.fragment_tasks) {

private val taskViewModel: TaskViewModel by viewModels()

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

    val binding = FragmentTasksBinding.bind(view)
    val tasksAdapter = TasksAdapter()

    binding.recyclerViewTasks.apply {
        adapter = tasksAdapter
        layoutManager = LinearLayoutManager(requireContext())
        setHasFixedSize(true)
    }

    taskViewModel.tasks.observe(viewLifecycleOwner,{
        tasksAdapter.submitList(it)
    })

    setHasOptionsMenu(true)
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.menu_fragment_tasks,menu)

    val searchItem = menu.findItem(R.id.item_search)
    val searchView = searchItem.actionView as SearchView

    searchView.OnQueryTextChanged{
        taskViewModel.searchQuery.value = it
    }
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when(item.itemId){
        R.id.sort_by_name -> {
            taskViewModel.sortOrder.value = SortOrder.BY_NAME
            true
        }

        R.id.sort_by_date -> {
            taskViewModel.sortOrder.value = SortOrder.BY_DATE

            true
        }

        R.id.hide_items -> {
            item.isChecked = !item.isChecked
            taskViewModel.hideComplited.value = item.isChecked
            true
        }

        R.id.delete_all_items -> {
            true
        }
        else -> {
            super.onOptionsItemSelected(item)}
    }
}
}

TaskViewModel.kt

class TaskViewModel @Inject constructor(
private val taskDao: TaskDao
): ViewModel() {

val searchQuery = MutableStateFlow("")
val sortOrder = MutableStateFlow(SortOrder.BY_DATE)
val hideComplited = MutableStateFlow(false)
@ExperimentalCoroutinesApi
private val taskFlow = combine(
    searchQuery,
    sortOrder,
    hideComplited){
    query,sortorder,hidecomplited ->
    Triple(query,sortorder,hidecomplited)
}
    .flatMapLatest {(query,sortorder,hidecomplicated) ->
    taskDao.getTasks(query,sortorder,hidecomplicated)
}
@ExperimentalCoroutinesApi
val tasks = taskFlow.asLiveData()
}

enum class SortOrder{ BY_DATE,BY_NAME}

ToDoApplication.kt

@HiltAndroidApp
class TodoApplication: Application() {
}

Logcat

java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.todolist/com.example.todolist.ui.MainActivity}:java.lang.RuntimeException:无法创建 com.example.todolist 类的实例。 ui.task.TaskViewModel 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2706) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2767) 在 android.app.ActivityThread.-wrap12(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1514) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:163) 在 android.app.ActivityThread.main(ActivityThread.java:6205) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 原因:java.lang.RuntimeException:无法创建类 com.example.todolist.ui.task.TaskViewModel 的实例 在 androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221) 在 androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278) 在 androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:112) 在 androidx.hilt.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:81) 在 androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:69) 在 androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:84) 在 dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:111) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:187) 在 androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:150) 在 androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:54) 在 androidx.lifecycle.ViewModelLazy.getValue(ViewModelProvider.kt:41) 在 com.example.todolist.ui.task.TasksFragment.getTaskViewModel(TasksFragment.kt) 在 com.example.todolist.ui.task.TasksFragment.onViewCreated(TasksFragment.kt:37)

【问题讨论】:

  • 在虚拟机上添加@HiltViewModel注解。
  • 如果我添加这个 annonation 那么它会导致另一个错误

标签: android kotlin viewmodel dagger-hilt


【解决方案1】:
+ @HiltViewModel
class TaskViewModel @Inject constructor(
private val taskDao: TaskDao
): ViewModel() {

并添加代码

  @Provides
  @Singleton
  fun provideTaskDao(appDatabase: Db): TaskDao {
    return appDatabase.taskDao()
  }

【讨论】:

    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 2011-09-09
    • 2021-11-28
    • 2013-12-03
    • 2017-12-13
    • 1970-01-01
    相关资源
    最近更新 更多