我如何从jetpack compose中的viewModel更改TextField值中的值

问题描述 投票:0回答:2

我在我的项目中使用 ,并且不知道如何从我的 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
中显示的值。我怎样才能做到这一点?

android kotlin viewmodel textfield android-jetpack-compose
2个回答
7
投票

假设您有一个名为

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 以了解更多信息。


7
投票

您也可以使用

mutableStateOf
代替
MutableStateFlow
。我觉得很简单。

视图模型

var dname by mutableStateOf("init value")

可组合

TextField(
    value = viewModel.dname,
    onValueChange = { viewModel.dname = it }
)

ViewModel
中,当你想改变数值时,可以调用
dname = "test"

© www.soinside.com 2019 - 2024. All rights reserved.