在实际的工作场景中,我们很难从零开始用纯Flutter去建设一个项目,也正是因为这样,Native+Flutter混合栈跳转管理使我们在混合开发的时候不得不首先考虑的问题,因为我们很难保证不会遇到下面的情况。
那么如何做技术选型困惑了不少想要做混开的同学,毕竟Flutter的生态还不是十分成熟,现成的解决方案和轮子并不多,而且还不一定好用,要么资源占用过高,要么侵入性太强。好在经过这几天的摸索,总结出来了一套方案,供大家学习参考,相互交流。
按照国际惯例,我先介绍一下目前市场上的一些解决方案以及存在的问题。
本文章基于Flutter版本:2.2 & Platform:Android
1.Google官方(多引擎方案)
即每次使用一个新的FlutterEngine来渲染Widget树。虽然Flutter 2.0之后的创建FlutterEngine的开销大大降低,但是依然没有解决每个FlutterEngine是一个单独isolate,如果需要Flutter①和Flutter②之间交互数据的话,将会非常麻烦。我们同样无法保证他们之间不会进行数据交互,因此Pass。
2.大名鼎鼎的闲鱼flutter_boost(单引擎方案)
flutter_boost最近发布了3.0的bate版本,摒弃了2.0版本对引擎的侵入(赞!),但是依然存在不少问题:
①:高居不下的未关闭issues与回复不及时之间的矛盾(可以理解,竟然还是有工作要做的)。
②:复杂的设计,在出现使用问题的时候,通过改flutter_boost源码解决的成本很高。
③:flutter方面耦合度较高,我必须使用flutter_boost提供的一系列Route相关的工具和Widget才能达到混合栈跳转的效果,如果我以后想要更换框架,那对代码的修改将是海量的。
于是乎成功把我劝退。
3.哈喽单车团队的flutter_thrio(单引擎方案)
该库的优劣作者已经说得很详细了,这里就不再赘述,感兴趣的朋友可以进传送门亲自查看。
4.字节跳动团队的Isolate复用方案和腾讯心悦团队的TRouter方案
很可惜,目前这两个方案并没有开源出来,但很可能字节团队的方案的侵入性相当高。
既然没有现成的方案,那就撸起袖子造一个,先来一个混合栈跳转的效果演示:
那么现在开始把上面的功能实现吧。
首先,要确定最终实现的目标,然后一步步朝着目标去完善:
目标一:复用FlutterEngine,避免额外的资源开销与FlutterEngine之间的通信成本。
目标二:Flutter Widget之间的跳转无需通过Native层控制(flutter_boost需要)。
目标三:每个打开的Flutter能且只能管理自己内部的栈,当前Flutter的Widget全部出栈后,退出当前Flutter。
目标四:支持Flutter带参数打开Native页面(返回值也可以支持,但目前还未添加进去)。
根据这些目标设计出来的模型图如下: