У меня есть объект ActivityUiState (типа ActivityUiState), который имеет список поддействий (также типа ActivityUiState) и список голосовых заметок. Я пытаюсь заполнить ActivityUiState списком поддействий и голосовыми заметками, используя потоки. Каждое из поддействий может иметь свои собственные голосовые заметки, сохраненные в базе данных, которые я хотел бы включить в объекты поддействий при создании списка поддействий. На данный момент код успешно добавляет поддействия и голосовые заметки в ActivityUiState. Однако когда я пытаюсь добавить голосовые заметки для каждого из поддействий, весь объект ActivityUiState не обновляется никакими данными. Что я здесь делаю не так?
fun selectActivity(id: UUID?) {
selectedActivityId.value = id
}
Мне нужно, чтобы ActivityUiState имел тип MutableState, поэтому я использую ActivityState как поток. Голосовые заметки последующих поддействий теперь загружены, спасибо
Не могли бы вы также помочь мне с этой небольшой проблемой: ActivityState и ActivityUiState не всегда обновляются при изменении значения selectedActivityId.
У меня есть объект ActivityUiState (типа ActivityUiState), который имеет список поддействий (также типа ActivityUiState) и список голосовых заметок. Я пытаюсь заполнить ActivityUiState списком поддействий и голосовыми заметками, используя потоки. Каждое из поддействий может иметь свои собственные голосовые заметки, сохраненные в базе данных, которые я хотел бы включить в объекты поддействий при создании списка поддействий. На данный момент код успешно добавляет поддействия и голосовые заметки в ActivityUiState. Однако когда я пытаюсь добавить голосовые заметки для каждого из поддействий, весь объект ActivityUiState не обновляется никакими данными. Что я здесь делаю не так? [code]var subActivitiesUiState = emptyList() activitiesRepository.getSubActivitiesPerMainActivity(id).collect { subActivities -> for (subActivity in subActivities) { var voiceNotesUiState = emptyList() // This code block results in an empty activityUiState being returned /* voiceNotesRepository.getAllVoiceNotesPerActivity(subActivity.id).collect { voiceNotes -> for (voiceNote in voiceNotes) { // Append the mapped voice note to the voice notes list voiceNotesUiState = voiceNotesUiState + VoiceNoteUiState( id = voiceNote.id, uri = voiceNote.uri, duration = voiceNote.duration, timestamp = voiceNote.timestamp, activityId = voiceNote.activityId ) }
var voiceNotesUiState = emptyList() voiceNotesRepository.getAllVoiceNotesPerActivity(id).collect { voiceNotes -> for (voiceNote in voiceNotes) { // Append the mapped voice note to the voice notes list voiceNotesUiState = voiceNotesUiState + VoiceNoteUiState( id = voiceNote.id, uri = voiceNote.uri, duration = voiceNote.duration, timestamp = voiceNote.timestamp, activityId = voiceNote.activityId ) }
activityUiState.update { it -> it.copy( voiceNotesUiState = voiceNotesUiState ) } } } [/code] [b]ОБНОВЛЕНИЕ 25.11.2025[/b] По предложению tyg я изменил свой код на следующее: [code]val selectedActivityId = MutableStateFlow(savedStateHandle.get(ACTIVITY_ID_SAVED_STATE_KEY))
val activityUiState = MutableStateFlow(ActivityUiState()) selectedActivityId.flatMapLatest { activityId -> @OptIn(ExperimentalCoroutinesApi::class) val activityState = selectedActivityId.flatMapLatest { activityId -> if (activityId == null) return@flatMapLatest flowOf(ActivityUiState())
val flowOfActivity = activitiesRepository.getActivityStream(activityId)
val flowOfSubActivities = activitiesRepository.getSubActivitiesPerMainActivity(activityId).flatMapLatest { subActivities -> val subActivitiesUiStates = subActivities.map { subActivity -> voiceNotesRepository.getAllVoiceNotesPerActivity(subActivity.id).map { voiceNotes -> ActivityUiState( date = subActivity.date, id = subActivity.id, title = subActivity.title, note = subActivity.note, startTime = subActivity.startTime, endTime = subActivity.endTime, voiceNotesUiState = voiceNotes.map { voiceNote -> VoiceNoteUiState( id = voiceNote.id, uri = voiceNote.uri, duration = voiceNote.duration, timestamp = voiceNote.timestamp, activityId = subActivity.id ) }, mainActivityId = subActivity.mainActivityId ) } } combine(subActivitiesUiStates) { it -> it.toList() } }
ActivityUiState() } } } .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(stopTimeoutMillis = 5000L), initialValue = ActivityUiState() ) [/code] [code]fun selectActivity(id: UUID?) { selectedActivityId.value = id } [/code] Мне нужно, чтобы ActivityUiState имел тип MutableState, поэтому я использую ActivityState как поток. Голосовые заметки последующих поддействий теперь загружены, [b]спасибо[/b] Не могли бы вы также помочь мне с этой небольшой проблемой: ActivityState и ActivityUiState не всегда обновляются при изменении значения selectedActivityId.