如何将mutableIntStateOf()初始值设为ViewState中的API返回值?
解决方案
问题核心是ModellerSharedData中_userInputtedRetirementAge的初始值硬编码为0,API返回的初始退休年龄未同步到这个共享状态,导致初始显示时触发initialRetirementAge != userInputtedRetirementAge判断,显示了0。
方法一:从根源同步初始值(推荐)
修改ModellerSharedData,添加仅允许初始化一次的方法,确保用户输入状态的初始值与API返回值一致:
object ModellerSharedData { private var _userInputtedRetirementAge = mutableIntStateOf(0) private var isRetirementAgeInitialized = false // 标记是否已完成初始化 var UserInputtedRetirementAge: Int get() = _userInputtedRetirementAge.intValue set(value) { _userInputtedRetirementAge.intValue = value } val userInputtedRetirementAge get() = _userInputtedRetirementAge // 初始化退休年龄,仅执行一次,避免后续API刷新覆盖用户输入 fun initRetirementAge(initialAge: Int) { if (!isRetirementAgeInitialized) { _userInputtedRetirementAge.intValue = initialAge isRetirementAgeInitialized = true } } }
在ViewModel获取到API数据后,调用该初始化方法同步值:
init { viewModelScope.launch { personalProjectionsRepository.projectionsStateFlow //... .collect { repo -> val initialAge = repo.age viewState.value = ModellerInitialViewState(initialRetirementAge = initialAge) // 将API返回的初始值同步到共享状态 ModellerSharedData.initRetirementAge(initialAge) } } }
初始状态下userInputtedRetirementAge会与API返回的initialRetirementAge一致,Composable显示初始值;用户修改后共享状态更新,自动切换为显示用户输入的值。
方法二:临时调整Composable显示逻辑(不推荐,仅应急)
若不想修改共享状态结构,可在Composable中增加判断,当共享状态为初始0时显示API返回值:
MakeChangeCard( cardTitle = R.string.retirement_age_screen_title, editLinkText = R.string.edit_link, cardContent = if (userInputtedRetirementAge != 0) { userInputtedRetirementAge.toString() } else { initialRetirementAge.toString() }, onCardClick = onRetirementCardClick, modifier = Modifier.weight(1f) )
⚠️ 注意:该方法存在缺陷——若用户合法输入0,会错误显示初始值,仅适合临时场景使用。
内容的提问来源于stack exchange,提问作者callMe_whatever
相关产品推荐
相关产品推荐

