kotlin invoke

1. Passing parameters

Used for function parameter passing

  //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. Interface callback

Java idea implementation

1. Create an interface and create corresponding abstract methods
2. Declare interface member variables
3. Create a public listening method

  interface OnDialogListener {
        fun onConfirm(view: View)
        fun onCancel()
    }

    var mListener: OnDialogListener? = null

    fun setOnDialogListener(dialogListener: OnDialogListener?) {
        mListener = dialogListener
    }

4. Call the interface method in the corresponding place

  rootView.findViewById<LinearLayout>(R.id.ll_idcard).setOnClickListener {
            mListener?.onConfirm(it)
  }

5.Use

val loginDialog = LoginDialog.newInstance()
loginDialog.setOnDialogListener(object : BaseDialogFragment.OnDialogListener {
     override fun onConfirm(view: View) {
     }

     override fun onCancel() {
     }
 })

Koltin high-order function implementation

1. Declare member variables whose type is function type
2. Create a public listening method

   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 is declared as a function with no parameters. Unit means no return value
(() -> Unit)?=null means that the declared variable can be null.
If you want to declare a function with parameters and a return body, you can declare it like this
(age:Int,name:String) -> String, note that the formal parameters can be omitted, then it can be written directly as (Int, String) -> String

3. Call in the corresponding place

   rootView.findViewById<LinearLayout>(R.id.ll_idcard).setOnClickListener {
            onConfirmListner?.invoke(it)
        }

Directly call the invoke() method with the declared function variable. It can also be written as onConfirmListner!!(it), because onConfirmListner itself is a function, but if onConfirmListner is null, an exception will occur, so it is best to directly onConfirmListner?.invoke( ), if it is null, the invoke method will not be executed. In addition, there are parameters, which can be passed in directly in the invoke() method.

4.Use

   val loginTipDialog = LoginTipDialog()
   loginTipDialog.setOnDialogListener(onConfirmListner = {
        }, onCancelListener ={

        })

Guess you like

Origin blog.csdn.net/qq_55888300/article/details/130456776