kotlin
的扩展函数可以大大的简化项目代码,下面我就把我项目中用到的一些实际的扩展列举一下,对不熟悉kotlin扩展函数的可以先了解一下~
一、ARouter简化
首先分析一下最常见的ARrouter跳转
ARouter.getInstance()//每次都得写,这行代码我不关心
.build("/xx/xx")
.navigation()//每次都得写,这行代码我也不关心,可以优化
编写扩展函数(有点像普通封装的方法。。)
import com.alibaba.android.arouter.launcher.ARouter
fun go(path: String) {
ARouter.getInstance().build(path).navigation()
}
使用,只需要把写好的扩展方法导入进来即可
import com.xxx.extention.go
class Test{
fun initView() {
go("/xx/xx")
}
}
如果需要传参数怎么办?像这种
ARouter.getInstance()
.build("/xx/xx")
.withString("key0", "value")
.withInt("key1", 666)
.withBundle("key2", Bundle())
.navigation()
还是经过分析可以得出,第一行和最后一行(如果不写result之类)重复,编写扩展函数
import com.alibaba.android.arouter.facade.Postcard
import com.alibaba.android.arouter.launcher.ARouter
fun go(path: String, func: Postcard.() -> Unit) = run {
ARouter.getInstance().build(path).with {
this.func()
}.navigation()
}
private fun Postcard.with(func: Postcard.() -> Unit): Postcard = run {
this.func()
return this
}
使用
import com.xxxx.extention.go
class Test{
fun init(){
go("/xx/xx") {
withString("key0", "value")
withInt("key1", 666)
withBundle("key2", Bundle())
}
}
}
是不是清爽多了,当然,可以根据自己的需求进行封装。
二、Observer
我们使用MVVM写项目的时候,经常在activity中观察livedata数据的变化,如这种:
viewModel.getName().observe(this, (Observer<String>) name -> {
});
感觉java太啰嗦,里面的大部分代码都不是我们关心的,我们只关心,变量name和变化的name值,因此用kotlin扩展函数简化一下
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.LiveData
import androidx.lifecycle.observe
fun <T> LifecycleOwner.observe(liveData: LiveData<T>, observer: (t: T) -> Unit) {
liveData.observe(this) {
observer(it)
}
}
在Activity
或Fragment
中使用
observe(mViewModel.name) {
println("name变化了:$it")
}
是不是代码简洁多了?
。。。未完待续
网友评论