无法从片段访问 ViewModel 方法

时间:2021-03-20 10:10:58

标签: android kotlin viewmodel

可能它有一个我看不到的简单解决方案。我有一个带有 ViewModel 的片段,Viewmodel 内部有一个方法,我想从我的片段中调用它并为其提供参数。但是当我尝试调用该方法时,它显示错误“未解决的引用”

 class DetailFragmentViewModel : ViewModel() {

       private val repo = Crepository.get()
       private val itemIdlivedata = MutableLiveData<UUID>()
       var crimeLiveDate: LiveData<Crime?> = Transformations.switchMap(itemIdlivedata){ it -> 
       repo.getitem(it) }
    fun LoadItem(itemuuid:UUID){
     itemIdlivedata.value = itemuuid
                          }
                  }

片段类:

  private val crimeDetailVM : ViewModel by lazy {
    ViewModelProvider(this).get(DetailFragmentViewModel::class.java)
}
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
     ...

   crimeDetailVM.LoadItem <- Unsolved Reference 

}

感谢您的帮助!

编辑:它有一个简单的解决方案,我没有将视图模型转换为视图模型类,谢谢大家的帮助

2 个答案:

答案 0 :(得分:1)

您正在将 DetailFragmentViewModel 向下转换到 ViewModel。这就是您没有访问 DetailFragmentViewModel 方法的原因。

使用

private val crimeDetailVM : DetailFragmentViewModel by lazy {
    ViewModelProvider(this).get(DetailFragmentViewModel::class.java)
}

代替

private val crimeDetailVM : ViewModel by lazy {
    ViewModelProvider(this).get(DetailFragmentViewModel::class.java)
}

这种方式也不是惯用的,我建议你使用 kotlin 扩展

val viewModel by viewModels<DetailFragmentViewModel>()

但在此之前,您需要将 Fragment KTX 依赖项添加到您的应用程序 gradle 文件中。

https://developer.android.com/kotlin/ktx

答案 1 :(得分:0)

您需要活动上下文 尝试: ViewModelProvider(requireActivity()).get(DetailFragmentViewModel::class.java)

您也可以通过 ActivityViewModel 使用扩展视图模型 例如-> class DetailFragmentViewModel(application:Application) : AndroidViewModel(applivation){}