【发布时间】:2021-05-01 07:11:31
【问题描述】:
最近我使用了 MVVM 架构和 Livedata 和观察者。我可以使用 Transformation.switchmap() 。但我想使用另一种方法。我不知道它是否正确。我从存储库返回 liveate 值,然后我得到可变的实时数据。然后通过 get() 将其分配给 Livedata。最后在片段中使用观察者。没用。它似乎返回空值而不是由新值触发。
存储库:
fun getReviewPlace(idPlace:String): LiveData<MutableList<CommentModel>>
{
val Reviews:MutableLiveData<MutableList<CommentModel>> = MutableLiveData()
CoroutineScope(Dispatchers.IO).launch {
val requestReviews = ServiceBuilder.apiServiceFake.getReviewPlace(idPlace)
if (requestReviews.isSuccessful)
{
withContext(Dispatchers.Main) {
Reviews.value = requestReviews.body()
}
}
}
return Reviews
}
视图模型:
private var _Reviews:MutableLiveData<MutableList<CommentModel>> = MutableLiveData(mutableListOf())
val Reviews:LiveData<MutableList<CommentModel>> get () = _Reviews
fun getReviews(id:String)
{
_Reviews.value=AllInfoRepository.getReviewPlace(id).value
}
片段:
lateinit var myViewModel: allInfoViewModel
myViewModel=ViewModelProviders.of(this).get(allInfoViewModel::class.java)
myViewModel.getReviews(myId)
myViewModel.Reviews.observe(viewLifecycleOwner, Observer { ReviewsList ->
if(ReviewsList!=null) {
RVReviews.adapter = RVAdapterCommentOutsideInfo(mycontext, ReviewsList, 2)
}
else{
//it seems ReviewsList is always return null
}
})
编辑:我知道我可以直接将 LiveData 值返回到片段,就像在 viewModel 中这样:
fun getReviews(id:String)=AllInfoRepository.getReviewPlace(id)
那么观察者应该是:
myViewModel.getReviews(myId).observe(viewLifecycleOwner, Observer { ReviewsList ->
if(ReviewsList!=null) {
RVReviews.adapter = RVAdapterCommentOutsideInfo(mycontext, ReviewsList, 2)
}
})
我想知道上述方法不起作用的原因是什么。
【问题讨论】:
-
从使用断点逐行调试代码开始。从长远来看会帮助你。
标签: android kotlin mvvm android-livedata android-viewmodel