Kotlin中函数与闭包在实际项目中使用小结

版权声明:本文为博主原创文章,欢迎转载,转载请注明出处。 https://blog.csdn.net/jun5753/article/details/86599051

Android开发中,常常会遇到在一个项目遇到多个判断登录状态后才能执行相应的操作,那么在kotlin中如何比较优雅的实现登录状态检测呢?


这里我们就会用到kotlin中一个知识点:高阶函数与闭包

1.相关概念:

高阶函数:以另一个函数作为参数,或者返回值是函数 称为 高阶函数。

函数作为参数:回调函数的作用,类比接口 。
返回值是函数: 参考多态作用。

闭包:函数里面声明函数,函数里面返回函数,就是闭包。

好处:可以在函数的内部声明函数。函数参数可以是函数,函数的返回值可以是函数。

注:Java不能直接用函数作为形参,只能传递对象的引用,所以在需要回调函数时,往往传递的是接口的匿名实现。

1.1 不带参数的函数作为形参

fun main(args: Array<String>) {

    //lambda 闭包写在函数体外部, 形参中的最后一个形参是函数参数  可以这么写
    action(2){
        println("函数回调 -- 第1种传递写法")
    }

    //lambda 闭包作为形参
    action(1,{
        println("函数回调 -- 第2种传递写法")
    })


    //显示调用方式
    var foo:()->Unit = {
        println("函数回调 -- 第3种传递写法")
    }
    action(3, foo)
}

/**
 * 函数作为 形参
 */
fun action(first:Int, callback:()->Unit){

    //调用
    callback()
}

1.2 带参数和返回值的函数作为形参

fun main(args: Array<String>) {

    action(1){it-> //Lambda语法,回调参数在这里
        println("回调函数参数= : $it")

        true//Lambda语法,最后一行返回值就是闭包的返回值
    }
}

/**
 * 函数作为 形参
 */
fun action(first:Int, callback:(Int)->Boolean){

    //调用
    if(callback(1)){
        println("回调函数返回值 true")
    }else{
        println("回调函数返回值 false")
    }
}

2.实际项目中运用的小栗子

业务需求1:先判断是否处于登录状态,如果登录了就执行当前的方法,如果没有登录就跳到登录界面去登录。

    /**
     *  方法实现 
     * 检查当前是否处于登录状态
     */
    fun checkLoginStatus(activity: Activity, action: () -> Unit) {
        if (isLogin) {
            //已登录,则执行相应的函数逻辑
            action.invoke()
        } else {
           //未登录,则跳到登录界面
            gotoLogin()
        }
    }

	//在需要的地方调用该方法
     xxx.onClick {
             
         checkLoginStatus(activity!!,{
              //如果已登录,则做相应的操作,如果未登录,这里不处理,已在封装的方法中统一处理 
                ……  
            })
         
         //更优雅的方法实现,省略{}
           checkLoginStatus(activity!!) { 
                ……
            }
         
        }

再举个栗子:

业务需求2:在权限获取中,用户允许或拒绝后执行不同的操作。

    /**定义
     * 请求定位权限
     * 请求失败显示弹窗
     */
    fun location(activity: Activity, successAction: () -> Unit) {
        location(successAction) {
            showOpenLocationDialog(activity) {}
        }
    }

    fun location(successAction: () -> Unit, failAction: () -> Unit) {
        if (PermissionUtils.isGranted(Manifest.permission.ACCESS_FINE_LOCATION)) {
            successAction.invoke()
            return
        }

        PermissionUtils.permission(PermissionConstants.LOCATION)
            .callback(object : PermissionUtils.SimpleCallback {
                override fun onGranted() {
                    successAction.invoke()
                }

                override fun onDenied() {
                    failAction.invoke()
                }
            })
            .rationale {
                failAction.invoke()
            }
            .request()
    }

   fun showOpenLocationDialog(activity: Activity, failAction: () -> Unit) {
        MaterialDialog(activity)
            .negativeButton(R.string.common_negative) {
                failAction.invoke()
            }
            .positiveButton(R.string.common_permission_denied_prompt_positive) {
             	//do something
            }
            .onCancel { failAction.invoke() }
    }

//在需要的地方调用
 xxx.location(activity!!) {}

扩展阅读:

1.Kotlin语法基础,函数与闭包

2.Kotlin(二) 高级函数(函数作为形参,函数作为参数)

3.Kotlin Primer·第五章·函数与闭包

猜你喜欢

转载自blog.csdn.net/jun5753/article/details/86599051