Flo*_*her 5 android android-architecture-components android-jetpack android-jetpack-datastore
我将选项菜单复选框项的状态(选中/未选中)保存在 Jetpack DataStore 中:
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)
}
Run Code Online (Sandbox Code Playgroud)
它调用这个方法:
suspend fun updateHideCompleted(hideCompleted: Boolean) {
dataStore.edit { preferences ->
preferences[PreferencesKeys.HIDE_COMPLETED] = hideCompleted
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我的片段出现在屏幕上时,我想恢复此复选框状态。但由于 Jetpack DataStore 以 的形式提供用户首选项Flow,这感觉有点 hacky。我从中收集并使用运算符仅执行一次,因为此后我不再需要从首选项中更新复选框,当我单击选项菜单项时状态会自动更改Flow:onPrepareOptionsMenutake(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
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?感觉有点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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1002 次 |
| 最近记录: |