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

关于 LiveData 两个常用的姿势

使用包装类传递事件

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

使用时是这样的

class ListViewModel : ViewModel {

private val _navigateToDetails = MutableLiveData>()

val navigateToDetails : LiveData>

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...)

}

})

复制代码

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

//为 LiveData>提供类型别名,使用 EventLiveData 即可

typealias EventMutableLiveData = MutableLiveData>

typealias EventLiveData = LiveData>

复制代码

使用 typealias 关键字,我们可以提供一个类型别名,可以这样使用

//等价于 MutableLiveData>(Event(false))

val eventContent = EventMutableLiveData(Event(false))

复制代码

现在声明时不用多加一层泛型了,那么使用时还是很繁琐

我们可以借助 kotlin 的 扩展函数更优雅的使用

30e1e923b72153e4736947b6e78d4068.pngevent 扩展函数

5bea0cbd0ad20f1e1b380c1be5f77441.png使用

demo 中封装了两种形式的 LiveData,一种为 LiveData,一种为 EventLiveData,当屏幕旋转时,前者会再次回调结果,而后者由于事件已被处理而不执行 onChanged,我们通过 Toast 可观察到这一现象

c1c46789f50e2477aa6e61ebbba2c52a.png

java 版的可参考

d155e44597720f415e11196ca8c3d8c1.png

封装带网络状态的数据

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

a6255e285f8971662881ab50e2bccd93.png

在使用时我们遇到了和上面一样的问题,多层泛型用起来很麻烦

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

38a9d0fdebeaf1b0fd32bb07c8f86b22.pngtypealias

d6d60e0968db32ba393be8f928244f57.png扩展函数

fc15e124256d0ac0b58b089e5ab44fbd.png使用

demo 截图

9b0f6b5bf20aba33ef9eec1f69126abe.pngdemo

Demo

demo 在这

往期文章

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

【奇技淫巧】AndroidStudio Nexus3.x搭建Maven私服遇到问题及解决方案

【奇技淫巧】什么?项目里gradle代码超过200行了!你可能需要 Kotlin+buildSrc Plugin

【奇技淫巧】gradle依赖查找太麻烦?这个插件可能帮到你

【奇技淫巧】Android组件化不使用 Router 如何实现组件间 activity 跳转

【奇技淫巧】新的图片加载库?基于Kotlin协程的图片加载库——Coil

【奇技淫巧】使用 Navigation + Dynamic Feature Module 实现模块化

【奇技淫巧】除了 buildSrc 还能这样统一配置依赖版本?巧用 includeBuild

我的其他系列文章 在这里

关于我

我是 Fly_with24

掘金

简书

Github

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值