在 Compose 中设置 Flow 中 TextField 的初始值

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?

Pha*_*inh 1

因为您的文本由 处理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)