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方法了。

相关推荐
程序员老刘·20 小时前
Android Studio Otter 3 发布:日常开发选AS还是Cursor?
flutter·android studio·ai编程·跨平台开发·客户端开发
浩辉_20 小时前
Dart - 内存管理与垃圾回收(GC)深度解析
flutter·dart
一起养小猫1 天前
Flutter for OpenHarmony 实战:记忆棋游戏完整开发指南
flutter·游戏·harmonyos
Betelgeuse761 天前
【Flutter For OpenHarmony】TechHub技术资讯界面开发
flutter·ui·华为·交互·harmonyos
铅笔侠_小龙虾1 天前
Flutter 安装&配置
flutter
mocoding1 天前
使用已经完成鸿蒙化适配的Flutter本地持久化存储三方库shared_preferences让你的应用能够保存用户偏好设置、缓存数据等
flutter·华为·harmonyos·鸿蒙
徐同保1 天前
通过ip访问nginx的服务时,被第一个server重定向了,通过设置default_server解决这个问题
ios·iphone
无熵~1 天前
Flutter入门
flutter
hudawei9961 天前
要控制动画的widget为什么要with SingleTickerProviderStateMixin
flutter·mixin·with·ticker·动画控制
jian110581 天前
flutter dio 依赖,dependencies 和 dev_dependencies的区别
flutter