![](/img/trans.png)
[英]How can I get TextField value from another composable function in Jetpack Compose
[英]How can i change value in TextField value from viewModel in jetpack compose
我在我的項目中使用 jetpack compose,不知道如何從 viewmodel 更改“TextFile”值。
在我的活動中:
...
@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()
。 但除此之外,我建議將數據邏輯保留在 ViewModel 中,將 MutableStateFlow 設為私有並將不可變的 StateFlow 和 setter 方法暴露給可組合對象。
// 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 和 state 以及 kotlin 流程以了解更多信息。
您也可以使用mutableStateOf
代替MutableStateFlow
。 我覺得很簡單。
視圖模型
var dname by mutableStateOf("init value")
可組合的
TextField(
value = viewModel.dname,
onValueChange = { viewModel.dname = it }
)
在ViewModel
中,當你想改變值時,你可以調用dname = "test"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.