8

LiveData documentation如何清除LiveData存储值?

的LiveData类提供了以下优点:

...

总是最新数据:如果一个生命周期再次启动(就像一个活动要回从后台堆栈启动状态),它会收到最新的位置数据(如果它尚未)。

但有时候我不需要这个功能。

例如,我在下面的活动中LiveData视图模型和观察报:

//LiveData 
val showDialogLiveData = MutableLiveData<String>() 

//Activity 
viewModel.showMessageLiveData.observe(this, android.arch.lifecycle.Observer { message -> 
     AlertDialog.Builder(this) 
       .setMessage(message) 
       .setPositiveButton("OK") { _, _ -> } 
       .show() 
    }) 

现在每次旋转后会出现老对话框。

有没有办法清除处理后的存储值,或者它是否错误地使用了LiveData?

+2

这是关系到:https://stackoverflow.com/questions/44146081/show-dialog-from-viewmodel-in-android-mvvm-architecture –

+0

是否涉及到实时数据的问题?无论您是否使用LiveData,每次旋转时都会重新创建活动。即使您将其删除,问题仍将继续存在。 –

+0

@LongRanger它可以通过在显示的对话框中删除在LiveData中缓存的消息来解决,所以新的活动将不会收到它。在Moxy的[OneExecutionStateStrategy](https://github.com/Arello-Mobile/Moxy/wiki/View-commands-state-strategy#existing-strategies)上使用的原则相同 – Kamer358

回答

12

亚历克斯在评论中的回应是我想你正在寻找什么。有一个名为SingleLiveEvent的示例代码。这个类的目的被描述为:

生命周期感知观察的发送后 只认购新更新,用于像导航和小吃吧的消息的事件。

这避免了与事件共同的问题:在配置改变 (如旋转)如果观察者是活性的更新可被发射。 如果有明确的调用 setValue()或call(),则此LiveData仅调用observable。