我的ViewModel
类应异步加载User
数据和图像,完成后应将变量userLoaded
设置为true并触发宿主片段中的观察者使选项菜单膨胀。 ViewModel
内部的初始化是通过
init {
viewModelScope.launch {
userLoaded.value = false
try {
loadUser(id)
loadImg(id)
} catch (e: Exception){
Log.e(TAG, "${e.message}")
} finally {
userLoaded.value = true
}
}
}
loadUser()
和loadImg()
是两个suspend fun
,它们从Firebase
加载一些数据。主要问题在于,即使userLoaded.value
仅更改了一次,菜单也被放大了两次。以下是片段内的观察者
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
// menu.clear()
viewModel.userLoaded.observe(this, Observer {
if (it == true) {
inflater.inflate(R.menu.show_profile_menu, menu)
}
})
}
Update1: 这个解决方案怎么样?
override fun onPrepareOptionsMenu(menu: Menu) {
viewModel.userLoaded.observe(this, Observer {
menu.findItem(R.id.edit_icon).isVisible = it
menu.findItem(R.id.edit_icon).isEnabled = it
})
super.onPrepareOptionsMenu(menu)
}
答案 0 :(得分:0)
您不应订阅onCreateOptionsMenu
中的观察者,因为此方法可能被多次调用。您应该订阅onViewCreated
,
fun onViewCreated(view: View, savedInstanceState: Bundle?) {
/* other stuff */
viewModel.userLoaded.observe(this, Observer {
if (it == true) {
// toggle a global flag and recreate the menu
hasLoaded = true
activity?.invalidateOptionsMenu()
}
})
}
然后
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
// menu.clear()
if (hasLoaded) {
inflater.inflate(R.menu.show_profile_menu, menu)
}
}