Flutter iOS 与 flutter 相互通信升级

Flutter iOS 与 flutter 相互通信升级

iOS端代码:

bash 复制代码
import Foundation
import flutter_boost


class HYFlutterCommonChannel: NSObject {
    
    @objc public static let share = HYFlutterCommonChannel()
    
    var channel: FlutterMethodChannel
    
    lazy var map: [String:(_ call: FlutterMethodCall, _ result:@escaping FlutterResult) -> Void] = {
        return [
            "notifyNativeEventResult":notifyNativeEventResult,
            "getISBuildRelease":getISBuildRelease,
        ]
    }()
    
    override init() {
        channel = FlutterMethodChannel.init(name: "Flutter/common", binaryMessenger: FlutterBoost.instance().engine().binaryMessenger)
        super.init()
        // 注册 flutter 回调原生方法
        channel.setMethodCallHandler {[weak self] (call, result) in
            let method = self?.map[call.method]
            method?(call, result)
        }
    }
    
    @objc public static func start() {
        _ = HYFlutterCommonChannel.share
    }
    
    // 获取版型状态
    func getISBuildRelease(call: FlutterMethodCall, result:@escaping FlutterResult) {
        result(false)
    }
    
    func notifyNativeEventResult(call: FlutterMethodCall, result:@escaping FlutterResult) {
        guard let arguments = call.arguments as? [String:AnyObject],
                let type = arguments["type"] as? String else {
            return
        }
        
        switch type {
        case "selectCountryAreaCode":
            do{
//                if code = {(code: String?) in
//                    if let _code = code {
//                        self.channel.invokeMethod("onCountryAreaCodeResult", arguments: _code)
//                    }
//                }
                
                if let tabBarVC = UIApplication.shared.keyWindow?.rootViewController as? UITabBarController,
                   let naVC = tabBarVC.selectedViewController as? UINavigationController {
                    
                    let vc = HYAreaCodeController()
                    vc.complete = {(code: String?) in
                        if let _code = code {
                            self.channel.invokeMethod("onCountryAreaCodeResult", arguments: _code)
                        }
                    }
                    naVC.navigationController?.pushViewController(vc as UIViewController, animated: true)
                }
            }
            
            break
            
        default:
            break
        }
        
        
    }
}

原生 控制器代码

bash 复制代码
class HYAreaCodeController: UIViewController {
    
    
    public var complete: ((_ code: String?)->())?
    
    lazy var codeBtn: UIButton = {
        let btn = UIButton()
        btn.backgroundColor = UIColor.red
        btn.addTarget(self, action: #selector(codeBtnClick(_:)), for: .touchUpInside)
        return btn
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white
        self.codeBtn.frame = CGRect.init(x: 100, y: 100, width: 100, height: 40)
        self.view.addSubview(self.codeBtn)
    }
    
    
    @objc func codeBtnClick(_ sender: UIButton) {
        
        if let callback = self.complete {
            callback("将选中数据返回给Flutter")
        }
    }
    
}

到此原生使用完毕

Flutter代码

bash 复制代码
import 'dart:collection';

import 'package:flutter/services.dart';
import 'navigation_channel.dart';

class CommonChannel {
  CommonChannel() {
    init();
  }

  // ignore: constant_identifier_names
  static const MethodChannel channel_common = MethodChannel("Flutter/common");

  // ignore: non_constant_identifier_names
  static final channel_handlers = HashMap<String, MethodCallHandler>();

  void init() {
    channel_common.setMethodCallHandler((call) async {
      channel_handlers[call.method]?.call(call);
    });
  }

  void registerMethodCallHandler(String method, MethodCallHandler handler) {
    channel_handlers[method] = handler;
  }

// 获取版本状态 true -> Release
  Future<bool?> getISBuildRelease() async {
    return channel_common.invokeMethod("getISBuildRelease");
  }

  /// 打开 code 界面
  void selectAreaCode() {
    notifyNativeEventResult("selectCountryAreaCode", {});
  }

//
  void notifyNativeEventResult(String eventType, Map arguments) {
    // 第一个参数表示 method,方法名称,原生端会解析此参数
    // 第二个参数,类型任意使用Map
    // 返回 Future, 原生端返回的数据
    channel_common.invokeMethod(
        "notifyNativeEventResult", {"type": eventType, "arguments": arguments});
  }

  Future<T?> notifyNativeEventResultT<T>(String eventType, Map arguments) {
    return channel_common.invokeMethod<T?>(
        "notifyNativeEventResult", {"type": eventType, "arguments": arguments});
  }

// 注册 监听回调
// 原生会将数据返回过来,直接取 argumets即可
  void registerOnCountryAreaCodeResultHandler(MethodCallHandler? handler) {
    channel_handlers["onCountryAreaCodeResult"] = handler;
  }
}

Flutter使用

bash 复制代码
 // 使用 NavigationChannel
Channels.common.selectAreaCode();
相关推荐
吴声子夜歌5 小时前
Vue.js——自定义指令
前端·vue.js·flutter
90后的晨仔7 小时前
《SwiftUI 高级特性第1章:自定义视图》
ios
空中海8 小时前
第二章:SwiftUI 视图基础
ios·swiftui·swift
空中海10 小时前
第七章:iOS网络与数据持久化
网络·ios
空中海11 小时前
第六章:iOS导航与路由系统
macos·ios·cocoa
liulian091611 小时前
Flutter 三方库 flutter_local_auth 的鸿蒙化适配指南
flutter·华为·学习方法·harmonyos
空中海11 小时前
第九章:iOS系统框架与能力
macos·ios·cocoa
qwfy12 小时前
瑞幸 UI 上 pub.dev 了 —— 22 个 Flutter 组件,与微信小程序版双端对齐
flutter·开源
空中海12 小时前
第三章:布局与组件系统
ios
空中海12 小时前
第八章:iOS并发编程
macos·ios·cocoa