方案优点:配置简单,开发人员不需要每个人都安装flutter环境
缺点是flutter 项目如有更新,需要重新打包framework
结合我们公司实际项目,此方案比较贴合。
一、新建flutter_module 项目
想要把flutter 集成进现有iOS 项目,必须要使用Flutter Module
通过命令 flutter create -t module flutter_module
创建模板项目
flutter create -t module flutter_module
//如下表示创建成功
All done!
Your module code is in flutter_module/lib/main.dart.
此处需注意,需要连外网操作
二、运行flutter_module项目
使用Android Studio 运行此项目
如图已经运行起来
三、将flutter打包成framework
在.ios
文件下,做以下处理
- 处理下热更新配置,否则引用后的Flutter 运行后无法拔掉USB,拔掉就报如下错误:
原因是 在 iOS 14 及以上版本中,Flutter 应用的调试模式只能通过 Flutter 工具或集成开发环境(IDE)启动。这是因为 Apple 对于应用程序的启动和调试过程进行了更严格的限制,以提高安全性和隐私保护
处理方法是:
在ios 文件夹下,xcode 运行Runner 项目
修改配置,在Build Settings 下新增User-Defined 子项 FLUTTER_BUILD_MODE ,如下图
2.可以将项目的证书、bundle id
在此处处理下
使用命令制作framework
1.cd 到 Flutter_module 文件夹下
2.输入如下命令:
flutter build ios --debug
flutter build ios --release --no-codesign
//如下就表示构建完成
Building com.example.flutterModuleLU for device (ios-release)...
Running Xcode build...
└─Compiling, linking and signing... 5.7s
Xcode build done. 37.5s
此处需要注意的是,执行命令的时候,有可能会报错,会弹出错误弹框
此时,到系统偏好设置中,打开安全与隐私,授权强制打开。然后重新执行命令
这时就可以看到创建好的framework了
四、验证测试
1、将生成的两个framework拖到项目中
这里需要注意一点:
设置的 General > Frameworks, Libraries, and Embedded Content 下,然后在 Embed 下拉列表中选择 “Embed & Sign”。
试一下
在AppDelegate.h文件中
#import <UIKit/UIKit.h>
#import <Flutter/Flutter.h>
@interface AppDelegate : FlutterAppDelegate <UIApplicationDelegate>
@end
在FlutterDemoViewController.m 中
#import "ViewController.h"
#import <Flutter/Flutter.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIButton * btn = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 100, 40)];
[btn setTitle:@"按钮" forState:UIControlStateNormal];
[btn setTitleColor:UIColor.orangeColor forState:UIControlStateNormal];
[btn addTarget:self action:@selector(clickAction) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
// Do any additional setup after loading the view.
}
-(void)clickAction {
FlutterViewController * flutter = [[FlutterViewController alloc]init];
[self presentViewController:flutter animated:YES completion:^{
}];
}
@end
收工!
您的打赏,是咱不懈更新的动力 😊