簡體   English   中英

如何從 jetpack compose 中的 viewModel 更改 TextField 值中的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM