内部に apiKey という値を持つ viewModel があるとします。この値の内容をフローとして DataStore から受け取り、LiveData として公開します。一方、SettingsFragment という Fragment があり、その apiKey を TextField 内に表示しようとしています。ユーザーがそれを変更して、すぐに 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)
})
}
}