从 DataStore 中读取一次值以更新片段中的选项菜单复选框状态
Read a value from DataStore once to update options menu checkbox state in a fragment
我在 Jetpack DataStore 中保存选项菜单复选框项 (checked/unchecked) 的状态:
override fun onOptionsItemSelected(item: MenuItem) =
when (item.itemId) {
R.id.action_hide_completed_tasks -> {
item.isChecked = !item.isChecked
viewModel.hideCompleted(item.isChecked)
true
}
else -> super.onOptionsItemSelected(item)
}
调用此方法的方法:
suspend fun updateHideCompleted(hideCompleted: Boolean) {
dataStore.edit { preferences ->
preferences[PreferencesKeys.HIDE_COMPLETED] = hideCompleted
}
}
现在我想在我的片段出现在屏幕上时恢复此复选框状态。但由于 Jetpack DataStore 以 Flow
的形式提供用户首选项,这感觉有点老套。我从 onPrepareOptionsMenu
中的 Flow
中收集并使用 take(1)
运算符只执行一次,因为之后我不再需要从首选项中更新复选框,状态自动单击选项菜单项时发生变化:
override fun onPrepareOptionsMenu(menu: Menu) {
lifecycleScope.launch {
viewModel.preferencesFlow
.take(1) // I want this to update only when the fragment comes onto the screen, afterward it's unnecessary
.collect {
menu.findItem(R.id.action_hide_completed_tasks).isChecked = it.hideCompleted
}
}
}
这是正确的做法吗?感觉有点hacky。异步在某些情况下会不会出问题?
我认为正确的方法是使用 Flow<T>.first()
运算符。
override fun onPrepareOptionsMenu(menu: Menu) {
lifecycleScope.launch {
val value = viewModel.preferencesFlow.first()
menu.findItem(R.id.action_hide_completed_tasks).isChecked = value.hideCompleted
}
}
我在 Jetpack DataStore 中保存选项菜单复选框项 (checked/unchecked) 的状态:
override fun onOptionsItemSelected(item: MenuItem) =
when (item.itemId) {
R.id.action_hide_completed_tasks -> {
item.isChecked = !item.isChecked
viewModel.hideCompleted(item.isChecked)
true
}
else -> super.onOptionsItemSelected(item)
}
调用此方法的方法:
suspend fun updateHideCompleted(hideCompleted: Boolean) {
dataStore.edit { preferences ->
preferences[PreferencesKeys.HIDE_COMPLETED] = hideCompleted
}
}
现在我想在我的片段出现在屏幕上时恢复此复选框状态。但由于 Jetpack DataStore 以 Flow
的形式提供用户首选项,这感觉有点老套。我从 onPrepareOptionsMenu
中的 Flow
中收集并使用 take(1)
运算符只执行一次,因为之后我不再需要从首选项中更新复选框,状态自动单击选项菜单项时发生变化:
override fun onPrepareOptionsMenu(menu: Menu) {
lifecycleScope.launch {
viewModel.preferencesFlow
.take(1) // I want this to update only when the fragment comes onto the screen, afterward it's unnecessary
.collect {
menu.findItem(R.id.action_hide_completed_tasks).isChecked = it.hideCompleted
}
}
}
这是正确的做法吗?感觉有点hacky。异步在某些情况下会不会出问题?
我认为正确的方法是使用 Flow<T>.first()
运算符。
override fun onPrepareOptionsMenu(menu: Menu) {
lifecycleScope.launch {
val value = viewModel.preferencesFlow.first()
menu.findItem(R.id.action_hide_completed_tasks).isChecked = value.hideCompleted
}
}