簡體   English   中英

Jetpack Compose:無法在 TextField 中顯示文本

[英]Jetpack Compose: Not able to show text in TextField

最近我在玩 Jetpack Compose,我注意到文本可能不會顯示在 TextField 中。

所以我有一個帶有ViewState FlowViewModel

在我的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.

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