目录
一个路由系统应该具有什么样的功能
| 功能 | 说明 | 举例 |
|---|---|---|
| 页面跳转 | 跳转到指定页面(页面入栈) 带参数跳转 新页面位于栈顶 |
|
| 页面返回 | 栈顶页面出栈 能够向上一级页面传递参数 |
|
| 路由拦截 | 跳转新页面之前进行拦截 返回上一级页面之前进行拦截 |
|
| 页面替换 | 将栈顶页面替换为新页面 | |
| 页面删除 | 删除导航栈中指定的页面 入栈时删除导航栈中所有页面只保留入栈页面 |
|
| 移动页面 | 入栈的页面已经存在在导航栈中时移动到栈顶而不入栈新的 |
iOS 和 flutter 混合路由的搭建
主要解决 B页面 返回 A页面 时的传参和路由拦截问题。
一、原生 和 原生 的路由
A页面(vc)跳转B页面(vc)时,将回调函数传递给B页面(vc).
当点击按钮返回时:
如果需要拦截可以在事件响应之前进行拦截处理,然后进行后续处理。
如果不需要拦截,调用回调函数将需要返回的参数返回,然后调用router的pop方法。
当手势返回时:
1、如果只是简单的手势返回,什么方法也不需要实现
2、如果不需要拦截,但需要回传参数,只实现下面的协议方法
- (void)xy_gestureBack {
[XYRouter popGesture:self param:@{@"des":@"FileVC gesture back"}];
}
3、如果需要拦截时,只实现下面的协议方法
- (BOOL)xy_disablePopGesture {
// 在这里实现手势返回的拦截逻辑
// 返回YES禁用当前vc的手势返回
return YES;
}
二、flutter 和 flutter 的路由
当点击返回按钮时:
调用goRouter的相应方法即可实现返回和返回传参功能。
当手势返回时:
首先要禁用容器手势返回,并且通过channel监听原生端的手势事件,才能对手势返回做相应的处理。
1、如果不需要返回参数,也不需要拦截,不需要做任何处理
2、如果不需要拦截,但需要传回参数应该怎么做?
flutter端回传给上一个页面参数,目前知道只能通过goRouter去做。
所以回传参数也需要对手势进行拦截,然后在拦截函数内进行goRouter的方法调用。
3、如果需要拦截时
方法同上
三、原生 和 flutter 的路由
当在原生A页面(vc),通过路由push了一个B页面(flutter vc)时,该如何处理?
当flutter vc 容器有多个页面栈的时候处理方式跟 flutter 和 flutter 的路有处理方式一样。
只有当flutter vc容器的页面栈中只有一个页面时,此时的返回才需要单独处理,因为此时是flutter vc 返回 A vc,涉及到原生端的页面栈。
下面只讨论这种情况下的处理
当点击按钮返回时:
调用router的pop方法 -> channel 的pop方法 -> 原生端的pop方法会接收参数,并将参数传递给A vc 然后完成flutter vc 的pop。
当手势返回时:
1、如果不需要返回参数,也不需要拦截,把flutter vc 的允许手势返回打开。
2、flutter页面回传给上一个页面参数和路由拦截,都需要通过拦截函数来做。
首先把flutter vc 的允许手势返回关闭,避免还没有操作,flutter vc 被直接滑动pop了。
在拦截函数内:调用router的pop方法 -> channel 的pop方法 -> 原生端的pop方法会接收参数,并将参数传递给A vc 然后完成flutter vc 的pop。
注意:以上方案的实现,需要通过channel建设下面几个能力
1、原生端需要记录flutter的页面栈
2、需要提供在flutter端,打开和关闭 允许手势返回开关 的能力
四、flutter 和 原生 的路由
flutter 跳转原生页面,实际是flutter容器,push了一个新的vc。
当点击按钮返回时:
就是点击原生的返回按钮包括返回拦截,路由系统会将返回值返回给flutter页面。
当手势返回时:
就是原生的手势返回处理包括返回拦截,路由系统会将返回值返回给flutter页面。
行者常至,为者常成!