Android LiveData观察者与OnPrepareOptions功能表竞赛
我正在做一个项目,让用户以来宾或注册用户的身份进入。 存在一个应用程序范围Android LiveData观察者与OnPrepareOptions功能表竞赛,android,kotlin,android-livedata,Android,Kotlin,Android Livedata,我正在做一个项目,让用户以来宾或注册用户的身份进入。 存在一个应用程序范围user对象,该对象具有当前用户类型的LiveData private val _isGuest = MutableLiveData<Boolean>() val isGuest: LiveData<Boolean> get() = _isGuest 片段观察数据 var menu: Menu? = null override fun onViewCreated(view: View,
user
对象,该对象具有当前用户类型的LiveData
private val _isGuest = MutableLiveData<Boolean>()
val isGuest: LiveData<Boolean>
get() = _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)
}
我需要在observer中切换菜单项,因为注册用户可以在运行时注销,并且当前屏幕需要分别更新
问题是,我还必须在OnPrepareOptions菜单中复制代码,因为在启动时初始化菜单之前,观察者可能会得到通知。
当然,我可以将这行代码移动到一个单独的函数中,并从这两点调用它,但没有更好的解决方案吗?使用InvalidateOptions菜单()触发OnPrepareOptions菜单()
当观察员收到通知时,该菜单可能还不存在。因此,如果您想在准备菜单后观察实时数据中的变化,可以调用viewModel.isGuest.observe(viewLifecycleOwner,observer{activity?.InvalidateOptions菜单()//这将在super.OnPrepareOptions菜单(菜单)之后触发OnPrepareOptions菜单})
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)
}
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)
}