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的方法
}
}
}
}