Kotlin中使用高阶函数代替接口回调

2023-03-01  本文已影响0人  沝過無痕

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 ={

        })
上一篇 下一篇

猜你喜欢

热点阅读