❞ 自从Jose Alcérreca发表了他的文章 "SingleLiveEvent Case "以来,已经过去了好几年。...https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150...对于SingleLiveEvent案例,已经有许多关于如何改进该模式的回应。...Background 为了与其他关于SingleLiveEvent的文章,或者说使用该模式的变体文章保持一致,我将把事件定义为采取一次、且仅一次行动的通知。...最初的SingleLiveEvent文章以显示SnackBar为例,但你也可以把其他一次性动作,如Fragment导航、启动Activity、显示通知等作为「事件」的例子。
✔️ 正确解决方法: 使用 SingleLiveEvent 这个 SingleLiveEvent 类是为了适用于特定场景的解决方法。这是一个只会发送一次更新的 LiveData。...用法 class ListViewModel : ViewModel { private val _navigateToDetails = SingleLiveEvent()...myViewModel.navigateToDetails.observe(this, Observer { startActivity(DetailsActivity...) }) 问题 SingleLiveEvent
LiveData with SnackBar, Navigation and other events (the SingleLiveEvent case) View(Activity或Fragment...OK: Use SingleLiveEvent SingleLiveEvent类是为一个样本创建的,作为对该特定场景有效的、推荐的解决方案。它是一个LiveData,但只发送一次更新。...class ListViewModel : ViewModel { private val _navigateToDetails = SingleLiveEvent() val... extends MutableLiveData { private static final String TAG = "SingleLiveEvent"; private... ... ... { liveData.value = "YES" } } 而且你可以像其他LiveDatas一样使用这个singleLiveEvent。
LiveData with SnackBar, Navigation and other events (the SingleLiveEvent case) View(Activity或Fragment...✔️ OK: Use SingleLiveEvent SingleLiveEvent类是为一个样本创建的,作为对该特定场景有效的、推荐的解决方案。它是一个LiveData,但只发送一次更新。...class ListViewModel : ViewModel { private val _navigateToDetails = SingleLiveEvent() val... extends MutableLiveData { private static final String TAG = "SingleLiveEvent"; private...... ... { liveData.value = "YES" } } 而且你可以像其他LiveDatas一样使用这个singleLiveEvent。
缺陷: 需要在 observer 中增加一些逻辑判断代码,这不符合简洁的 MVVM 模式(不应该在 View 层做过多的逻辑处理) 需要手动重置,不够优雅,一旦忘记重置就容易引发问题 姿势二:使用 SingleLiveEvent...SingleLiveEvent 是官方 sample 中封装的 LiveData,可以实现一个事件只被消费一,实现原理也很简单 class SingleLiveEvent : MutableLiveData...fun call() { setValue(null) } companion object { private const val TAG = "SingleLiveEvent..." } } 复制代码 示例代码 class MoneyReceivedViewModel : ViewModel() { val billLiveEvent = SingleLiveEvent
extends AndroidViewModel { private static final String TAG = "LoginViewModel"; private final SingleLiveEvent... mOpenUserList = new SingleLiveEvent(); private final SnackbarMessage mSnackbarText = new...super(mContext); this.mContext = mContext.getApplicationContext(); } public SingleLiveEvent
如果你不希望这样做,你可以使用ViewEffect,因为它是基于SingleLiveEvent的,不需要维护状态。..._viewState = value _viewStates.value = value } private val _viewEffects: SingleLiveEvent... = SingleLiveEvent() fun viewEffects(): SingleLiveEvent = _viewEffects private...MutableLiveData和_viewEffect: SingleLiveEvent,它们通过公共函数viewStates()和viewEffects()被暴露出来。
MainViewState> = MutableLiveData() val viewStates = _viewStates.asLiveData() private val _viewEvents: SingleLiveEvent... = SingleLiveEvent() val viewEvents = _viewEvents.asLiveData() init {...event } } 如上所示 我们只需定义ViewState与ViewEvent两个State,后续增加状态时在data class中添加即可,不需要再写模板代码 ViewEvents是一次性的,通过SingleLiveEvent
常见有如下几个解决思路: 反射解决version 在调用 observe() 方法里,反射相应的包装类 ObserverWrapper ,把其的版本号更改为 LiveData 现有的版本号; SingleLiveEvent...具体可参见 Android-architecture-simple-SingleLiveEvent 手动维护version 这个方式可以说是对 SingleLiveEvent 的一个完善与补充...参阅 官方文档-LiveData概述 如何优雅的使用LiveData实现一套EventBus(事件总线) [Android]/architecture-samples/SingleLiveEvent [
如果当前Activity回到前台LiveData不需要接收最新的数据,可以使用下面三中扩展的LiveData 官方扩展的SingleLiveEvent 美团反射修改mVersion UnPeek-LiveData
在示例中,我们继承 LiveData 创建一个叫做 SingleLiveEvent 的类来解决这个问题。它仅仅发送发生在订阅后的更新,要注意的是这个类只支持一个观察者。...✅ 使用像 SingleLiveEvent 这样的 observable 来处理导航栏或者 SnackBar 显示消息这样的情况 ViewModels 的泄漏问题 响应式范例在 Android 中运行良好
如果我们要把 LiveData 用作事件总线,还需要做一些定制,Github 上搜SingleLiveEvent可以找到源码实现。...LiveData 的使用场景: LiveData - immutable 版本 MutableLiveData - mutable 版本 MediatorLiveData - 可汇总多个数据源 SingleLiveEvent...如果把 ViewModel 作为 SSOC(唯一真相源),多个 Fragment 之间共享数据,再利用 SingleLiveEvent 做总线,一个 Activity 配多个 Fragment 的写法就避免了
如果我们要把 LiveData 用作事件总线,还需要做一些定制,Github 上搜 SingleLiveEvent 可以找到源码实现。...我们汇总一下 LiveData 的使用场景: LiveData - immutable 版本 MutableLiveData - mutable 版本 MediatorLiveData - 可汇总多个数据源 SingleLiveEvent...如果把 ViewModel 作为 SSOC(唯一真相源),多个 Fragment 之间共享数据,再利用 SingleLiveEvent 做总线,一个 Activity 配多个 Fragment 的写法就避免了
当然,有一种解法通过保证LiveData同一个值只会触发一次onChanged回调,封装了MutableLiveData的SingleLiveEvent。...为了防止横竖屏或者配置变化导致的重复弹窗,使用了上面提到的SingleLiveEvent RoomViewModel.kt class RoomViewModel : ViewModel() {...private val praiseEvent = SingleLiveEvent() fun recvPraise(praiseType : Int) { praiseEvent.postValue
SingleLiveEvent.java public class SingleLiveEvent extends MutableLiveData { private static...final String TAG = "SingleLiveEvent"; // 消费标记位 private final AtomicBoolean mPending = new AtomicBoolean
附上我以前写的一篇文章 Activity销毁重建导致LiveData数据倒灌 解决办法 谷歌官方的SingleLiveEvent 美团反射修改mVersion UnPeek-LiveData 九、Application
https://medium.com/androiddevelopers/livedata-with-snackbar-navigation-and-other-events-the-singleliveevent-case-ac2622673150
更多细节请阅读LiveData与SnackBar、Navigation和其他事件(SingleLiveEvent案例)。
五、使用SingleLiveEvent 来传递 事件类消息:仅在显式调用setValue()或call()时 才会通知观察者;只有一个观察者会收到更改通知。
领取专属 10元无门槛券
手把手带您无忧上云