Android 无法从片段访问ViewModel方法
也许它有一个我看不到的简单解决方案。我有一个带有ViewModel的片段,ViewModel中有一个方法,我想从片段中调用该方法并为其提供参数。但当我尝试调用该方法时,它显示一个错误“未解决的引用”Android 无法从片段访问ViewModel方法,android,kotlin,viewmodel,Android,Kotlin,Viewmodel,也许它有一个我看不到的简单解决方案。我有一个带有ViewModel的片段,ViewModel中有一个方法,我想从片段中调用该方法并为其提供参数。但当我尝试调用该方法时,它显示一个错误“未解决的引用” class DetailFragmentViewModel:ViewModel(){ private val repo=Crepository.get() private val itemIdlivedata=MutableLiveData() var crimeLiveDate:LiveData=
class DetailFragmentViewModel:ViewModel(){
private val repo=Crepository.get()
private val itemIdlivedata=MutableLiveData()
var crimeLiveDate:LiveData=Transformations.switchMap(itemIdlivedata){it->
repo.getitem(it)}
趣味加载项(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
}
private val crimeDetailVM:ViewModel by lazy{
ViewModelProvider(this.get)(DetailFragmentViewModel::class.java)
}
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
...
crimeDetailVM.LoadItem您需要活动上下文
尝试:
ViewModelProvider(requireActivity()).get(DetailFragmentViewModel::class.java)
还可以使用“按活动扩展视图模型”视图模型
例如->类DetailFragmentViewModel(application:application):AndroidViewModel(applivation){}您正在将DetailFragmentViewModel向下转换到ViewModel。这就是您不访问DetailFragmentViewModel方法的原因
使用
而不是
private val crimeDetailVM : ViewModel by lazy {
ViewModelProvider(this).get(DetailFragmentViewModel::class.java)
}
同样,这种方式也不是惯用的,我建议您使用kotlin扩展
val viewModel by viewModels<DetailFragmentViewModel>()
val viewModel by viewModels()
但在此之前,您需要将依赖项Fragment KTX添加到您的app gradle文件中
您不是在为函数提供参数吗?crimeDetailVM.LoadItem(myUUID)
。还是为了简洁起见省略了它?@Beko我想调用LoadItem()从片段中,Loaditem将从存储库中拉出livedata,因此我可以在片段中观察它,我不知道为什么我无法访问method@Beko谢谢,但这不是问题的原因,即使有参数,它也找不到方法
private val crimeDetailVM : ViewModel by lazy {
ViewModelProvider(this).get(DetailFragmentViewModel::class.java)
}
val viewModel by viewModels<DetailFragmentViewModel>()