一、背景
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的重定向,自己在项目里面写一个函数回调,就是没登录的时候跳转登录也传一个函数,登录后函数里面直接跳转对应的页面。
网友评论