java的接口回调相信大家都用的相当熟练。不过转战到Kotlin该怎么写接口回调?
本文你会学到单参数回调,多参数回调的写法,直接上代码;
/**
* 文件:Test
* 时间:2018/8/21.
* 备注:
*/
class Test:AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var mathUtlils = MathUtils()
println("开始计算")
mathUtlils.getResult()
mathUtlils.setListen {
println("计算的结果 $it")
}
}
}
/**
* 文件:TestDemo
* 时间:2018/8/21.
* 备注:
*/
class MathUtils {
private lateinit var listen: ((Int) -> Unit)
fun setListen(listen: ((Int) -> Unit)) {
this.listen = listen
}
fun getResult() {
println("经过一系列耗时运算获得结果")
var sum = 200
listen.invoke(sum)
}
}
上面的逻辑就是Test需要一个计算结果来自于MathUtils,而Test不关心计算的过程,只需要这个计算的结果。我们很自然的就是想到了接口回调。
我们一句句理解这句话
private lateinit var listen: ((Int) -> Unit)
这里的lateinit
就是稍后初始化 listen
变量的属性是 ((Int) -> Unit)
意思就是listen
是个函数类型变量
入参是单参数Int类型,无返回值
看这里
fun getResult() {
println("经过一系列耗时运算获得结果")
var sum = 200
listen.invoke(sum)
}
其中listen.invoke(sum)
就是将计算结果sum传入listen
函数
在activity中设置传入一个((Int) -> Unit
类型的函数就可以监听到计算结果
mathUtlils.setListen {
println("计算的结果 $it")
}
那么多参数回调怎么写?
private lateinit var saveListen: ((Boolean, File) -> Unit)
fun setListen(saveListen: ((Boolean, File) -> Unit)) {
this.saveListen = saveListen
}
ImageSaver.setListen { boolean, file ->
}