kotlin高阶函数

2021-06-07  本文已影响0人  雨来
理解的意思

所谓的高阶函数 也就是我们定义的函数中可以再接收一个函数做为参数 像是一个lambda表达式一样 (像函数,像有接收者的函数字面量)

1、一个简单的测试
class TwoActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_two)
//        val real:String? = null
//        cc(real?:"cba")
        invokeMethod("雨来"){

            invokeBlock()
        }
    }

    fun invokeBlock(){

        println("invode block")
    }


//    fun cc (str:String?): Unit {
//
//        println("方法执行了")
//        println(str)
//    }

    fun invokeMethod(userName:String, block:Int.()->Unit){
        println(userName)
        1.block()
    }

}

我们可以看出 invokeMethod 方法的最后一行 1.block()我调用了这个参数block方法 一般我们在这里可以做一定的逻辑 来判断它是否执行 不然的话
调用下面 invokeBlock() 是不会得到执行的

 invokeMethod("雨来"){

            invokeBlock()
        }
2、实际项目中的使用

一个网络请求异常有错误的时候的例子

 fun loadFailed(msg: String?) {
        super.loadFailed(msg)
        showLoadErrorView(msg?: GlobalUtil.getString(R.string.unknown_error)) {
            startLoading() //这个方法只有在被出发的时候才会被执行
        }
    }

只有 it?.block() 被调用的时候 startLoading()方法才会被执行

 /**
     * 当Fragment中的加载内容服务器返回失败或网络异常,通过此方法显示提示界面给用户。
     *
     * @param tip 界面中的提示信息
     * @param block 点击屏幕重新加载,回调处理。
     */
    protected fun showLoadErrorView(tip: String, block: View.() -> Unit) {
        if (loadErrorView != null) {
            loadErrorView?.visibility = View.VISIBLE
            return //这个return 后 实现block的方法不会得到执行
        }
        if (rootView != null) {
            val viewStub = rootView?.findViewById<ViewStub>(R.id.loadErrorView)
            if (viewStub != null) {
                loadErrorView = viewStub.inflate()
                val loadErrorText = loadErrorView?.findViewById<TextView>(R.id.loadErrorText)
                loadErrorText?.text = tip
                val loadErrorkRootView = loadErrorView?.findViewById<View>(R.id.loadErrorkRootView)
                loadErrorkRootView?.setOnClickListener {
                    //显示出来后在这里设置监听肯定会走这个方法
                    it?.block() //执行调用处的block的方法
                }
            }
        }
    }

上一篇下一篇

猜你喜欢

热点阅读