赞
踩
在混合开发中避免不了通信,简单记录一下,Flutter iOS工程与Flutter 之间相互通信。
Flutter
中通过Platform Channel实现Flutter和原生端的数据传递,是怎么进行数据通信,以及怎么配置,下面一一进行详解。
FlutterMethodChannel
使用
注:iOS 端简单设置
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 引擎的地方使用
// 案例是放到 AppDelegate中
[FlutterBoost.instance setup:application delegate:delegate callback:^(FlutterEngine *engine) {
NSLog(@"FlutterBoost 开始操作");
// 使用 MethodChannel
[HYFlutterNavChannel start];
[HYFlutterCommonChannel start];
}];
上述就把iOS端,使用FlutterMethodChannel
简单进行通信集成完毕。
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
集成完毕
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使用的地方进行调用
Channels.navigation.finishHostPage();
上述完成,flutter就可以调用原生里面注册的pop方法了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。