首页 > 解决方案 > Jetpack Compose:无法在 TextField 中显示文本

问题描述

最近我在玩 Jetpack Compose,我注意到文本可能不会出现在 TextField 中。

所以我有一个ViewModelwith Flowof ViewState

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

但是,如果我改变这个:

    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)

然后可以显示名称。但是看起来不太对劲?

标签: androidandroid-jetpack-compose

解决方案


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 跟踪这个变量,并“记住”它的值,并在重新组合时再次使用它,当控件再次到达初始化逻辑时。因此,记住在那里充当“守卫”,它不会让控件进入初始化逻辑,并返回它当前存储的变量的最新记忆值。


推荐阅读