LiveData обозреватель vParePareOptionsMenu гонки - PullRequest
0 голосов
/ 26 января 2020

Я работаю над проектом, который позволяет пользователям входить в качестве гостей или зарегистрированных пользователей. Существует область приложения 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, поскольку наблюдатель может получить уведомление before меню инициализируется при запуске. Определенно я могу переместить эту строку кода в отдельную функцию и вызвать ее из двух точек, но разве нет лучшего решения?

1 Ответ

0 голосов
/ 28 января 2020

Используйте 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)
}
...