- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在探索 Dagger-Hilt 的 ViewModelInject 时,我按照 https://developer.android.com/training/dependency-injection/hilt-jetpack#viewmodels 中的示例进行操作。
我尝试将 ViewModel 注入(inject)到我的 Activity 中,如下所示
import android.app.Application
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.viewModels
import androidx.hilt.Assisted
import androidx.hilt.lifecycle.ViewModelInject
import androidx.lifecycle.*
import androidx.savedstate.SavedStateRegistryOwner
import dagger.hilt.android.AndroidEntryPoint
import dagger.hilt.android.HiltAndroidApp
import kotlinx.android.synthetic.main.activity_main.*
import javax.inject.Inject
import javax.inject.Singleton
@HiltAndroidApp
class MainApplication: Application()
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel: MyViewModel by viewModels()
private val textDataObserver =
Observer<String> { data -> text_view.text = data }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel.showTextDataNotifier.observe(this, textDataObserver)
btn_fetch.setOnClickListener { viewModel.fetchValue() }
}
}
class MyViewModel @ViewModelInject constructor(
@Assisted val savedStateHandle: SavedStateHandle,
val repository: Repository
) :
ViewModel(), LifecycleObserver {
private val showTextLiveData
= savedStateHandle.getLiveData<String>("DefaultKey")
val showTextDataNotifier: LiveData<String>
get() = showTextLiveData
fun fetchValue() {
showTextLiveData.value = repository.getMessage()
}
}
@Singleton
class Repository @Inject constructor() {
fun getMessage() = "From Repository"
}
它崩溃提示
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.elyeproj.simplehilt.MyViewModel
at androidx.lifecycle.ViewModelProvider$NewInstanceFactory.create(ViewModelProvider.java:221)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:278)
at androidx.lifecycle.SavedStateViewModelFactory.create(SavedStateViewModelFactory.java:106)
at androidx.hilt.lifecycle.HiltViewModelFactory.create(HiltViewModelFactory.java:69)
我尝试使用 View 模型工厂(非注入(inject)方法)手动创建 ViewModel,它工作正常。
import android.app.Application
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.activity.viewModels
import androidx.hilt.Assisted
import androidx.hilt.lifecycle.ViewModelInject
import androidx.lifecycle.*
import androidx.savedstate.SavedStateRegistryOwner
import dagger.hilt.android.AndroidEntryPoint
import dagger.hilt.android.HiltAndroidApp
import kotlinx.android.synthetic.main.activity_main.*
import javax.inject.Inject
import javax.inject.Singleton
@HiltAndroidApp
class MainApplication: Application()
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel: MyViewModel by viewModels{
MyViewModelFactory(this, Repository(), intent.extras)
}
private val textDataObserver =
Observer<String> { data -> text_view.text = data }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel.showTextDataNotifier.observe(this, textDataObserver)
btn_fetch.setOnClickListener { viewModel.fetchValue() }
}
}
class MyViewModelFactory(
owner: SavedStateRegistryOwner,
private val repository: Repository,
defaultArgs: Bundle? = null
) : AbstractSavedStateViewModelFactory(owner, defaultArgs) {
override fun <T : ViewModel> create(key: String, modelClass: Class<T>, handle: SavedStateHandle
): T {
return MyViewModel(
handle,
repository
) as T
}
}
class MyViewModel @ViewModelInject constructor(
@Assisted val savedStateHandle: SavedStateHandle,
val repository: Repository
) :
ViewModel(), LifecycleObserver {
private val showTextLiveData
= savedStateHandle.getLiveData<String>("DefaultKey")
val showTextDataNotifier: LiveData<String>
get() = showTextLiveData
fun fetchValue() {
showTextLiveData.value = repository.getMessage()
}
}
@Singleton
class Repository @Inject constructor() {
fun getMessage() = "From Repository"
}
我在使用
@ViewModelInject
时做错了什么吗? ?
最佳答案
@ViewModelInject
在较新的 hilt
中已弃用版本
https://developer.android.com/reference/androidx/hilt/lifecycle/ViewModelInject
使用HiltViewModel
@HiltViewModel
class TasksViewModel @Inject constructor(
val taskRepository: TaskRepository
) : ViewModel() {
}
关于android - Dagger-Hilt:@ViewModelInject 没有注入(inject) MyViewModel 并崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62659094/
我尝试使用Catel中使用服务的最佳方法,即在viewmodel的构造函数中注入(inject)服务: public MyViewModel(IMessageService msgService) {
在探索 Dagger-Hilt 的 ViewModelInject 时,我按照 https://developer.android.com/training/dependency-injection/
首先,我对 MVVM 的概念非常陌生。我什至不确定我在这里问的是一个 MVVM 问题。所以请原谅我在这里可能犯的错误。 我正在尝试 Bind Foreground TextBlock 的属性(prop
我遇到了访问 View 模型的问题。 我有一个 Activity 和 2 个 fragment 。我有一个用于 Activity 和 fragment 的 View 模型,使用在主机 Activity
我遇到了访问 View 模型的问题。 我有一个 Activity 和 2 个 fragment 。我有一个用于 Activity 和 fragment 的 View 模型,使用在主机 Activity
我是一名优秀的程序员,十分优秀!