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

相关推荐
孤鸿玉23 分钟前
Fluter InteractiveViewer 与ScrollView滑动冲突问题解决
flutter
叽哥7 小时前
Flutter Riverpod上手指南
android·flutter·ios
BG1 天前
Flutter 简仿Excel表格组件介绍
flutter
zhangmeng1 天前
FlutterBoost在iOS26真机运行崩溃问题
flutter·app·swift
恋猫de小郭1 天前
对于普通程序员来说 AI 是什么?AI 究竟用的是什么?
前端·flutter·ai编程
卡尔特斯1 天前
Flutter A GlobalKey was used multipletimes inside one widget'schild list.The ...
flutter
w_y_fan1 天前
Flutter 滚动组件总结
前端·flutter
醉过才知酒浓1 天前
Flutter Getx 的页面传参
flutter
用户091 天前
SwiftUI Charts 函数绘图完全指南
ios·swiftui·swift
YungFan1 天前
iOS26适配指南之UIColor
ios·swift