需求是将我们已上线的Flutter App嵌入到其他公司的iOS 原生项目中。
主要流程:
- 将Flutter端业务以及插件打包成framework类型
- 原生iOS端按照文档初始化Flutter引擎以及打开Flutter页面
- 原生端传值以及Flutter端取值
其中关于传值,查看文档以及网上检索,一般是通过MessageChannel进行传值,比较方便的方式则是通过初始化引擎的时候指定 initialRoute,这样确实可以传递过来,但是也会影响Flutter端的路由逻辑,进而影响业务(比如我们的是需要先拿到原生端传来的值,再进行页面的跳转以及业务处理)。
其中 官方文档 也有写明:这段代码使用 "/onboarding" 取代 "/",作为你的 dart:ui 的 window.defaultRouteName
后来发现初始化引擎的时候有个API:
- (BOOL)runWithEntrypoint:(nullable NSString*)entrypoint
libraryURI:(nullable NSString*)libraryURI
initialRoute:(nullable NSString*)initialRoute
entrypointArgs:(nullable NSArray<NSString*>*)entrypointArgs;
其中 entrypointArgs 参数则代表Flutter端的main函数可选参数,于是将默认的初始化引擎方式改为:
[self.flutterEngine runWithEntrypoint:nil libraryURI:nil initialRoute:nil entrypointArgs:@[@"123456"]];
在Flutter端接收:
void main(args) async {
print('从原生过来的值:$args');
}
测试一切正常,在此记录一下,后续补充一点混编方面的其他资料。