Flutter模块如何暴露已实现的路由

引言

在使用Flutter时,用的比较多的是混合开发模式,即Flutter Module提供一个aar或framework,提供给原生App集成,原生App跳转Flutter页面。
但如果我们通过路由的方式跳转Flutter页面,万一路由不存在,则在Flutter端会打开一个默认的页面,这个体验稍微不太好。所以,我们想实现在打开Flutter页面前,就能知道该Flutter页面是否存在,存在则跳转,不存在则跳转到其他页面(如使用了原生或者H5实现的页面),这样的体验会更佳。那么原生App如何提前知道Flutter模块暴露的路由呢?

Android的实现方式

由于Flutter Module最终会输出一个aar文件。而Flutter Module会通过pubspec.yaml集成多个子Module。可以约定这样一条规则:

每一个子Module将需要暴露的路由写在assets/route.json中,如下图所示:



表示flutter_module_2这个模块暴露了两个路由,分别是mainPage和SecondPage

然后我们将flutter_module_2通过git的形式集成到Flutter Module中,如下所示:


最后我们将生成一个aar文件,我们看aar文件里面的assets内容,如下所示:



可以看到在assets/flutter_assets/packages目录下,包含了集成了assets目录的子Module。

注意:若一个子Module没有assets,则不会在该目录下展示。

所以我们可以遍历assets/flutter_assets/packages目录,其中的子目录文件名就是对应的模块名,而其中的assets/route.json就是暴露的页面名。

由于aar是集成到原生App的,所以我们可以在编译时通过gradle脚本,将该aar解压缩,然后遍历assets/flutter_assets/packages目录,寻找子目录下是否有assets/route.json文件,有则解析,解析完成后,将对应的路由统一写到一个文件上,例如可以写在原生App的assets目录下,格式如下:

{
"flutter_module_2": ["mainPage", ”SecondPage"],
"flutter_module_3": ["mainPage"]
}

在App启动时去读取该文件则可以获取到Flutter模块暴露的路由了,这样,我们在原生模块中使用路由跳转Flutter页面时,就能提前知道该路由是否存在,存在在跳转,不存在则不要跳转,并提示错误提示的Toast。

iOS的实现方式

实现原理应该和Android差不多,待更新

你可能感兴趣的:(Flutter模块如何暴露已实现的路由)