ViewModel中的LiveData类型mistmatch

问题描述

我正在关注有关LiveData / Room / Persistence和Repository Architecture的UDACITY的Android教程之一。

将所有代码粘贴在一起之后,我遇到了(我认为这是一个很常见的问题)Type Mismatch异常。

在本课程示例中,创建了一个VideoRepository,其中包含一个成员视频,即LiveData:

class VideosRepository(private val database: VideosDatabase) {

/**
 * A playlist of videos that can be shown on the screen.
 */
    val videos: LiveData<List<Video>> =
        Transformations.map(database.videoDao.getVideos()) {
            it.asDomainModel()
        }

在模型中,我介绍了_video的mutablelivedata

val playlist = videosRepository.videos //works fine

// added by me
private val _video = mutablelivedata<List<Video>>()
val video: LiveData<List<Video>> = _video

当我尝试访问LiveData时,这就是类型不匹配的地方。

fun sample(){
   _video.value = videosRepository.videos //does not work and throws a Type mismatch.
   //required: List<Video> Found: LiveData<List<Video>>
}

如果我尝试将所有LiveData填充到viewmodel中(意味着,只有viewmodel将具有LiveData对象声明),然后将所有LiveData转换为纯列表和诸如这样的函数

fun getVideos(): List<Video>{
    return database.videoDao.getVideo()
}

然后我会得到无法访问主线程上的数据库,因为它可能会长时间锁定UI。,我很清楚。因此,如果是这样,那么LiveData是唯一的方法

但是如何摆脱类型不匹配的问题。

PS。我了解OOP和Java的概念,但从未有过深入的动手经验,因此请耐心等待。

解决方法

_video.value的输入是List<Video>,但是您分配的videosRepository.videosLiveData<List<Video>> 您必须从LiveData获取List<Video>

_video.value = videosRepository.videos.value
,

videosRepository.videos的数据类型为LiveData<List<Video>>,但_video.value的数据类型为List<Video>,因此不能这样分配。

尝试:

val video: LiveData<List<Video>> = videosRepository.videos

然后在视图中观察实时数据对数据进行所需的处理,例如Fragment

override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
   ...
   viewModel.video.observe(viewLifecycleOwner,Observer {
      val data: List<Video> = it
      // Do something with the data such as showing it...
   })  
}

如果您真的想拥有一个MutableLiveData以备日后修改,请使用MediatorLiveData

private val _video = MediatorLiveData<List<Video>>().apply {
   addSource(videosRepository.videos) {
      value = it
   }
}
val video: LiveData<List<Video>> = _video