即使被观察的变量被改变一次,观察者也会被触发两次
Observer is triggered twice even though the observed variable is changed once
我的 ViewModel
class 应该异步加载 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)
}
})
}
更新1:
这个解决方案怎么样?
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)
}
你不应该订阅 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)
}
}
我的 ViewModel
class 应该异步加载 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)
}
})
}
更新1: 这个解决方案怎么样?
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)
}
你不应该订阅 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)
}
}