在混合开发中避免不了通信,简单记录一下,Flutter iOS工程与Flutter 之间相互通信。Flutter
中通过Platform Channel实现Flutter和原生端的数据传递,是怎么进行数据通信,以及怎么配置,下面一一进行详解。
- 通过Platform channel 将传递的数据以发送消息的形式。
- 跨线程发送到iOS端和Android 原生端收到Platform
Channel传递过来的消息后,进行相应处理 。
原生端处理完毕,将结果以同样的方式原路返回给应用对应的Flutter部分。
FlutterMethodChannel
使用
注:iOS 端简单设置
class HYFlutterNavChannel: NSObject {
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)
}
}
public static func start() {
_ = HYFlutterNavChannel.share
}
// pop
func 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_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
这里使用了一个类进行统一管理 通信类
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使用的地方进行调用文章来源:https://www.toymoban.com/news/detail-636181.html
Channels.navigation.finishHostPage();
上述完成,flutter就可以调用原生里面注册的pop方法了。文章来源地址https://www.toymoban.com/news/detail-636181.html
到了这里,关于Flutter iOS 与 flutter 相互通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!