美文网首页
【Bug】Getx重定向无法获取之前页面的参数

【Bug】Getx重定向无法获取之前页面的参数

作者: 旺仔_100 | 来源:发表于2024-09-06 16:58 被阅读0次

    一、背景

    A页面跳转B页面,正常情况参数正常传递。但是B页面需要登录,所以A页面跳转B页面会重定向到登录页面,用户登录完成之后会直接跳转到B页面,但是参数丢失了!!!
    我去看下重定向到代码,发现里面确实没有传递参数

    class EnsureAuthMiddleware extends GetMiddleware {
      @override
      RouteSettings? redirect(String? route) {
        if (!Get.find<AccountService>().isLogin) {
          ALog.print("EnsureAuthMiddleware redirect route = $route currentRoute = ${Get.currentRoute}");
          if (Get.find<ContextService>().canJverify) {
            return RouteSettings(name: Routes.ONE_KEY_LOGIN, arguments: {"callback": route});
          } else {
            return RouteSettings(name: Routes.LOGIN, arguments: {"callback": route});
          }
        }
        return super.redirect(route);
      }
    }
    

    然后我在EnsureAuthMiddleware类中获取Get.arguments和Get.parameters,结果都是空的。

    二、查找原因

    我先说一下大概的流程,方便大家理解:
    起点是我们通过Get.toNamed(Routes.xxx, arguments: args, preventDuplicates: false);去传递args。
    这个里面大概逻辑是Get会调用系统的跳转,路由和参数都在Setttings中。
    然后Getx会去通过系统的路由拦截,做一些处理并给我们提供重定向的回调,也就是上面的EnsureAuthMiddleware类。

    • Getx拦截路由后首先就会执行page方法,里面做一个check,检查是否需要重定向。


      image.png
    • check的核心逻辑如下,就是对settings的name做了处理,也就是对路由以及拼接在路由之后的参数做了处理,根本没有对settings.arguments做处理。然后把setting!.name回调给EnsureAuthMiddleware,所以我们根本无法获取到跳转时候arguments发送的参数!!!


      image.png

    发现问题后,去getx的github查看,果然有两个open问题
    https://github.com/jonataslaw/getx/issues/2380
    https://github.com/jonataslaw/getx/issues/3007

    三、解决方案

    • 通过parameters传递参数,Get.toNamed(Routes.S_PPT_DETAIL_PAGE, parameters: {}, preventDuplicates: false);但是这种方式有其他bug慎用
    • 不要使用Getx的重定向,自己在项目里面写一个函数回调,就是没登录的时候跳转登录也传一个函数,登录后函数里面直接跳转对应的页面。

    相关文章

      网友评论

          本文标题:【Bug】Getx重定向无法获取之前页面的参数

          本文链接:https://www.haomeiwen.com/subject/crqjljtx.html