需求场景

咱们在开发运用的时候经常会遇到先登录,登录成功后再跳转到目标页面。比如产品概况页面咱们点击购买必需要先登录,登录完结才能去下单付出。针对这种场景,咱们一般有两种做法:

  1. 点击购买跳转到登录,登录完结需要用户再次点击购买才能去下单付出页面,这种用户体会不是很好。
  2. 点击购买跳转到登录,登录完结直接跳转到下单付出页面。

第一种咱们就不谈了产品司理不同意。第二种咱们一般是在 onActivityResult 里边获取到登录成功,然后根据 code 跳转到目标页面。这种方法缺点便是咱们要在每个页面都处理相同的逻辑还有定义各种 code,假如运用里边很多这种场景也太繁琐了。那有没有一致的方法去处理这种场景便是咱们今天的主题了。

封装方法

咱们的运用是组件化的,APP 的页面跳转运用了 Arouter。所以咱们一致处理运用 Arouter 封装。直接上代码

fun checkLoginToTarget(postcard: Postcard) {//Postcard 是 Arouter 的类
    if (User.isLogin()) {
        postcard.navigation()
    } else {
        //不能运用 postcard 切换 path 直接跳转,因为 group 可能不同,所以从头 build
        ARouter.getInstance().build(Constant.LOGIN)
            .with(postcard.extras)//获取携带的参数从头转入
            .withString(Constant.TAGACTIVIFY, postcard.path)//添加目标路由
            .navigation()
    }
}
//登录成功后在登录页面执行这个方法
fun loginSuccess() {
    val intent= intent
    val target = intent.getStringExtra(Constant.TAGACTIVIFY)//获取目标路由
    target?.apply { 
        if (isNotEmpty()){
            val build = ARouter.getInstance().build(this)
            val extras = intent.extras//获取携带的参数
            if (extras != null) {
                build.with(extras)
            }
            build.navigation()
        }
    }
    finish()
}

代码加了注释,运用 Kotlin 封装了顶层函数,登录页面在登录成功后跳转到目标页面,针对上面的场景直接调用 checkLoginToTarget 方法。

checkLoginToTarget(ARouter.getInstance().build(Constant.PAY_PAGE).withInt(Constant.GOOD_ID,id))

通过 Arouter 传入下单付出的路由地址,而且携带了产品的 ID,生成了 Postcard 参数。登录成功后能带着产品 ID
直接下单付出了。

最终

假如项目里没有运用路由库能够运用 Intent 封装实现,或者其他路由库也能够用上面的方法去做一致处理。