如何使用 Hilt 在 ViewModel 中注入应用程序:上下文?
How to inject app: Context in ViewModel with Hilt?
您好,我正在尝试使用 Hilt 注入视图模型,但出现以下错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.wordssample, PID: 25250
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.wordssample/com.example.wordssample.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.wordssample.MainViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.wordssample.MainViewModel
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:74)
at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:69)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
这是我的 MainActivity:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel by viewModels<MainViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
....
这是我要注入的 ViewModelclass
class MainViewModel @ViewModelInject constructor(
@ApplicationContext application: Context,
@Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {
private val repositorio = WordRepositorio(application)
val allWords = repositorio.mAllWords
...
感谢您的帮助!
谢谢
是的,代码没有任何问题。
问题出在某些库中,显然我遗漏了一些东西。
我通过添加解决了它:
implementation 'com.google.dagger:hilt-android:2.28-alpha'
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'
kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.0'
基础视图模型
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
open class BaseViewModel @Inject constructor(application: Application) : AndroidViewModel(application) {
protected val context
get() = getApplication<Application>()
}
HomeViewModel
@HiltViewModel
class HomeViewModel @Inject constructor(
application: Application,
private val userRepository: UserRepository
) : BaseViewModel(application) {
val text1 = MutableLiveData(context.getString(R.string.string_1))
fun update(){
text1.value = context.getString(R.string.string_2)
}
}
主页片段
@AndroidEntryPoint
class HomeFragment : Fragment(R.layout.home_fragment) {
private val binding: HomeFragmentBinding by dataBinding()
private val viewModel: HomeViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.vm = viewModel
}
您好,我正在尝试使用 Hilt 注入视图模型,但出现以下错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.wordssample, PID: 25250
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.wordssample/com.example.wordssample.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.example.wordssample.MainViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2426)
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.wordssample.MainViewModel
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:74)
at androidx.lifecycle.AbstractSavedStateViewModelFactory.create(AbstractSavedStateViewModelFactory.java:69)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
这是我的 MainActivity:
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel by viewModels<MainViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
....
这是我要注入的 ViewModelclass
class MainViewModel @ViewModelInject constructor(
@ApplicationContext application: Context,
@Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {
private val repositorio = WordRepositorio(application)
val allWords = repositorio.mAllWords
...
感谢您的帮助! 谢谢
是的,代码没有任何问题。 问题出在某些库中,显然我遗漏了一些东西。
我通过添加解决了它:
implementation 'com.google.dagger:hilt-android:2.28-alpha'
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02'
kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02'
kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.0'
基础视图模型
import android.app.Application
import androidx.lifecycle.AndroidViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
open class BaseViewModel @Inject constructor(application: Application) : AndroidViewModel(application) {
protected val context
get() = getApplication<Application>()
}
HomeViewModel
@HiltViewModel
class HomeViewModel @Inject constructor(
application: Application,
private val userRepository: UserRepository
) : BaseViewModel(application) {
val text1 = MutableLiveData(context.getString(R.string.string_1))
fun update(){
text1.value = context.getString(R.string.string_2)
}
}
主页片段
@AndroidEntryPoint
class HomeFragment : Fragment(R.layout.home_fragment) {
private val binding: HomeFragmentBinding by dataBinding()
private val viewModel: HomeViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.vm = viewModel
}