我们做项目的时候难免会遇到flutter和OC或者swift混编的需求,所以本人也尝试着将flutter集成到项目中进行调用,目前已经集成成功,可以做到界面的跳转。下面我们就来详细的说一下具体的步骤吧:
一、Xcode创建Swift项目。
首先我们创建一个Swift的项目,命名为HunHe。
二、创建flutter项目
这里创建flutter项目是关键点,我们通过终端命令行创建。
1、进入到要创建项目的文件夹中,输入如下命令,创建项目名为my_flutter。
bogon:Demo mac$ flutter create --template module my_flutter
稍等片刻,项目创建成功,如下:
251595245082_.pic_hd.jpg
三、在我们的Podfile文件中导入本地的my_flutter
# 添加模块所在路径
flutter_application_path = '../my_flutter'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
target 'HunHe' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# 安装Flutter模块
install_all_flutter_pods(flutter_application_path)
end
注释:my_flutter项目和HunHe在同一级目录中,所以我们必须要回到上一级目录中用../my_flutter
,其中'podhelper.rb至关重要,这里踩过坑。
四、集成flutter到Swift项目中
cd进入到我们的Swift项目中,准备集成my_flutter。
bogon:Demo mac$ cd /Users/mac/Desktop/Demo/HunHe
bogon:HunHe mac$ pod install
261595245213_.pic_hd.jpg
集成成功。
五、代码调用
1、在AppDelegate导入flutter,然后创建引擎,最终启动引擎。
import UIKit
import Flutter
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
// 1.创建一个FlutterEngine引擎对象
lazy var flutterEngine = FlutterEngine(name: "my flutter engine")
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 2、启动引擎
flutterEngine.run()
return true
}
}
2、在ViewController中导入import Flutter,然后创建一个按钮,在事件中获取appdelegate中的引擎,利用引擎获取flutterViewController对象,最后用于push或者present。
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
//1、创建一个按钮
let button = UIButton(type: UIButton.ButtonType.custom)
button.addTarget(self, action: #selector(showFlutter), for: .touchUpInside)
button.setTitle("Show Flutter", for: .normal)
button.frame = CGRect(x: 80, y: 210, width: 160, height: 40)
button.backgroundColor = UIColor.blue
self.view.addSubview(button)
}
@objc func showFlutter() {
// 2.创建FlutterViewController对象(需要先获取flutterEngine)
let flutterEngine = (UIApplication.shared.delegate as! AppDelegate).flutterEngine;
let flutterViewController = FlutterViewController(engine: flutterEngine, nibName: nil, bundle: nil);
// navigationController?.pushViewController(flutterViewController, animated: true);
present(flutterViewController, animated: true, completion: nil)
}
}
六、OC代码调用如下
1、Appdelegate.h中调用
@import UIKit;
@import Flutter;
@interface AppDelegate : FlutterAppDelegate
@property (nonatomic,strong) FlutterEngine *flutterEngine;
@end
2、Appdelegate.m中调用
#import <FlutterPluginRegistrant/GeneratedPluginRegistrant.h> // Used to connect plugins.
#import "AppDelegate.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary<UIApplicationLaunchOptionsKey, id> *)launchOptions {
self.flutterEngine = [[FlutterEngine alloc] initWithName:@"my flutter engine"];
[self.flutterEngine run];
[GeneratedPluginRegistrant registerWithRegistry:self.flutterEngine];
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
3、在ViewController.m中,创建按钮,然后调事件- (void)showFlutter
- (void)showFlutter {
FlutterEngine *flutterEngine =
((AppDelegate *)UIApplication.sharedApplication.delegate).flutterEngine;
FlutterViewController *flutterViewController =
[[FlutterViewController alloc] initWithEngine:flutterEngine nibName:nil bundle:nil];
[self presentViewController:flutterViewController animated:YES completion:nil];
}
运行效果如下:
GIF生成网址:https://www.gif.cn/
上面讲述的是原生调用flutter,现在我们了解一下flutter怎么调用原生方法。有些是我们的flutter无法获取的,比如电量、经纬度,所以我们就需要通过原生的方法来获取。这里主要有以下几步。
1、在flutter中通过Dart创建通道名称
。
static const platform = const MethodChannel("my/battery");
下面的代码是搭建UI
int _result = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Battery"),
),
body: Center(
child: Column(
children: <Widget>[
Text("当前电池信息: $_result"),
RaisedButton(
child: Text("获取电池信息"),
onPressed: getBatteryInfo,
)
],
),
),
);
}
2、通过platform.invokeMethod
调用平台方法。
void getBatteryInfo() async {
// 核心代码二
final int result = await platform.invokeMethod("getBatteryInfo");
setState(() {
_result = result;
});
}
二、在调用原生页面添加代码有以下几步:
1、获取FlutterViewController
2、获取方法通道也就是"my/battery"
网友评论