Flutter iOS 与 flutter 相互通信

news/2024/11/17 10:55:19/

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

  • FlutterMethodChannel 使用
    注:iOS 端简单设置
class HYFlutterNavChannel: NSObject { public static let share = HYFlutterNavChannel()// 声明 FlutterMethodChannelvar 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) inlet method = self?.map[call.method]method?(call, reslt)}} public static func start() {_ = HYFlutterNavChannel.share}// popfunc pop(call: FlutterMethodCall, result: FlutterResult)  {UINavigationController.topNavigationController()?.navigationController?.popViewController(animated: true)}}

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

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

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

  • Flutter 端 MethodChannel 集成与使用
import 'dart:collection';import 'package:flutter/services.dart';class NavigationChannel {// 这里需要和原生保存一致  "Flutter/navigation"// ignore: constant_identifier_namesstatic const MethodChannel channel_navigation =MethodChannel("Flutter/navigation");// ignore: non_constant_identifier_namesstatic 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
    这里使用了一个类进行统一管理 通信类
import 'package:my_flutter/common_channel.dart';import 'navigation_channel.dart';class Channels {// ignore: empty_constructor_bodiesChannels._() {}// 注册 Channelstatic final navigation = NavigationChannel();static final common = CommonChannel();
}

在Flutter使用的地方进行调用

Channels.navigation.finishHostPage();

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


http://www.ppmy.cn/news/1018091.html

相关文章

培训Java技术要多久才能学会?答案都在这里啦

培训Java技术要多久才能学会?这是想学习Java开发的很多人都会问到的一个问题。而这个问题的答案其实并不是那么简单&#xff0c;因为学Java的时间长短受到众多因素的影响。本文将从个人基础、学习动力和学习效率三个方面来为您解答这个问题。 1. 个人基础 自己的基础对于学习…

react中的formik如何使用

介绍&#xff1a; Formik 是一个用于处理表单状态和验证的 React 库。它提供了一种简化和统一的方式来处理复杂的表单逻辑&#xff0c;包括表单值的管理、表单验证、表单提交和错误处理等。 使用 安装 Formik 和 Yup&#xff08;用于表单验证&#xff09;&#xff1a; // ba…

【Kubrenetes】Pod基础概念

目录 在Kubrenetes集群中Pod有如下两种使用方式&#xff1a; pause容器使得Pod中的所有容器可以共享两种资源&#xff1a;网络和存储。 ●网络&#xff1a; ●存储&#xff1a; 总结&#xff1a; kubernetes中的pause容器主要为每个容器提供以下功能&#xff1a; Kubern…

篇二十三:设计模式的综合实例:构建完整项目

篇二十三&#xff1a;"设计模式的综合实例&#xff1a;构建完整项目" 开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun/。 另外有2本不错的关于设计模…

Go学习第八天

签名 func (a *Account) Sign(message []byte) ([]byte, error) {hash : crypto.Keccak256Hash(message)signature, err : crypto.Sign(hash.Bytes(), a.privateKeyECDSA)if err ! nil {log.Fatal(err)}signMsg : []byte(hexutil.Encode(signature))return signMsg, err }验签…

hhc.exe本地制作、手动生成chm电子书

准备几个文件 test.hhp(配置文件)test.hhc(目录文件)test.html(点击节点右侧显示的内容)hhc.exe去这里下载,链接在文章最后test.hhp [OPTIONS] Compiled file=test.chm Contents file=test.hhc Index file=test.hhc Title=chm中文title标题 Language=0x804 中文(中国) …

C/C++/QT/Python/MATLAB获取文件行数的示例

1. C获取文件行数 #include <stdio.h>int main() {FILE *file fopen("path/to/your/file.txt", "r");if (file NULL) {printf("Failed to open the file!\n");return 0;}int lineCount 0;char ch;while ((ch fgetc(file)) ! EOF) {if…