android - Jetpack Compose:无法在 TextField 中显示文本
问题描述
最近我在玩 Jetpack Compose,我注意到文本可能不会出现在 TextField 中。
所以我有一个ViewModel
with Flow
of 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)
然后可以显示名称。但是看起来不太对劲?
解决方案
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 跟踪这个变量,并“记住”它的值,并在重新组合时再次使用它,当控件再次到达初始化逻辑时。因此,记住在那里充当“守卫”,它不会让控件进入初始化逻辑,并返回它当前存储的变量的最新记忆值。
推荐阅读
- postgresql - 使用 spring boot 和 postgres 正确设置 docker compose
- python - 加载预训练的 fasttext 模型
- php - 如何设置多部分边界 ubuntu 20.04
- spring-mvc - Jacson Spring MVC 从 @RequstMapping 返回字符串作为原始 JSON
- mysql - 两个 Select 语句合二为一
- cmake - 使用 ninja 构建 Clang 工具,找不到 /snap/cmake/***/bin/cmake
- apache-camel - 使用 Apache Camel 公开 Rest API - 得到 404
- java - 除了 java.lang 包之外,还有什么会在 JShell 中自动导入?
- java - 如何在 Java 中使用字符⛁ (U+26C1)?
- ruby-on-rails - 管理部分的 Rails 6 路由,URL 中带有参数