Anonymous
Mutablestateflow в Android Compose и обновление состояния
Сообщение
Anonymous » 07 мар 2025, 12:09
Может быть, кто -то может помочь мне лучше понять, где проблема здесь.
Я не могу понять, почему, когда в прошлой инструзуционной промежутке.
Код: Выделить всё
@HiltViewModel
class OnBoardingViewModel
@Inject
constructor(
private val updateOnboardingCompletedUseCase: UpdateIsOnboardingCompletedUseCase,
) : ViewModel() {
private val _onBoardingState =
MutableStateFlow(
OnboardingState(),
)
val onBoardingState: StateFlow get() = _onBoardingState.asStateFlow()
fun navigateToScreen(screen: OnBoardingScreen) {
updateState { copy(currentScreen = screen) }
}
fun updateStartDate(date: LocalDate) {
updateState {
copy(menstruationEvent = menstruationEvent.copy(startDate = date))
}
}
fun updateOnboardingCompleted(menstruationEvent: MenstruationEvent) {
viewModelScope.launch(IO) {
updateOnboardingCompletedUseCase(menstruationEvent)
}
}
private fun updateState(update: OnboardingState.() -> OnboardingState) {
viewModelScope.launch {
_onBoardingState.value = _onBoardingState.value.update()
Log.e("updateState", "updateState: ${_onBoardingState.value}")
}
}
}
< /code>
и это композитно: < /p>
@Composable
fun OnBoardingScreen(
navigateTo: ((route: String) -> Unit),
modifier: Modifier = Modifier,
viewModel: OnBoardingViewModel = hiltViewModel(),
) {
val onBoardingState by viewModel.onBoardingState.collectAsState()
AnimatedContent(
targetState = onBoardingState,
transitionSpec = {
fadeIn(animationSpec = tween(600)) togetherWith fadeOut(animationSpec = tween(200))
},
label = "",
) {
Column(
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.padding(32.dp),
) {
when (it.currentScreen) {
OnBoardingScreen.Welcome -> {
Welcome {
viewModel.navigateToScreen(OnBoardingScreen.LastMenstruationEvent)
}
}
OnBoardingScreen.LastMenstruationEvent -> {
LastMenstruationStartDateInputScreen(
onDateSelect = { viewModel.updateStartDate(it) },
onNextClick = {
viewModel.navigateToScreen(OnBoardingScreen.EnterCycleDuration)
},
onNavigateBack = {
viewModel.navigateToScreen(OnBoardingScreen.Welcome)
},
showContinueButton = { onBoardingState.menstruationEvent.startDate != null },
)
}
}
}
}
}
Я ожидаю, когда будет выполнена функция обратного вызова.>
Подробнее здесь:
https://stackoverflow.com/questions/794 ... -the-state
1741338596
Anonymous
Может быть, кто -то может помочь мне лучше понять, где проблема здесь. Я не могу понять, почему, когда в прошлой инструзуционной промежутке.[code] @HiltViewModel class OnBoardingViewModel @Inject constructor( private val updateOnboardingCompletedUseCase: UpdateIsOnboardingCompletedUseCase, ) : ViewModel() { private val _onBoardingState = MutableStateFlow( OnboardingState(), ) val onBoardingState: StateFlow get() = _onBoardingState.asStateFlow() fun navigateToScreen(screen: OnBoardingScreen) { updateState { copy(currentScreen = screen) } } fun updateStartDate(date: LocalDate) { updateState { copy(menstruationEvent = menstruationEvent.copy(startDate = date)) } } fun updateOnboardingCompleted(menstruationEvent: MenstruationEvent) { viewModelScope.launch(IO) { updateOnboardingCompletedUseCase(menstruationEvent) } } private fun updateState(update: OnboardingState.() -> OnboardingState) { viewModelScope.launch { _onBoardingState.value = _onBoardingState.value.update() Log.e("updateState", "updateState: ${_onBoardingState.value}") } } } < /code> и это композитно: < /p> @Composable fun OnBoardingScreen( navigateTo: ((route: String) -> Unit), modifier: Modifier = Modifier, viewModel: OnBoardingViewModel = hiltViewModel(), ) { val onBoardingState by viewModel.onBoardingState.collectAsState() AnimatedContent( targetState = onBoardingState, transitionSpec = { fadeIn(animationSpec = tween(600)) togetherWith fadeOut(animationSpec = tween(200)) }, label = "", ) { Column( verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.padding(32.dp), ) { when (it.currentScreen) { OnBoardingScreen.Welcome -> { Welcome { viewModel.navigateToScreen(OnBoardingScreen.LastMenstruationEvent) } } OnBoardingScreen.LastMenstruationEvent -> { LastMenstruationStartDateInputScreen( onDateSelect = { viewModel.updateStartDate(it) }, onNextClick = { viewModel.navigateToScreen(OnBoardingScreen.EnterCycleDuration) }, onNavigateBack = { viewModel.navigateToScreen(OnBoardingScreen.Welcome) }, showContinueButton = { onBoardingState.menstruationEvent.startDate != null }, ) } } } } } [/code] Я ожидаю, когда будет выполнена функция обратного вызова.> Подробнее здесь: [url]https://stackoverflow.com/questions/79491746/mutablestateflow-in-android-compose-and-updating-the-state[/url]