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