gpt4 book ai didi

android - 观察 onCreate fragment 时调用的 LiveData

转载 作者:行者123 更新时间:2023-12-02 13:34:47 26 4
gpt4 key购买 nike

简而言之:当 Observe 处于 Activity 状态时,它会在我通知时正常工作,但是当我返回到上一个 fragment (我使用导航组件)并再次导航到当前 fragment 时,会创建 fragment ,并且出于某种原因调用了 Observe。

为什么返回时Observe没有被删除?它应该根据 fragment 的生命周期行事。我尝试在 onStop 上删除,但仍然调用了 observe。

更多细节:我的每个项目 fragment 都分为3个部分:model、viewModel、view在 View 部分,我首先设置了 viewModel。

class EmergencyFragment : Fragment() {

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

在 onViewCreated 中我设置了 Observer 对象,这样在 LiveData 中所做的任何更改我都会在此处收到更改通知:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.observe(viewLifecycleOwner, Observer {
Log.d("sendEmergencyEvent", "isEmergencyEventMediaLDSuccess observer called")
}
})
}

在 ViewModel 类中,我将 LiveData 参数设置如下:

EmergencyFragmentViewModel: ViewModel() {
var isEmergencyEventMediaLDSuccess: LiveData<Boolean> = MutableLiveData()
private set
private val observerEventMedia = Observer<Boolean> { (isEmergencyEventMediaLDSuccess as MutableLiveData).value = it}

在初始化中我设置了一个观察者:

init {
EmergencyFragmentModel.isEmergencyEventMediaLDSuccessModel.observeForever(observerEventMedia)
}

当然在需要的时候删除

override fun onCleared() {
super.onCleared()
EmergencyFragmentModel.isEmergencyEventMediaLDSuccessModel.removeObserver(observerEventMedia)
}

模型部分定义如下:

class EmergencyFragmentModel {
companion object{
val isEmergencyEventMediaLDSuccessModel: LiveData<Boolean> = MutableLiveData()

我确实请求网络,当回复返回时我执行通知

override fun onResponse(call: Call<Int>, response: Response<Int>) {
if(response.isSuccessful) {
(isEmergencyEventLDModelSuccess as MutableLiveData).postValue(true)
Log.d("succeed", "sendEmergencyEvent success: ${response.body().toString()}")
}

谁能说出我错过了什么?为什么当有一个 Activity 的 Observe 并且我返回到上一个 fragment (我使用导航组件)并再次导航到当前 fragment 时,Observe 被调用?我可以理解,当创建 ViewModel 实例并为 LiveData 参数执行 setValue 时,它​​会收到通知。但是为什么我回去的时候观察没有被移除?我尝试删除 onStop 上的 Observe,但它一直在发生。

override fun onStop() {
super.onStop()
emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.removeObservers(viewLifecycleOwner)
emergencyFragmentViewModel.isEmergencyEventMediaLDSuccess.removeObserver(observeEmergencyEventLDSuccess)
}

最佳答案

@Pawel 是对的。 LiveData 存储该值,并且每次您观察它时(在本例中是在您的 onViewCreated 中),它都会发出最后存储的值。

也许你想要像 SingleLiveEvent 这样的东西,在有人阅读后清除它的值(value)。

所以当你来回移动时,它不会发出最后一个值(一旦它被清理)。

关于android - 观察 onCreate fragment 时调用的 LiveData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59239874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com