【发布时间】: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