gpt4 book ai didi

android - 从 StateFlow 收集状态

转载 作者:行者123 更新时间:2023-12-02 18:45:11 25 4
gpt4 key购买 nike

我在 Compose 和 MVVM 架构中开发该应用程序。我有 viewModel 与每个屏幕的 View 状态。 View 模型:

class ProfileViewModel : ViewModel() {

private val _state = MutableStateFlow(ProfileViewState())
val state: StateFlow<ProfileViewState> get() = _state

val actions = Channel<ProfileAction>()

init {
viewModelScope.launch {
combine(_state) {
ProfileViewState()
}.collect {
_state.value = it
}
}
}

状态:

class ProfileViewState {
val nick: MutableStateFlow<String> = MutableStateFlow("default nick")
}

当用户按下按钮时,我会更改状态中“nick”的值。

_state.value.nick.value = "new nick"

我想观察 View 中的状态并在数据发生变化时自动更新数据

@Composable
fun ProfileScreen() {
val viewModel: ProfileViewModel = viewModel()
val viewState by viewModel.state.collectAsState()
}

我尝试在其中显示“nick”值的 TextView

Text(text = viewState.nick.value, style = MaterialTheme.typography.h4)

问题是当我更改状态数据时,屏幕没有反应并且不更新。当我打开 ProfileScreen 时,我得到具有默认值的相同状态实例(?)

最佳答案

对于简单的情况,您可以在 ProfileViewState 中使用 mutableStateOf("default nick") 而不是 MutableStateFlow

类似于:

class ProfileViewState {
var nick by mutableStateOf("default nick")
}

在您的可组合项中:

  Text(text = viewState.value.nick, style = MaterialTheme.typography.h4)
Button(onClick = { viewState.value.nick= "new nick"}){Text("Update")}

如果您想使用MutableStateFlow,您必须观察nick
像这样的东西:

val nick = viewModel.state.value.nick.collectAsState()

Text(text = nick.value, style = MaterialTheme.typography.h4)
Button(onClick = { viewModel.state.value.nick.value = "new nick"}){Text("Update")}

在这种情况下,您还可以在 viewModel 中提供一个函数来更新昵称:

class HelloViewModel : ViewModel() {
//...

fun onNameChange(newName: String) {
_name.value = newName
}
}

class ProfileViewState {

val nick: MutableStateFlow<String> = MutableStateFlow("default nick")

fun onNickChange(newNick: String) {
nick.value = newNick
}
}

然后在您的可组合项中使用:

Button(
onClick = { viewModel.onNickChange("new nick2")}
){ /*..*/ }

关于android - 从 StateFlow 收集状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67546600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com