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

一、背景

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的重定向,自己在项目里面写一个函数回调,就是没登录的时候跳转登录也传一个函数,登录后函数里面直接跳转对应的页面。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容