Update ui from viewmodel

1 week ago 11
ARTICLE AD BOX

Im building audio app, which gets music from device's folder. I use ContentObserver to know when the data has changed

@RequiresApi(Build.VERSION_CODES.Q) class AudioObserver @Inject constructor( private val directoryChangeUseCase: DirectoryChangeUseCase ) : ContentObserver(Handler(Looper.getMainLooper())) { @RequiresApi(Build.VERSION_CODES.R) override fun onChange(selfChange: Boolean, uris: Collection<Uri?>, flags: Int) { super.onChange(selfChange, uris, flags) directoryChangeUseCase.directoryUpdated() } }

i use callback, to make viewmodel's function trigger too

class MusicViewModel @Inject constructor( private val fileRepository: FileRepository, private val audioManager: AudioManager ) : ViewModel(), DirectoryChangeUseCase{ private val _fetchedAudioList = MutableStateFlow<List<MusicUI>>(emptyList()) val fetchedAudioList = _fetchedAudioList.asStateFlow() override fun directoryUpdated() { fetchAudioFromDevice(true) } fun fetchAudioFromDevice(isUpdated: Boolean){ _fetchedAudioList.update{ fileRepository.fetchAudioFiles(isUpdated).map {it.toMusicUi()} } Log.d("called", "${_fetchedAudioList.value.size}") } }

but ui doesnt update, when _fetchedAudioList is updated

val musicUIList = musicViewModel.fetchedAudioList.collectAsStateWithLifecycle()

unless i trigger function by clicking on something

modifier = Modifier.clickable(onClick = {musicViewModel.fetchAudioFromDevice(true)})

how can i make ui update, when my list in viewmodel is updated

Read Entire Article