直接上代码有注释
服务类
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
}
}