gpt4 book ai didi

android - LiveData 观察者触发了两次,即使有 viewLifecycleOwner

转载 作者:行者123 更新时间:2023-11-29 18:29:00 25 4
gpt4 key购买 nike

我正在与一个触发两次的 LiveData 观察器作斗争。在我的 fragment 中,我正在观察如下的 LiveData,使用 viewLifeCycleOwner 作为 LifeCycleOwner

private lateinit var retailViewModel: RetailsViewModel

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
retailViewModel = ViewModelProviders.of(this).get(RetailsViewModel::class.java)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

retailViewModel.retailLiveData.observe(viewLifecycleOwner, Observer {
// updating UI here, but firing twice!
}

retailViewModel.getRetailById(retail.id)
}

这是我的 View 模型:

class RetailsViewModel(override val service: MyFoodyApiService = MyFoodyApiService.service) :
BaseViewModel(service) {

var retailLiveData: MutableLiveData<Retail> = MutableLiveData()

fun getRetailById(id: Int) {
scope.launch {
try {
val response =
service.getRetailById(authString, id).await()
when (response.isSuccessful) {
true -> {
response.body()?.let { payload ->
retailLiveData.postValue(payload.data)
} ?: run {
errorLiveData.postValue("An error occurred: ${response.message()}")
}
}
false -> errorLiveData.postValue("An error occurred: ${response.message()}")
}
} catch (e: Exception) {
noConnectionLiveData.postValue(true)
}
}
}

}

当我第一次运行 fragment 时,一切正常,但是当我转到它的 DetailFragment 并返回时,retailLiveData 观察者回调被触发两次。根据this article这是一个通过引入 viewLifeCycleOwner 解决的已知问题,一旦 fragment 的 View 被销毁,它应该有助于移除活跃的观察者,但它似乎对我的情况没有帮助。

最佳答案

发生这种情况是因为当您打开另一个 fragment 时 View 模型保留值,但 fragment 的 View 被销毁。当您返回 fragment 时,将重新创建 View 并订阅 retailLiveData,它仍保留先前的值并在 fragment 移动到开始状态时立即通知您的观察者。但是您在 onViewCreated 中调用了 retailViewModel.getRetailById(retail.id),所以过了一会儿,值会更新并再次通知观察者。

一种可能的解决方案是从 View 模型的 init 方法调用 getRetailById(),结果将在 View 模型的生命周期内缓存。

关于android - LiveData 观察者触发了两次,即使有 viewLifecycleOwner,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57433724/

25 4 0