Flutter iOS 与 flutter 相互通信

在混合开发中避免不了通信,简单记录一下,Flutter iOS工程与Flutter 之间相互通信。
Flutter中通过Platform Channel实现Flutter和原生端的数据传递,是怎么进行数据通信,以及怎么配置,下面一一进行详解。

  • FlutterMethodChannel 使用
    注:iOS 端简单设置
dart 复制代码
class HYFlutterNavChannel: NSObject {
    
    @objc public static let share = HYFlutterNavChannel()
    // 声明 FlutterMethodChannel
    var channel: FlutterMethodChannel
    // 
    lazy var map: [String: (_ call: FlutterMethodCall, _ result: FlutterResult) -> Void] = {
        return [
            "pop":pop,
        ]
    }()
    
    
    override init() {
        // name 一定需要和  flutter里面约定好,保持一致
        channel = FlutterMethodChannel.init(name: "Flutter/navigation", binaryMessenger: FlutterBoost.instance().engine().binaryMessenger)
        
        super.init()
        
        channel.setMethodCallHandler {[weak self] (call, reslt) in
            let method = self?.map[call.method]
            method?(call, reslt)
        }
        
    }
    
    @objc public static func start() {
        _ = HYFlutterNavChannel.share
    }
    
    
    // pop
    func pop(call: FlutterMethodCall, result: FlutterResult)  {
        UINavigationController.topNavigationController()?.navigationController?.popViewController(animated: true)
    }
    
}

在iOS 注册Flutter 引擎的地方使用

dart 复制代码
// 案例是放到 AppDelegate中
[FlutterBoost.instance setup:application delegate:delegate callback:^(FlutterEngine *engine) {
        NSLog(@"FlutterBoost 开始操作");
        // 使用 MethodChannel
        [HYFlutterNavChannel start];
        [HYFlutterCommonChannel start];
    }];

上述就把iOS端,使用FlutterMethodChannel简单进行通信集成完毕。

  • Flutter 端 MethodChannel 集成与使用
bash 复制代码
import 'dart:collection';

import 'package:flutter/services.dart';

class NavigationChannel {
  // 这里需要和原生保存一致  "Flutter/navigation"
  // ignore: constant_identifier_names
  static const MethodChannel channel_navigation =
      MethodChannel("Flutter/navigation");

  // ignore: non_constant_identifier_names
  static final channel_navigation_handlers =
      HashMap<String, MethodCallHandler>();

  NavigationChannel() {
    init();
  }

  void init() {
    channel_navigation_handlers["nativeQuitFlutter"] = nativeQuitFlutter;
    channel_navigation.setMethodCallHandler((call) async {
      channel_navigation_handlers[call.method]?.call(call);
    });
  }

  //  native 提供的功能方法

  Future<void> finishHostPage() async {
    return channel_navigation.invokeMethod("pop");
  }

  Future<void> nativeQuitFlutter(MethodCall call) async {}

// -------------flutter提供的功能-----------------
  void registerInitRoute(MethodCallHandler handler) {
    channel_navigation_handlers["initRoute"] = handler;
  }
}

typedef MethodCallHandler = Future<dynamic> Function(MethodCall call)?;

以上 Flutter MethodChannel 集成完毕

  • Flutter 使用MethodChannel
    这里使用了一个类进行统一管理 通信类
bash 复制代码
import 'package:my_flutter/common_channel.dart';

import 'navigation_channel.dart';

class Channels {
  // ignore: empty_constructor_bodies
  Channels._() {}

// 注册 Channel
  static final navigation = NavigationChannel();
  static final common = CommonChannel();
}

在Flutter使用的地方进行调用

bash 复制代码
Channels.navigation.finishHostPage();

上述完成,flutter就可以调用原生里面注册的pop方法了。

相关推荐
不爱吃糖的程序媛1 小时前
Flutter OH Engine构建指导
flutter
小蜜蜂嗡嗡4 小时前
flutter实现付费解锁内容的遮挡
android·flutter
tangweiguo030519876 小时前
Flutter iOS 调试利器:idevicesyslog 从入门到精通
flutter
tangweiguo030519879 小时前
Flutter 异常捕获与处理:从入门到生产实践
flutter
2501_915909069 小时前
不用越狱就看不到 iOS App 内部文件?使用 Keymob 查看和导出应用数据目录
android·ios·小程序·https·uni-app·iphone·webview
@大迁世界10 小时前
液态玻璃屏正在侵蚀你的电池
macos·ios·objective-c·cocoa
不爱吃糖的程序媛10 小时前
已有 Flutter 应用适配鸿蒙平台指导文档
flutter·华为·harmonyos
weixin_4434785110 小时前
flutter组件学习之卡片与列表
javascript·学习·flutter
不爱吃糖的程序媛11 小时前
Flutter-OH 升级指导
flutter
pop_xiaoli11 小时前
【iOS】类与对象底层
macos·ios·objective-c·cocoa·xcode