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

92dk7w1h  于 2023-11-15  发布在  Android
关注(0)|答案(2)|浏览(168)

我在我的项目中使用jetpack-compose,不知道如何从ViewModel更改TextField的值。

  • 在我的活动中:*
...
@Composable
fun myView() {
    var dName = remember {
        mutableStateOf(TextFieldValue(""))
    }
    TextField(
        value = dName.value, 
        onValueChange = { dName.value = it }, 
        modifier = Modifier.fillMaxWidth()
    )
}
...

字符串

  • 在我的ViewModel中:*
...
var dName = MutableStateFlow("")
...


我想在ViewModel中调用dName.value = "test",并更改TextField中显示的值。如何才能实现这一点?

ecbunoof

ecbunoof1#

假设你有一个名为viewModel的viewModel的引用,你只需要调用viewModel.name.collectAsState()。但除此之外,我建议保持ViewModel中的数据逻辑,方法是将MutableStateFlow设为私有,并向可组合对象公开一个不可变的StateFlow和一个setter方法。

// ViewModel
private val _name = MutableStateFlow("")
val name = _name.asStateFlow()

fun setName(name: String) {
  _name.value = name
}

个字符
正如您所看到的,我在这里没有使用remember { mutableStateOf(...) },因为ViewModel中的StateFlow是唯一的事实来源。
强制性地设置组合对象的值的方法在JetpackCompose提供的声明式API中没有意义。
尝试阅读Jetpack compose中的声明式/命令式UI和状态以及Kotlin流以了解更多信息。

p4tfgftt

p4tfgftt2#

你也可以用mutableStateOf来代替MutableStateFlow,我觉得很简单。
ViewModel

var dname by mutableStateOf("init value")

字符串
可组合

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


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

相关问题