flutter-thrio / flutter_thrio

flutter_thrio makes it easy and fast to add flutter to existing mobile applications, and provide a simple and consistent navigator APIs.
MIT License
362 stars 49 forks source link

Flutter 使用 ThrioNavigator allRoutes 获取路由栈没有返回路由参数 #24

Closed JunbinDeng closed 3 years ago

foxsofter commented 3 years ago

就是不想返回参数,你需要在什么场景使用,且这个参数本来应该是一次性的,不该残留

JunbinDeng commented 3 years ago

在当前页面,需要取出前个页面的路由名和参数,记录打开时的状态,用于当前页面的数据上报

foxsofter commented 3 years ago

你这个方式有点费劲。。。

foxsofter commented 3 years ago

非要这样,push的时候自己前个页面自己传过来也行

JunbinDeng commented 3 years ago

非要这样,push的时候自己前个页面自己传过来也行

最早是这么考虑的,但是每个页面都这样传参,似乎不够合理,这是本可以从架构层面解决的问题。

在 Android 获取栈中 Activity 和 Fragment 对象参数都可以获取。

在调用 allRoutes 的时候,返回的是 RouteSettings 类型。原以为返回的路由和参数都有值,结果只有路由有值,从接口设计的层面来说,这个结果完全不符合预期。如果返回的是 String 类型,只返回路由似乎还好理解一些。

如果同时把路由和参数返回不会对整体架构设计产生负面影响,建议大佬还是可以考虑把路由和参数都返回。

foxsofter commented 3 years ago

我比较好奇的是,你这个埋点本身只是要记录页面栈,为什么不能在原生端做呢。

那个参数你可能拿不到你想要的,主要是代码层面的问题,除了 url index 可以保证,params 被认为是一次性的参数传递,传到页面之后就不保证还能在 intent 里面拿到。可能被复用或者被清掉了。现在要加的话,需要将之前代码重新 review 一遍,成本还是比较大的。

我还是建议你全局埋点,thrio 本来就是在原生端有全量的页面栈信息,下个页面打开之前,可以将其串到当前页面并埋点,这种方式不会有任何问题。

JunbinDeng commented 3 years ago

我比较好奇的是,你这个埋点本身只是要记录页面栈,为什么不能在原生端做呢,那个参数你可能拿不到你想要的,看时机吧

不只是记录页面栈,还需要根据一些特殊页面调整上报参数。你的意思是原生部分能取出历史路由和参数吗,这样的话原生实现可能需要做双端逻辑。

我加了返回参数后,在 Flutter 侧可以拿到。如果时机较早,可以使用 Future.microtask 延迟获取。

foxsofter commented 3 years ago

要加的话,我需要在 iOS 和 Android 上都加,加的方式可能是在 原生端的 RouteSetting 或者 PageRoute 里面保留一份未反序列化的 params 原始值以供回传,那个已经反序列化过的想要再回传就比较麻烦了,可能并没有对应的序列化器。

框架层面对序列化器的管理在两端是有做匹配的,比如在 Flutter 端存在 序列化器,在 Android 端存在反序列化器,这样就可以保证 Flutter 到 Android 传递的 json 是可以正常进行的,这时候 params 在原生端经过了反序列化,但不存在 序列化器,所以无法再回传给 Flutter。

此功能可能无法实现了,如上面所说,Flutter --> Android 的时候 params 是可以传递的,反过来 Android --> Flutter 确实也可以将 未反序列化的 params 传递回来,但此时 Flutter 侧不存在对应的 反序列化器 去解析 这个 params,所以逻辑上走不通。

框架本身的实现肯定最小功能子集,业务逻辑层面不需要的功能尽量不会多余的去实现,你这个需求本身是埋点范畴的特殊需求,你可以考虑子集实现。