【奇技淫巧】巧用 kotlin 扩展函数和 typealias 封装 带网络状态和解决「粘性」事件的 LiveData

关于 LiveData 两个经常使用的姿式

使用包装类传递事件

咱们在使用 LiveData 时可能会遇到「粘性」事件的问题,该问题可使用包装类的方式解决。解决方案见 [译] 在 SnackBar,Navigation 和其余事件中使用 LiveData(SingleLiveEvent 案例)java

使用时是这样的git

class ListViewModel : ViewModel {
 private val _navigateToDetails = MutableLiveData<Event<String>>()   val navigateToDetails : LiveData<Event<String>>  get() = _navigateToDetails    fun userClicksOnButton(itemId: String) {  _navigateToDetails.value = Event(itemId) // Trigger the event by setting a new Event as a new value  } }  myViewModel.navigateToDetails.observe(this, Observer {  it.getContentIfNotHandled()?.let { // Only proceed if the event has never been handled  startActivity(DetailsActivity...)  } }) 复制代码

不过这样写甚是繁琐,咱们可使用更优雅的方式解决该问题github

//为 LiveData<Event<T>>提供类型别名,使用 EventLiveData<T> 便可
typealias EventMutableLiveData<T> = MutableLiveData<Event<T>>  typealias EventLiveData<T> = LiveData<Event<T>> 复制代码

使用 typealias 关键字,咱们能够提供一个类型别名,能够这样使用web

//等价于 MutableLiveData<Event<Boolean>>(Event(false))
val eventContent = EventMutableLiveData<Boolean>(Event(false)) 复制代码

如今声明时不用多加一层泛型了,那么使用时仍是很繁琐网络

咱们能够借助 kotlin 的 扩展函数更优雅的使用app

event 扩展函数
event 扩展函数
使用
使用

demo 中封装了两种形式的 LiveData,一种为 LiveData<Boolean>,一种为 EventLiveData<Boolean>,当屏幕旋转时,前者会再次回调结果,然后者因为事件已被处理而不执行 onChanged,咱们经过 Toast 可观察到这一现象编辑器

java 版的可参考模块化

封装带网络状态的数据

不少时候咱们在获取网络数据时要封装一层网络状态,例如:加载中,成功,失败函数

在使用时咱们遇到了和上面同样的问题,多层泛型用起来很麻烦组件化

咱们依然可使用 typealias + 扩展函数来优雅的处理该问题

typealias
typealias
扩展函数
扩展函数
使用
使用

demo 截图

demo
demo

Demo

demo 在这

往期文章

该系列主要介绍一些「骚操做」,它未必适合生产环境使用,可是是一些比较新颖的思路

个人其余系列文章 在这里

关于我

我是 Fly_with24