【问题标题】:Why Does LiveData return null when using get() instead of Transforamtion.switchmap?为什么 LiveData 在使用 get() 而不是 Transformation.switchmap 时返回 null?
【发布时间】: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


【解决方案1】:

你曾尝试在协程内完成任务之前消耗该值。

_Reviews.value=AllInfoRepository.getReviewPlace(id).value

此时,您的实时数据val Reviews:MutableLiveData&lt;MutableList&lt;CommentModel&gt;&gt; = MutableLiveData() 为空。

【讨论】:

    猜你喜欢
    • 2015-05-29
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多