ios混编flutter中遇到的问题

2019-12-02  本文已影响0人  醉封

最近项目组接到需求需要把原生项目与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

上一篇下一篇

猜你喜欢

热点阅读