gpt4 book ai didi

android - LiveData 观察者与 onPrepareOptionsMenu 竞赛

转载 作者:行者123 更新时间:2023-12-02 13:44:43 29 4
gpt4 key购买 nike

我正在开发一个项目,该项目允许用户作为访客或注册用户加入。
有应用范围user具有当前用户类型的 LiveData 的对象

private val _isGuest = MutableLiveData<Boolean>()
val isGuest: LiveData<Boolean>
get() = _isGuest

有HomeFragment需要显示 logout注册用户的菜单项。
fragment 有一个绑定(bind)到全局属性的 ViewModel
val isGuest: LiveData<Boolean> = MainApplication.user.isGuest

fragment 观察数据
var menu: Menu? = null

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
...
viewModel.isGuest.observe(viewLifecycleOwner, Observer {
menu?.findItem(R.id.action_logout)?.isVisible = !it
})
}

override fun onPrepareOptionsMenu(menu: Menu) {
this.menu = menu
menu.findItem(R.id.action_logout)?.isVisible = !isGuest
super.onPrepareOptionsMenu(menu)
}

我需要在观察者中切换菜单项,因为注册用户可以在运行时注销并且当前屏幕需要分别更新。

问题是我还必须复制 onPrepareOptionsMenu 中的代码,因为观察者可能会收到通知 before菜单在启动时初始化。
当然我可以将那行代码移到一个单独的函数中并从两点调用它,但没有更好的解决方案吗?

最佳答案

使用 invalidateOptionsMenu() 触发 onPrepareOptionMenu()

var menu: Menu? = null

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
...
viewModel.isGuest.observe(viewLifecycleOwner, Observer {
activity?.invalidateOptionsMenu()//This will trigger onPrepareOptionsMenu
})
}

override fun onPrepareOptionsMenu(menu: Menu) {
this.menu = menu
menu.findItem(R.id.action_logout)?.isVisible = !isGuest
super.onPrepareOptionsMenu(menu)
}

关于android - LiveData 观察者与 onPrepareOptionsMenu 竞赛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59918855/

29 4 0