ali*_*ter 6 android android-jetpack-compose
我有一个 TextField 组件,我想将其设置为初始内容。初始内容将使用 Flow 从数据库中获取。
我有这段TextField代码(大致遵循此 Codelabs 教程):
@Composable
private fun EntryText(placeholder: String, initialText: String = "", ) {
val (text, setText) = remember { mutableStateOf(initialText) }
EntryTextField(
text = text,
placeholder = placeholder,
onTextChanged = setText
)
}
Run Code Online (Sandbox Code Playgroud)
和
@Composable
private fun EntryTextField(text: String, placeholder: String, onTextChanged: (String) -> Unit) {
TextField(
modifier = Modifier.fillMaxWidth(),
value = text,
onValueChange = {
onTextChanged(it)
},
placeholder = { Text(text = placeholder) }
)
}
Run Code Online (Sandbox Code Playgroud)
我想像这样使用它来设置 aText和 的内容EntryText:
val entry by viewModel.getEntryContent().collectAsState(initial = "initial")
val hint = "hint"
Column {
Text(text = entry)
EntryText(placeholder = hint, initialText = entry)
}
Run Code Online (Sandbox Code Playgroud)
当 ViewModelgetEntryContent流从数据库发出结果时,仅Text使用新字符串更新 ,而不更新EntryText(它保持初始状态"initial")。
当我的 ViewModel 发出字符串时,如何更新我的 TextField?
因为您的文本由 处理ViewModel,我认为您可以将其状态存储ViewModel为
class MainViewModel : ViewModel() {
var entry = MutableStateFlow("initial")
fun getEntryContent(): Flow<String> {
// get from database
}
}
Run Code Online (Sandbox Code Playgroud)
在你的Activity
val entry by viewModel.entry.collectAsState()
Column {
Text(text = entry)
EntryText(placeholder = hint, text = entry, onTextChanged = {
viewModel.entry.value = it
})
}
lifecycleScope.launch {
viewModel.getEntryContent().flowWithLifecycle(lifecycle).collect {
// observe value from db then set to TextField
viewModel.entry.value = it
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3165 次 |
| 最近记录: |