Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android LiveData观察者与OnPrepareOptions功能表竞赛_Android_Kotlin_Android Livedata - Fatal编程技术网

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)
}