Nic*_*zzi 6 android observers android-lifecycle kotlin android-livedata
我正在与一个两次触发的 LiveData 观察者作斗争。在我的片段中,我观察LiveData如下,使用viewLifeCycleOwnerasLifeCycleOwner
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)
} 
这是我的视图模型:
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)
            }
        }
    }
}
当我第一次运行片段时,一切正常,但是当我转到它的 DetailFragment 并返回时,retailLiveData观察者回调被触发两次。根据这篇文章,这是一个已知的问题,通过引入viewLifeCycleOwner谁应该有助于在片段的视图被破坏后删除活动观察者而解决,但是在我的情况下似乎没有帮助。
发生这种情况是因为当您打开另一个片段时,视图模型保留了值,但该片段的视图已被破坏。当您返回片段时,将重新创建视图并订阅retailLiveData,它仍保留先前的值并在片段移动到启动状态时立即通知您的观察者。但你打电话retailViewModel.getRetailById(retail.id)的onViewCreated,所以一段时间后的值更新和观察员再次通知。
一种可能的解决方案是getRetailById()从视图模型的init方法中调用,结果将在视图模型生命周期内缓存。
| 归档时间: | 
 | 
| 查看次数: | 1784 次 | 
| 最近记录: |