Kotlin中的接口回调

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 ->
 }

看懂了吧,在括号中增加想要的参数类型即可。 熟能生巧,敲起来就明白是怎么一回事啦。 Kotlin的回调运用的就是函数思维模式,慢慢习惯他,代码会更加的简洁优雅。

发布了53 篇原创文章 · 获赞 17 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq910689331/article/details/81908995