Flutter 调用原生IOS接口

直接上代码有注释

服务类

dart 复制代码
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");
    });
 }
}

测试代码块

dart 复制代码
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

dart 复制代码
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
    }
    
    
}
相关推荐
消失的旧时光-194310 小时前
Flutter 插件通信架构设计:从 Channel 到 FFI 的完整边界
flutter·ffi
北京自在科技11 小时前
苹果iOS 26.3实现跨安卓数据无缝迁移
android·ios·findmy
郑梓斌14 小时前
Luban 2 Flutter:一行代码在 Flutter 开发中实现图片压缩功能
flutter·ios
哈__14 小时前
Flutter 开发鸿蒙 PC 第一个应用:窗口创建 + 大屏布局
flutter·华为·harmonyos
AiFlutter15 小时前
蓝牙调试助手开发(03):概要设计
flutter·低代码平台·aiflutter·aiflutter低代码·flutter低代码开发·蓝牙调试·蓝牙调试助手
西西学代码15 小时前
Flutter---框架
前端·flutter
消失的旧时光-194316 小时前
Flutter 与原生通信机制全解析:MethodChannel / EventChannel / BasicMessageChannel,一篇讲透(工程级)
flutter·dart·channel
kirk_wang16 小时前
Flutter Widget核心概念深度解析
flutter·移动开发·跨平台·arkts·鸿蒙
傅里叶16 小时前
Flutter移动端获取相机内参
前端·flutter
RaidenLiu16 小时前
Offstage / Visibility:不可见真的就不消耗性能吗
前端·flutter·性能优化