我有问题收集歌曲从我的数据库。
宋道:
@Query("SELECT * FROM song_table")
fun observeSongs() : Flow<List<DatabaseSongListItem>>储存库:
fun observeSongs() = songDao.observeSongs()ViewModel:
private val _observeSongs = MutableStateFlow(emptyList<DatabaseSongListItem>())
val observeSongs = _observeSongs.asStateFlow()
viewModelScope.launch {
songListRepository.getSongs() -> this line can get api songs + it add songs to database
songListRepository.observeSongs().collect(){ songs ->
_observeSongs.value = songs
}
}MainActivity:
lifecycleScope.launch {
viewModel.observeSongs.collect {
Log.d(ContentValues.TAG, "MAIN: $it")
}这个代码正在工作,但我收集了我的歌曲2次,1在viewModel和另一个我的活动。我只想在活动中收集一次。但是,当我在viewModel中使用这一行代码时,我得到了以下内容:
_observeSongs.value = songListRepository.observeSongs()
Type mismatch.
Required:
List<DatabaseSongListItem>
Found:
Flow<List<DatabaseSongListItem>>我想在recyclerView中显示歌曲列表,这就是我需要歌曲列表的原因。
发布于 2022-10-14 15:19:03
我还不清楚你到底是怎么回事。我创建一个状态流并观察它的干净方式如下所示,但我不知道这是否实现了您想要做的事情。
SharingStarted设置将防止在活动脱离屏幕时对数据库进行不必要的监视,但它是可选的。
ViewModel:
val observeSongs = songListRepository.observeSongs()
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), emptyList())
init { // I'm assuming you were doing this in init, but maybe you have it in a function
viewModelScope.launch { songListRepository.getSongs() }
}活动:
lifecycleScope.launch {
viewModel.observeSongs.collect {
myRecyclerViewAdapter.submitList(it)
}
}
// or alternate syntax:
viewModel.observeSongs
.onEach { myRecyclerViewAdapter.submitList(it) }
.launchIn(lifecycleScope)https://stackoverflow.com/questions/74066675
复制相似问题