【问题标题】:How to inject app: Context in ViewModel with Hilt?如何使用 Hilt 注入应用程序:ViewModel 中的上下文?
【发布时间】:2020-07-28 23:42:17
【问题描述】:

您好,我正在尝试使用 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?) {
      ....

这是我尝试注入的 ViewModel 类

class MainViewModel @ViewModelInject constructor(
    @ApplicationContext application: Context,
    @Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {

    private val repositorio = WordRepositorio(application)

    val allWords = repositorio.mAllWords
...

感谢您的帮助! 谢谢

【问题讨论】:

标签: android kotlin dagger-hilt


【解决方案1】:

是的,代码没有任何问题。 问题出在某些库中,显然我遗漏了一些东西。

我通过添加解决了它:

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'

【讨论】:

    【解决方案2】:

    基础视图模型

    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)
      }
    }
    

    首页片段

    @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
      }
    

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 2020-11-14
      • 2021-04-18
      • 2022-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多