假设我们有一个 viewModel,里面有一个名为 apiKey 的值。此值的内容以 Flow 的形式从 DataStore 接收,然后作为 LiveData 公开。另一方面,我们有一个名为 SettingsFragment 的 Fragment,我们试图在 TextField 中显示该 apiKey,让用户对其进行修改并立即将其保存在 DataStore 中。我目前使用的解决方案在下面,但问题是当对文本进行更改时 UI 变得非常滞后和缓慢。我的问题是,实现这一点的最佳方法是什么,并且我们的 apiKey 仍然拥有单一的事实来源?
class SettingsViewModel() : ViewModel() {
val apiKey = readOutFromDataStore.asLiveData()
fun saveApiKey(apiKey: String) {
viewModelScope.launch(Dispatchers.IO) {
saveToDataStore("KEY", apiKey)
}
}
}
/** SettingsFragment **/
...
@Composable
fun ContentView() {
var text = mViewModel.apiKey.observeAsState().value?.apiKey ?: ""
Column() {
OutlinedTextField(
label = { Text(text = "API Key") },
value = text,
onValueChange = {
text = it
mViewModel.saveApiKey(it)
})
}
}