JHHK

欢迎来到我的个人网站
行者常至 为者常成

flutter中的路由⭐

目录

一个路由系统应该具有什么样的功能

功能 说明 举例
页面跳转 跳转到指定页面(页面入栈)
带参数跳转
新页面位于栈顶
 
页面返回 栈顶页面出栈
能够向上一级页面传递参数
 
路由拦截 跳转新页面之前进行拦截
返回上一级页面之前进行拦截
 
页面替换 将栈顶页面替换为新页面  
页面删除 删除导航栈中指定的页面
入栈时删除导航栈中所有页面只保留入栈页面
 
移动页面 入栈的页面已经存在在导航栈中时移动到栈顶而不入栈新的  

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页面。


行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.