iOS已有項(xiàng)目集成flutter,網(wǎng)上大把資料拦英,這里主要記錄互相跳轉(zhuǎn)傳值
OC跳轉(zhuǎn)到flutter界面,如跳轉(zhuǎn)到HomePage
OC代碼
// 1.初始化flutter控制器测秸,并指定路由 “home”疤估,flutter中根據(jù)該路由標(biāo)識顯示對應(yīng)的界面
FlutterViewController* flutterViewController = [[FlutterViewController alloc] initWithProject:nil initialRoute:@"home" nibName:nil bundle:nil];
//2. 設(shè)置flutter HomePage標(biāo)題
flutterViewController.navigationItem.title = @"原生項(xiàng)目設(shè)置的首頁title";
//3. 跳轉(zhuǎn)
[self.navigationController pushViewController:flutterViewController animated:YES];
flutter代碼
import 'dart:ui' as ui;
void main() {
// 獲取原生跳轉(zhuǎn)的路由,根據(jù)路由顯示對應(yīng)的界面霎冯,ui.window.defaultRouteName就是上面設(shè)置的 “home”路由標(biāo)識
runApp(run(ui.window.defaultRouteName));
}
//根據(jù)路由標(biāo)識返回對應(yīng)的Widget铃拇,這里需要注意的是如果是單獨(dú)的界面,必須使用MaterialApp包裹住沈撞,不然跳轉(zhuǎn)過來后顯示不了當(dāng)前ui
Widget run(String name){
switch (name) {
case "detail":
return DetailPage();
break;
case "home":
return HomePage();
break;
case "myApp":
return MyApp();
break;
}
return Center(
child: Text('Unknown route: $name'),
);
}
OC跳轉(zhuǎn)到flutter界面時攜帶一個字典參數(shù)
OC代碼
//1. 創(chuàng)建事件通道對象慷荔,唯一標(biāo)識 “hometest”,到時flutter是根據(jù)該標(biāo)識來監(jiān)聽原生發(fā)送給flutter的參數(shù)信息
FlutterEventChannel *evenChannel = [FlutterEventChannel eventChannelWithName:@"hometest" binaryMessenger:flutterViewController.binaryMessenger];
//2. 當(dāng)原生跳往flutter時會觸發(fā)下面的- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events回調(diào)方法缠俺,可以在該方法中給flutter傳遞參數(shù)
[evenChannel setStreamHandler:self];
//原生跳轉(zhuǎn)flutter時显晶,會觸發(fā)該方法,在該方法中可以傳遞參數(shù)給flutter界面,需要注意的是flutter代碼中必須寫上對應(yīng)的監(jiān)聽代碼壹士,這里才會被執(zhí)行
- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events{
if (events) {
events(@{@"key":@"value"});
}
return nil;
}
flutter接受參數(shù)的代碼
String str = "flutter之前的參數(shù)";
// 用于監(jiān)聽原生調(diào)用flutter
static const EventChannel homeChannel = const EventChannel('hometest');
@override
void initState() {
// TODO: implement initState
super.initState();
//_onEventHome 監(jiān)聽回調(diào)方法
homeChannel.receiveBroadcastStream(12345).listen(_onEventHome,onError: _onErrorHome);
}
// 回調(diào)事件 首頁
void _onEventHome(Object event) {
if (event is Map){
str = event["key"];
}else if(event is String){
str = event.toString();
}else{
str = "其他類型";
}
setState(() {
});
}
// 錯誤返回
void _onErrorHome(Object error) {
}
flutter調(diào)用OC吧碾,并攜帶一個字典參數(shù)
flutter代碼
// 用于調(diào)用原生方法 "hometestmethod"標(biāo)識符與OC中的監(jiān)聽標(biāo)識符保持一致
var homechannelmethod = MethodChannel("hometestmethod");
onTap: (){
//給原生發(fā)送消息并傳入?yún)?shù),原生根據(jù)標(biāo)識homePageCallNativeMethond來做對應(yīng)的處理
homechannelmethod.invokeMethod('homePageCallNativeMethond',{"key":"value","key1":"value1"});
},
OC代碼
// 1.創(chuàng)建方法通道對象墓卦,用于監(jiān)聽flutter調(diào)用原生時的回調(diào)倦春,唯一標(biāo)識“hometestmethod”與flutter要保持一致
FlutterMethodChannel *channel = [FlutterMethodChannel methodChannelWithName:@"hometestmethod" binaryMessenger:flutterViewController.binaryMessenger];
//2. 設(shè)置監(jiān)聽回調(diào)block,flutter端通過通道調(diào)用原生方法時會進(jìn)入以下回調(diào)
[channel setMethodCallHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult _Nonnull result) {
//call的屬性method是flutter調(diào)用原生方法的方法名落剪,我們進(jìn)行字符串判斷然后寫入不同的邏輯
if ([call.method isEqualToString:@"homePageCallNativeMethond"]) {
//flutter傳給原生的參數(shù)
id para = call.arguments;
NSLog(@"flutter傳給原生的參數(shù):%@", para);
//可以做界面跳轉(zhuǎn)
[self.navigationController pushViewController:[TestViewController new] animated:YES];
//獲取一個字符串
NSString *nativeFinalStr = @"原生給flutter回傳的值";
if (nativeFinalStr!=nil) {
//把獲取到的字符串傳值給flutter
result(nativeFinalStr);
}else{
//異常(比如改方法是調(diào)用原生的getString獲取一個字符串睁本,但是返回的是nil(空值),這顯然是不對的忠怖,就可以向flutter拋出異常 進(jìn)入catch處理)
result([FlutterError errorWithCode:@"001" message:[NSString stringWithFormat:@"進(jìn)入異常處理"] details:@"進(jìn)入flutter的trycatch方法的catch方法"]);
}
}else{
//調(diào)用的方法原生沒有對應(yīng)的處理 拋出未實(shí)現(xiàn)的異常
result(FlutterMethodNotImplemented);
}
}];