kotlin invoke

1,传参

用于函数传参

  //1、调用
  private fun kkk() {
        //调用传参
        CoinFragment.setOnlineCoinGetter(this) {
            when(it.value){
                5 -> 500
                10 -> 600
                15 -> 700
                20 -> 800
                25 -> 900
                30 -> 1000
                else -> 1000
            }
        }
    }

//2、被调用者
object  CoinFragment {
    //4、接受值
    var onlineRewardCoin: ((OnlineTime)->Int)? = null //自定义在线时常金币奖励数
    //5、集合的hashMap
    var onLineTimeRewardCoinParmas: MutableMap<OnlineTime, Int>
        get() {
            return mutableMapOf(
                OnlineTime.FIVE to (onlineRewardCoin?.invoke(OnlineTime.FIVE)?:600),
                OnlineTime.TEN to (onlineRewardCoin?.invoke(OnlineTime.TEN)?:800),
                OnlineTime.FIFTEEN to (onlineRewardCoin?.invoke(OnlineTime.FIFTEEN)?:1000),
                OnlineTime.TWENTY to (onlineRewardCoin?.invoke(OnlineTime.TWENTY)?:1200),
                OnlineTime.TWENTY_FIVE to (onlineRewardCoin?.invoke(OnlineTime.TWENTY_FIVE)?:1400),
                OnlineTime.THIRTY to (onlineRewardCoin?.invoke(OnlineTime.THIRTY)?:2000)
            )
        }
        set(value) {}

    //2、被调用
    fun setOnlineCoinGetter(context: Context, getter: ((OnlineTime)->Int)?) {
        //3、赋值给函数
        onlineRewardCoin = getter
        //6、打印集合的hashMap
        Log.d("LUO","======${onLineTimeRewardCoinParmas}")
        //{FIVE=500, TEN=600, FIFTEEN=700, TWENTY=800, TWENTY_FIVE=900, THIRTY=1000}
    }
}

2,接口回调

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

        })

猜你喜欢

转载自blog.csdn.net/qq_55888300/article/details/130456776