android - 如何注入(inject)应用程序 : Context in ViewModel with Hilt?

标签 android kotlin dagger-hilt

您好,我正在尝试使用 Hilt 注入(inject) View 模型,但出现以下错误:

 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) 
这是我的主要 Activity :
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
   
    private val viewModel  by viewModels<MainViewModel>()


    override fun onCreate(savedInstanceState: Bundle?) {
      ....
这是我试图注入(inject)的 ViewModel 类
class MainViewModel @ViewModelInject constructor(
    @ApplicationContext application: Context,
    @Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {

    private val repositorio = WordRepositorio(application)

    val allWords = repositorio.mAllWords
...
感谢您的帮助!
谢谢

最佳答案

基础 View 模型

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>()
}
主页查看模型
@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)
  }
}
首页 fragment
@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
  }

关于android - 如何注入(inject)应用程序 : Context in ViewModel with Hilt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63144315/

相关文章:

android - 仅在外部浏览器中打开网页链接

android - 对于 204 无内容响应,Retrofit2 在 kotlin 中返回 null Unit

android - 使用 Workmanager 进行 Hilt Instrumentation 测试不工作

android - Unresolved reference @HiltAndroidApp 或 Android 中的任何其他 Hilt 注释

Android 刀柄 : How I can inject any object in Object class or singleton class

android - v7 工具栏选项菜单项到最右边 - 如何添加边距

Android - 库模块的 Gradle 依赖项

android - 如何在没有直接导航链接的情况下在两个 Activity 之间传递数据?

android - 安装 Android 应用程序时触发一次性功能

android - Firebase android 无法在测试设备之外工作