iOS項(xiàng)目與flutter項(xiàng)目,互相跳轉(zhuǎn)傳值

iOS已有項(xiàng)目集成flutter,網(wǎng)上大把資料,這里主要記錄互相跳轉(zhuǎn)傳值

OC跳轉(zhuǎn)到flutter界面,如跳轉(zhuǎn)到HomePage

OC代碼
// 1.初始化flutter控制器,并指定路由 “home”,flutter中根據(jù)該路由標(biāo)識(shí)顯示對應(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)識(shí)
  runApp(run(ui.window.defaultRouteName));
}

//根據(jù)路由標(biāo)識(shí)返回對應(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í)攜帶一個(gè)字典參數(shù)

OC代碼
//1. 創(chuàng)建事件通道對象,唯一標(biāo)識(shí) “hometest”,到時(shí)flutter是根據(jù)該標(biāo)識(shí)來監(jiān)聽原生發(fā)送給flutter的參數(shù)信息
    FlutterEventChannel *evenChannel = [FlutterEventChannel eventChannelWithName:@"hometest" binaryMessenger:flutterViewController.binaryMessenger];
    //2. 當(dāng)原生跳往flutter時(shí)會(huì)觸發(fā)下面的- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events回調(diào)方法,可以在該方法中給flutter傳遞參數(shù)
    [evenChannel setStreamHandler:self];

//原生跳轉(zhuǎn)flutter時(shí),會(huì)觸發(fā)該方法,在該方法中可以傳遞參數(shù)給flutter界面,需要注意的是flutter代碼中必須寫上對應(yīng)的監(jiān)聽代碼,這里才會(huì)被執(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(() {
    });
  }
  // 錯(cuò)誤返回
  void _onErrorHome(Object error) {

  }

flutter調(diào)用OC,并攜帶一個(gè)字典參數(shù)

flutter代碼
//  用于調(diào)用原生方法  "hometestmethod"標(biāo)識(shí)符與OC中的監(jiān)聽標(biāo)識(shí)符保持一致
  var homechannelmethod = MethodChannel("hometestmethod");

onTap: (){
        //給原生發(fā)送消息并傳入?yún)?shù),原生根據(jù)標(biāo)識(shí)homePageCallNativeMethond來做對應(yīng)的處理
        homechannelmethod.invokeMethod('homePageCallNativeMethond',{"key":"value","key1":"value1"});
      },

OC代碼
//    1.創(chuàng)建方法通道對象,用于監(jiān)聽flutter調(diào)用原生時(shí)的回調(diào),唯一標(biāo)識(shí)“hometestmethod”與flutter要保持一致
    FlutterMethodChannel *channel = [FlutterMethodChannel methodChannelWithName:@"hometestmethod" binaryMessenger:flutterViewController.binaryMessenger];

    //2. 設(shè)置監(jiān)聽回調(diào)block,flutter端通過通道調(diào)用原生方法時(shí)會(huì)進(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];
            //獲取一個(gè)字符串
            NSString *nativeFinalStr = @"原生給flutter回傳的值";

            if (nativeFinalStr!=nil) {
                //把獲取到的字符串傳值給flutter
                result(nativeFinalStr);
            }else{
                //異常(比如改方法是調(diào)用原生的getString獲取一個(gè)字符串,但是返回的是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);
        }
    }];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容