近期有一个原生的项目,有一个模块使用flutter开发的,上手搞了一波集成工作,大概小记一下
首先是配置flutter环境,在网上找到一个链接,里面说的比较详细,此处不赘述,直接附上链接
https://www.jianshu.com/p/963735d2a1f2(mac系统下配置flutter环境)
本博文主要讲解通过Cocoapods导入的方式集成
1、初始化flutter代码
首先我们拿到flutter部分代码,先依次执行以下代码后会在flutter文件目录下生成一个隐藏的文件夹
flutter clean
flutter packages pub run build_runner build
flutter pub get
2、podfile中引入如下代码(导入flutter相关代码文件)
flutter_application_path = '../dy_wyc'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
target 'HitchingDemo' do
# 安装Flutter模块
install_all_flutter_pods(flutter_application_path)
注:其中flutter_application_path后为引入的flutter项目文件路径,在该例子中,我的flutter模块名称叫dy_wyc,原生项目模块名称HitchingDemo,目录结构跟原生工程平级(官方建议是跟原生目录平级)
通过以上引入完成flutter的引入
3、Appdelegate中导入#import <Flutter/Flutter.h>,并且继承FlutterAppDelegate,截图如下
接着.m中引入,初始化
#import <FlutterPluginRegistrant/GeneratedPluginRegistrant.h> // Used to connect plugins.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//flutter集成
self.flutterEngine = [[FlutterEngine alloc] initWithName:@"myFlutterEngine"];
[self.flutterEngine run];
[GeneratedPluginRegistrant registerWithRegistry:self.flutterEngine];
return YES;
}
4、原生页面与flutter的跳转(在需要实现跳转flutter的地方引入如下代码完成跳转)
FlutterEngine *flutterEngine =
((AppDelegate *)UIApplication.sharedApplication.delegate).flutterEngine;
FlutterViewController *flutterViewController =
[[FlutterViewController alloc] initWithEngine:flutterEngine nibName:nil bundle:nil];
flutterViewController.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:flutterViewController animated:YES completion:nil];
注意:项目中集成了flutter, 使用iOS14系统真机在断开调试后,点击App图标启动闪退。
原因:deug模式下,flutter为了实现热重载,默认编译方式为JIT。而iOS14系统对这种编译模式做了限制,导致无法启动。
解决方案:
1.更改XCode编译模式:使用release模式编译,这个时候flutter编译方式为AOT,可正常启动。