【发布时间】:2021-07-16 14:40:22
【问题描述】:
最近我在玩 Jetpack Compose,发现文本可能不会显示在 TextField 中。
所以我有一个ViewModel 和Flow 的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)
然后可以显示名称。但是看起来不太对劲?
【问题讨论】:
标签: android android-jetpack-compose