我正在研究一个项目,该项目可以使用户成为访客或注册用户。存在具有当前用户类型的LiveData的应用程序范围user
对象
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中复制代码,因为观察者可能会收到通知,before
菜单在启动时已初始化。绝对可以将那行代码移到单独的函数中,并从两点进行调用,但是没有更好的解决方案吗?
使用invalidateOptionsMenu()来触发onPrepareOptionMenu()
var menu: Menu? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
...
viewModel.isGuest.observe(viewLifecycleOwner, Observer {
invalidateOptionsMenu()//This will trigger onPrepareOptionsMenu
})
}
override fun onPrepareOptionsMenu(menu: Menu) {
this.menu = menu
menu.findItem(R.id.action_logout)?.isVisible = !isGuest
super.onPrepareOptionsMenu(menu)
}