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
    }
    
    
}
相关推荐
火柴就是我8 小时前
让我们实现一个更好看的内部阴影按钮
android·flutter
王晓枫9 小时前
flutter接入三方库运行报错:Error running pod install
前端·flutter
开心就好20259 小时前
UniApp开发应用多平台上架全流程:H5小程序iOS和Android
后端·ios
开心就好202512 小时前
免 Xcode 的 iOS 开发新选择?聊聊一款更轻量的 iOS 开发 IDE kxapp 快蝎
后端·ios
恋猫de小郭15 小时前
Apple 的 ANE 被挖掘,AI 硬件公开,宣传的 38 TOPS 居然是"数字游戏"?
前端·人工智能·ios
shankss16 小时前
Flutter 下拉刷新库 pull_to_refresh_plus 设计与实现分析
flutter
忆江南1 天前
iOS 深度解析
flutter·ios
没有故事的Zhang同学1 天前
05-主题|事件响应者链@iOS-应用场景与进阶实践
ios
明君879971 天前
Flutter 实现 AI 聊天页面 —— 记一次 Markdown 数学公式显示的踩坑之旅
前端·flutter
恋猫de小郭1 天前
移动端开发稳了?AI 目前还无法取代客户端开发,小红书的论文告诉你数据
前端·flutter·ai编程