[英]Jetpack Compose: Not able to show text in TextField
最近我在玩 Jetpack Compose,我注意到文本可能不會顯示在 TextField 中。
所以我有一個帶有ViewState
Flow
的ViewModel
。
在我的Compose
文件中,我有類似的內容:
@Composable
internal fun TestScreen() {
val state by viewModel.state.collectAsState()
TestScreen {
viewState = state,
actioner = { ... }
}
}
@Composable
private fun TestScreen(viewState: ViewState, actioner: () -> Unit) {
var name by remember {
mutableStateOf(
TextFieldValue(viewState.name)
)
}
Surface {
....
Column {
....
OutlinedTextField(
...
value = name,
onValueChange = { textFieldValue ->
name = textFieldValue
actioner(...)
}
)
}
}
}
OutlineTextField
永遠不會顯示viewState.name
已經viewState.name
但是,如果我改變這一點:
var name by remember {
mutableStateOf(
TextFieldValue(viewState.name)
)
}
對此:
var name = TextFieldValue(viewState.name)
顯然它可以顯示viewState.name
的值。
根據文檔( https://developer.android.com/jetpack/compose/state#state-in-composables ),它建議使用remember
& mutableStateOf
來處理更改。
如果有人能幫我解釋為什么帶有remember
的代碼不起作用但直接分配的值起作用,我將不勝感激?
viewState.name
是一個String
我通過執行以下操作“部分解決”了這個問題:
var name by remember {
mutableStateOf(
TextFieldValue("")
)
}
name = TextFieldValue(viewState.name)
然后可以顯示名稱。 但看起來不太對勁?
remember
只是為了確保在重組時, mutableStateOf
對象的值不會被重新初始化為初始值。
例如,
@Composable
fun Test1(){
var text by mutableStateOf ("Prev Text")
Text(text)
Button(onClick = { text = "Updated Text" }){
Text("Update The Text")
}
}
不會在按鈕單擊時更新文本。 這是因為單擊按鈕會更改 mutableStateOf text
,這將觸發重新組合。 但是,當控件到達 Composable 的第一行時,它會將變量text
重新初始化為“Prev Text”。
這就是remember
用武之地。
如果您將上面的初始化更改為
var text by remember { mutableStateOf ("Prev Text") }
,
它會告訴 compose 跟蹤這個變量,並“記住”它的值,並在重新組合時再次使用它,當控件再次到達初始化邏輯時。 因此,請記住那里充當“守衛”,它不會讓控件進入初始化邏輯,並返回它當前存儲的變量的最新記住值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.