Kotlin中使用高阶函数代替接口回调
Java思路实现
1.创建接口,创建对应抽象方法
2.声明接口成员变量
3.创建一个公共的监听方法
interface OnDialogListener {
fun onConfirm(view: View)
fun onCancel()
}
var mListener: OnDialogListener? = null
fun setOnDialogListener(dialogListener: OnDialogListener?) {
mListener = dialogListener
}
4.在对应的地方调用接口方法
rootView.findViewById<LinearLayout>(R.id.ll_idcard).setOnClickListener {
mListener?.onConfirm(it)
}
5.使用
val loginDialog = LoginDialog.newInstance()
loginDialog.setOnDialogListener(object : BaseDialogFragment.OnDialogListener {
override fun onConfirm(view: View) {
}
override fun onCancel() {
}
})
Koltin高阶函数实现
1.声明成员变量,类型为函数类型
2.创建一个公共的监听方法
protected var onConfirmListner: ((view: View) -> Unit)? = null
protected var onCancelListener: (() -> Unit)? = null
fun setOnDialogListener(
onConfirmListner: ((view: View) -> Unit),
onCancelListener: (() -> Unit)? = null
) {
this.onConfirmListner = onConfirmListner
this.onCancelListener = onCancelListener
}
() -> Unit作为一个函数声明,无参,Unit表示无返回值
(() -> Unit)?=null 表示此声明的变量可为null
如果想声明带参数,有返回体的函数可以这么声明
(age:Int,name:String) -> String,注意形参可省略,那可以直接写成(Int,String) -> String
3.在对应的地方调用
rootView.findViewById<LinearLayout>(R.id.ll_idcard).setOnClickListener {
onConfirmListner?.invoke(it)
}
直接用声明的函数变量调用invoke()方法,这里的还可以写成onConfirmListner!!(it),因为onConfirmListner本身就是一个函数,但这样假如onConfirmListner为null就会异常,所以最好直接onConfirmListner?.invoke(),如果为null就不会执行invoke方法。另外有参数,直接在invoke()方法传入参数
4.使用
val loginTipDialog = LoginTipDialog()
loginTipDialog.setOnDialogListener(onConfirmListner = {
}, onCancelListener ={
})