每当我尝试更新可变状态流(uiState(时,viewModel的init中的代码都会再次执行(因此uiState会重置(。
只有当我使用任何与uiState先前状态相关的信息时才会发生这种情况(至少这就是我认为给定以下代码的原因(。
代码:
init {
Log.d("Error log", "init again")
}
private val _uiState: MutableStateFlow<CreateGameState> =
MutableStateFlow(
CreateGameState.InputDataState(
selectedHeroes = listOf(),
selectedVillain = null,
selectedEncounters = listOf(),
)
)
val uiState: StateFlow<CreateGameState> = _uiState
fun onAction(action: CreateGameActions) {
when (action) {
is CreateGameActions.SelectHero -> {
when (_uiState.value) {
is CreateGameState.InputDataState -> {
_uiState.update {
/* this line causes the error */(it as CreateGameState.InputDataState).copy(selectedHeroes = it.selectedHeroes.plusElement(action.hero))
/* this line doesn't cause error */(it as CreateGameState.InputDataState).copy(selectedHeroes = listOf(Hero.SPIDERMAN))
}
}
}
}
}
}
}
因此,当只执行导致错误的行时,init
函数的Log会再次显示在Logcat中。这样,我就失去了uiState,我的应用程序总是停留在初始状态。
非常感谢您提前提供的帮助!
@Tenfour04是对的。我发现我是在一个可组合的中注入viewModel的,构造函数是默认参数。重新部署导致创建新的ViewModel。
只需注入viewModel的相同实例即可解决问题