最近项目组接到需求需要把原生项目与flutter混淆,作为flutter的初学者,一步步按照网上的步骤进行开发,我把从最开的集成flutter模块到交互,遇到的问题,与解决办法与大家分享下。
先把我集成的方案发一下,借鉴的百度:
1、https://www.jianshu.com/p/e8b8c20bc030
2、https://blog.csdn.net/u010960265/article/details/84066724
3、https://www.cnblogs.com/LeeGof/p/10925672.html
这是要实现的效果,原生页面中嵌入flutter模块。
效果图
遇到的问题
1、当项目执行完pod install之后,之前的项目头文件找不到了,报错'GeTuiExtSdk.h' file not found
报错1
感觉很简单的问题,但是却解决不掉,所有的方法试了一轮,头文件引入路径通通没问题,最终通过对比原来的项目,发现了pods文件夹下面的header文件中的public文件缺失了,然后又重新导入了一遍,果然问题解决了。
2、添加flutter脚本报错
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build
"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed
这两句脚本需要把Run Script放在pods manifest.lock的下面(很重要)
3、加载flutter的视图与交互实现
安卓的代码实现:https://mp.weixin.qq.com/s/TEYHCH0gKkLm7f1PWEa_9Q
https://www.jianshu.com/p/abd937d0d9aa
网上看到不少安卓实现的代码,ios集成的却很少,其实很简单,下面是代码
_flutterViewController = [[FlutterViewController alloc] initWithProject:nil nibName:nil bundle:nil];
_flutterViewController.view.backgroundColor = [UIColor whiteColor];
_flutterViewController.splashScreenView = nil;
_flutterViewController.view.frame = CGRectMake(0, 0, ScreenWidth, (ScreenWidth-20-W_size(7)*4)/5+19);
[_flutterViewController setInitialRoute:@"myApp"];
NSString *channelName = @"com.pages.your/native_get";
FlutterMethodChannel * messageChannels = [FlutterMethodChannel methodChannelWithName:channelName binaryMessenger:_flutterViewController];
[messageChannels setMethodCallHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult _Nonnull result) {
// call.method 获取 flutter 给回到的方法名,要匹配到 channelName 对应的多个 发送方法名,一般需要判断区分
// call.arguments 获取到 flutter 给到的参数,(比如跳转到另一个页面所需要参数)
// result 是给flutter的回调, 该回调只能使用一次
NSLog(@"method=%@ \narguments = %@", call.method, call.arguments);
// method和WKWebView里面JS交互很像
// flutter点击事件执行后在iOS跳转TargetViewController
// __weak typeof(self) weakSelf = self;
if ([call.method isEqualToString:@"iOSFlutter"]) {
}
// flutter传参给iOS
if ([call.method isEqualToString:@"iOSFlutter1"]) {
// NSDictionary *dic = call.arguments;
NSNumber * num = call.arguments;
int myInt = [num intValue];
NSLog(@"arguments = %@ myInt==%d", num,myInt);
HomeRootIndexButtonModel * model = _IndexBtnArr[myInt];
[self jumpByTiType:model.ti_jump AddActivityType:model.bn_type_v1 addTitle:model.bn_title addLinkUrl:model.bn_url addIsShare:model.bn_share addContent:model.bn_content addShareImage:model.bn_logo addShareUrl:model.bn_url_h5 addBannerLogin:model.bn_login addBannerKind:model.bn_kind];
NSError *parseError = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:flutterJsonDict options:NSJSONWritingPrettyPrinted error:&parseError];
NSString * jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"json==%@",jsonStr);
// iOS给flutter值
if ([call.method isEqualToString:@"iOSFlutter2"]) {
if (result) {
result(jsonStr);
}
}
}];
return _flutterViewController.view;
不足之处,欢迎指正交流。
qq:1241550832
网友评论