目录

Flutter-调用原生IOS接口

目录

Flutter 调用原生IOS接口

直接上代码有注释

服务类

import 'package:flutter/services.dart';

class TNativeChannel{
  static const methChanal = MethodChannel("flutter_native");
  static const eventChanal = EventChannel("flutter_native_event");

  //获取ios版本信息
  static Future<String?> getPlatformVersion()async{
    try{
      final String? version = await methChanal.invokeMethod("getPlatformVersion");
      return version;
    }on PlatformException catch (e){
      return "获取失败 ${e.message}";
    }
  }

  static Future<String?> greet(String name)async{
    final String? response = await methChanal.invokeMethod("greet",{'name':name});
    return response;
  }


 static void listenToEvent(){
    eventChanal.receiveBroadcastStream().listen((event){
      print("iOS 发送过来的事件 $event");
    });
 }
}

测试代码块

Widget createWidget(){
    return ListView(
      children: [
        ElevatedButton(onPressed: (){
          TNativeChannel.listenToEvent();
        },  child: Text("测试openNativeView")),

        FutureBuilder(future: TNativeChannel.getPlatformVersion(), builder: (context,snop){
          return Text(snop.data ?? "加载中");
        }),
      ],
    );
  }

ios 端代码 Appdelegate

import Flutter
import UIKit

@main
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
      setUpFlutter1()
      setFlutter2()
      setEventChannel()
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
    
    
    func setUpFlutter1(){
        let flutterVc = window.rootViewController as! FlutterViewController
        //通道名称必须和flutter端定义的一致
        let channel = FlutterMethodChannel(name: "flutter_native", binaryMessenger: flutterVc.binaryMessenger)
        //监听方法
        channel.setMethodCallHandler { call, result in
            if call.method == "getPlatformVersion"{
                let version = UIDevice.current.systemVersion
                result("iOS \(version)")
            }else{
                result(FlutterMethodNotImplemented)
            }
        
        }
    }
    
    //带参数的调用
    func setFlutter2(){
        guard let fluttervc = window.rootViewController as? FlutterViewController else{return}
        let channel = FlutterMethodChannel(name: "flutter_native", binaryMessenger: fluttervc.binaryMessenger);
        channel.setMethodCallHandler { call, result in
            if call.method == "greet"{
                let args = call.arguments as? [String:Any]
                let name = args?["name"] as? String ?? "Unknown"
                result("Hello \(name) from iOS")
            }else{
                result(FlutterMethodNotImplemented)
            }
        }
        
    }
    
    
    func setEventChannel(){
        let flutterVc = window.rootViewController as! FlutterViewController
        let eventChannal = FlutterEventChannel(name: "flutter_native_event", binaryMessenger: flutterVc.binaryMessenger);
        let handler = FEventStreamHandler()
        eventChannal.setStreamHandler(handler)
    }
}


class FEventStreamHandler:NSObject,FlutterStreamHandler{
    var eventSink:FlutterEventSink?
    func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
        self.eventSink = events
        
        //发送测试数据
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            self.eventSink?("NFC 扫描成功");
        }
        
        return nil
    }
    
    func onCancel(withArguments arguments: Any?) -> FlutterError? {
        eventSink = nil
        return nil
    }
    
    
}