Flutter 混合工程
在实际的开发中,如果Flutter和原生的App混合开发的,Flutter端的工程师写dart代码,原生的工程师写OC/Java代码,此时项目就设计到了原生端和flutter的协同的问题。App端原生工程师的电脑也要有Flutter环境且还得和Flutter工程师的flutter环境版本要保持一致,flutter环境的安装路径还得一致。当flutter版本环境改变时,原生端的也要改变,这就非常的麻烦了。有木有办法来解决工程项目中的这一问题,屏蔽2端环境的干扰,让flutter工程师只专注Dart代码,原生工程师只专注OC/Java代码的编程呢?Flutter混合工程就是解决这问题的。只要把Flutter的环境和代码打包成Framework,在iOS工程中引入它,那么iOS开发者即便没有Flutter环境,依然可以运行Dart代码,且这样做还可以进一步构建CI自动化工程。
普通的混合工程方式
1. 创建一个flutter module项目,这个是flutter工程师写代码的地方。
2. 进入到flutter module项目的文件夹下,使用命令打包flutter module项目中的flutter.framework 和app.framework 给原生的工程师。
flutter build ios-framework --output=../flutter_app // 把生成的frame放到上一级的flutter_app目录中。
注:flutter_app文件夹下会生成3个文件夹,Debug、Release、Profile,分别代表Debug版本的、Release版本的、和Profile版本的(一般不用到)。只有debug版本能用到模拟器上,其他的只能真机使用。
项目关系
3. 把flutter_app下的某个版本文件夹拖到原生项目中。并把相应的App.framework和Flutter.framework 拉入到项目文件夹中,并在framework search path里去设置路径。
设置path路径
原生项目中引入framework
这样即便原生的开发者电脑没有flutter环境也能够正常的调用flutter代码了。
注:Flutter.framework:flutter环境编译成的包。
App.framework:flutter开发者写的dart业务代码最后编译出来的包。
也就是说每次flutter开发者写好了flutter代码,测试ok后,就通过上面的命令行去生产2个frame给原生的开发者,原生的开发者只要替换这2个framework就行。
具体代码
CocoaPods的混合工程方式
上面的混合工程中,原生的开发者需要更新的文件有2个Flutter.framework、App.framework。但是Flutter环境或版本在开发的过程中一般不会改变,而改变比较频繁的只有业务代码相关的App.framework。所以我们可以把用CocoaPods的方式,把Flutter.framework来引入。(现在很多项目本身也都用了CocoaPods来管理,这样接入更方便。)
1. 创建一个flutter module项目,这个是flutter工程师写代码的地方。
2. 进入到flutter module项目的文件夹下,使用命令打包flutter module项目中的App.framework 给原生的工程师。
flutter build ios-framework --cocoapods --output=../flutter_app // 把生成的frame放到上一级的flutter_app目录中。
3. 把flutter_app下的某个版本文件夹拖到原生项目文件夹中。在podfile中加入“pod 'Flutter', :podspec => 'flutter_app/Debug/Flutter.podspec'
”,并使用cocopods install去初始化项目(或者原来项目本来就集成了cocoapods的)
podfile
4. 在项目里引入App.framework就行了。(Flutter.framework已经通过cocoapods的方式去引入了,也就不需要去设置framework search path了)。
只有在Flutter v1.12以上版本才支持cocopods的方式去集成。