我正在开发一个项目,该项目允许用户以访客或注册用户的身份登录。有一个应用程序范围的user
对象,其中包含当前用户类型的LiveData。
private val _isGuest = MutableLiveData<Boolean>()
val isGuest: LiveData<Boolean>
get() = _isGuest
有一个 HomeFragment,需要为已注册用户显示 logout
菜单项。该片段具有绑定到全局属性的 ViewModel。
val isGuest: LiveData<Boolean> = MainApplication.user.isGuest
该片段观察数据
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中复制代码,因为观察者可能会在启动时在菜单初始化之前被通知。当然,我可以将那行代码移动到一个单独的函数中,并从两个点调用它,但难道没有更好的解决方案吗?