iOS原生项目集成flutter模块(版本v1.9.1+hotfix.6)

709 阅读2分钟
  1. 打开vscode 在终端执行命令路径指向想要创建model的目录(存放Flutter工程和iOS工程的上一级目录)

  2. 执行如下命令: flutter create –t module flutter_module(目录名字) 会生成如图示的文件夹结构:

    此时打开AS(因为我是用Android Studio),把flutter_module工程导入到IDE里,选择模拟器运行一边,因为在iOS工程里需要的库文件只有要运行过后才会生成. 很重要的一步:同时按住Shift +command+.(点号),把隐藏文件显示出来,此时flutter_module文件夹的结构会变成这样:

  3. 在iOSFlutte文件夹里创建iOS工程,结构如下:

  4. 接下来,打开命令行工具,进入到iOSFlutter(iOS工程)文件夹目录下

    执行pod init,生成podfile文件,打开此文件,添加如两行代码:

flutter_application_path = '../flutter_community'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')

如图:

并且在每个Xcode target都需要绑定flutter,调用install_all_flutter_pods(flutter_application_path)

注意:文件夹的目录,一定要按照上面说的来创建,要不然,这个podfile文件的flutter_application_path要进行路径调整. 添加完成后,再在命令行窗口里执行:pod install,此时就会生成pod支持的各种文件.

  1. iOS工程Enable Bitcode 需要关闭,因为Flutter混合开发不支持Bitcode

  2. 然后写代码调用flutter的界面.

-(void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor lightGrayColor];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button addTarget:self action:@selector(handleButtonAction)
forControlEvents:UIControlEventTouchUpInside];
 [button setTitle:@"点击跳转flutter页面" forState:UIControlStateNormal];
[button setBackgroundColor:[UIColor blueColor]];
button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
[self.view addSubview:button];
}

-(void)handleButtonAction {
FlutterViewController *flutterViewController = [[FlutterViewController alloc] init];
flutterViewController.view.backgroundColor = [UIColor cyanColor];
// 根据传入的字符串区分flutter页面
[flutterViewController setInitialRoute:@"xxx"];
flutterViewController.modalPresentationStyle = UIModalPresentationFullScreen;
[self presentViewController:flutterViewController animated:YES completion:nil];
// NSAssert([self navigationController], @“Must have a NaviationController”);
// [[self navigationController] pushViewController:flutterViewController animated:YES];
}

注:如果遇到如下图

这是flutter官方的一个bug,查资料说flutter升级到1.10就好了 不升级flutter的情况下,可以改Flutter SDK 的一个文件,flutter/packages/flutter_tools/bin/xcode_backend.sh 144行

RunCommand find "${derived_dir}/engine/Flutter.framework" -type f -exec chmod a-w "{}" \;
=>
RunCommand find "${derived_dir}/engine/Flutter.framework" -type f -iname '.h' -exec chmod a-w "{}" \;