我在我的项目中使用 jetpack-compose,并且不知道如何从我的 ViewModel 更改
TextField
的值。
在我的活动中:
...
@Composable
fun myView() {
var dName = remember {
mutableStateOf(TextFieldValue(""))
}
TextField(
value = dName.value,
onValueChange = { dName.value = it },
modifier = Modifier.fillMaxWidth()
)
}
...
在我的视图模型中:
...
var dName = MutableStateFlow("")
...
我想在 ViewModel 中调用
dName.value = "test"
并更改 TextField
中显示的值。我怎样才能做到这一点?
假设您有一个名为
viewModel
的 viewModel 引用,您只需调用 viewModel.name.collectAsState()
即可。但除此之外,我建议通过将 MutableStateFlow 设为私有并向可组合项公开不可变的 StateFlow 和 setter 方法,将数据逻辑保留在 ViewModel 中。
// ViewModel
private val _name = MutableStateFlow("")
val name = _name.asStateFlow()
fun setName(name: String) {
_name.value = name
}
// Composable
val name = viewModel.name.collectAsState()
TextField(
value = name,
onValueChange = viewModel::setName
)
如您所见,我在这里没有使用
remember { mutableStateOf(...) }
,因为 ViewModel 中的 StateFlow 是唯一的事实来源。
强制设置可组合项值的方法在 Jetpack Compose 提供的声明式 API 中没有意义。
尝试阅读 Jetpack compose 中的声明式/命令式 UI 和状态以及 kotlin flow 以了解更多信息。
您也可以使用
mutableStateOf
代替 MutableStateFlow
。我觉得很简单。
视图模型
var dname by mutableStateOf("init value")
可组合
TextField(
value = viewModel.dname,
onValueChange = { viewModel.dname = it }
)
在
ViewModel
中,当你想改变数值时,可以调用dname = "test"