Flutter和Native 通信 pigeon

2023-05-16

文章目录

          • 1. pigeon
          • 2. 定义接口
          • 3.定义sh文件 pigeon.sh(lib同级目录创建)
          • 4. 运行sh文件 pigeon.sh 会生成一下文件
          • 5. 配置
          • 6. 使用
          • 7. IOS xxx_plugin.h
          • 8. XxxPlugin.swift

1. pigeon

Pigeon 是一个代码生成器工具,用于使 Flutter 和宿主平台之间的通信类型安全、更轻松、更快捷
pub地址

2. 定义接口

创建pigeons/message.dart(lib同级目录创建)

import 'package:pigeon/pigeon.dart';


// 输出配置
// 控制台执行:flutter pub run pigeon --input pigeons/message.dart
(PigeonOptions(
  dartOut: './lib/message.dart',
  kotlinOut: 'android/src/main/kotlin/com/app/xxx_plugin/Message.kt',
  kotlinOptions: KotlinOptions(
    // copyrightHeader: ['zero'],
    package: 'com.app.xxx_plugin',
  ),
  objcHeaderOut: 'ios/Classes/Message.h',
  objcSourceOut: 'ios/Classes/Message.m',
))
()
abstract class HostMessageApi {
  String flutter2Native(String message, int type);

  
  String flutter2NativeAsync(String message, int type);
}

()
abstract class FlutterMessageApi {
  String native2Flutter(String message, int type);

  
  String native2FlutterAsync(String message, int type);
}


3.定义sh文件 pigeon.sh(lib同级目录创建)

java_package 目录可以随便填写, 目录如果创建失败 就手动创建目录

flutter pub run pigeon \
  --input pigeons/message.dart \
  --dart_out lib/pigeon.dart \
  --objc_header_out ios/Runner/pigeon.h \
  --objc_source_out ios/Runner/pigeon.m \
  --experimental_swift_out ios/Runner/Pigeon.swift \
  --java_out ./android/app/src/main/java/io/flutter/plugins/Pigeon.java \
  --java_package "io.flutter.plugins"
4. 运行sh文件 pigeon.sh 会生成一下文件

android/app/src/main/java/io/flutter/plugins/Pigeon.java
ios/Runner/pigeon.h

5. 配置

package com.app.xxx_plugin

import android.util.Log
import androidx.annotation.NonNull
import io.flutter.embedding.engine.plugins.FlutterPlugin


/** XxxPlugin */
class XxxPlugin : FlutterPlugin, HostMessageApi {
    /// The MethodChannel that will the communication between Flutter and native Android
    ///
    /// This local reference serves to register the plugin with the Flutter Engine and unregister it
    /// when the Flutter Engine is detached from the Activity


    private lateinit var nativeMessage: FlutterMessageApi

    override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
        HostMessageApi.setUp(flutterPluginBinding.binaryMessenger, this)
        nativeMessage = FlutterMessageApi(flutterPluginBinding.binaryMessenger)
    }


    override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {

    }

    override fun flutter2Native(message: String, type: Long): String {
        print("flutter2Native=message=$message=type=$type")
       
        return "$message"

    }

    override fun flutter2NativeAsync(
        message: String,
        type: Long,
        callback: (Result<String>) -> Unit
    ) {
        print("flutter2NativeAsync=message=$message=type=$type")
        callback(Result.success("flutter2NativeAsync=message=$message=type=$type"));

    }
}


6. 使用
import 'package:xxx_plugin/message.dart';

class XxxPlugin extends FlutterMessageApi {
  static final HostMessageApi _flutterMessage = HostMessageApi();

  factory XxxPlugin() => _getInstance();

  static XxxPlugin get instance => _getInstance();

  static XxxPlugin ? _instance;

  static XxxPlugin _getInstance() {
    _instance ??= XxxPlugin._internal();
    FlutterMessageApi.setup(_instance);

    return _instance!;
  }

  XxxPlugin._internal();

  ///flutter发送消息给原生
  Future<String> flutter2Native(String message,int type) {
    return _flutterMessage.flutter2Native(message, type);
  }

  Future<String> flutter2NativeAsync(String message,int type) {
    return _flutterMessage.flutter2NativeAsync(message, type);
  }

  
  String native2Flutter(String message, int type) {
    print('message=$message = type=$type');
    return 'native2Flutter=message=$message = type=$type';
  }

  
  Future<String> native2FlutterAsync(String message, int type) {
    print('message=$message = type=$type');
    return Future(() => 'native2Flutter=message=$message = type=$type');
  }
}


await HostMessageApi().flutter2Native('111111', 2);

7. IOS xxx_plugin.h
#import "Message.h"
8. XxxPlugin.swift
import Flutter
import UIKit

public class XxxPlugin: NSObject, FlutterPlugin,HostMessageApi {

       public func flutter2NativeMessage(_ message: String, type: NSNumber, error: AutoreleasingUnsafeMutablePointer<FlutterError?>) -> String? {

                    print("ios->flutter2NativeMessage===="+message);
                   return "ios->flutter2Native=message=\(message)=type=\(type)"
         }

        public func flutter2NativeAsyncMessage(_ message: String, type: NSNumber, completion: @escaping (String?, FlutterError?) -> Void) {

                   print("ios->flutter2NativeAsyncMessage===2");

                   completion(message,nil)
         }

    public var nativeMessage:FlutterMessageApi!
    public static func register(with registrar: FlutterPluginRegistrar) {
        let messenger: FlutterBinaryMessenger = registrar.messenger()
        let api = XxxPlugin.init()
        HostMessageApiSetup(messenger, api)
        api.nativeMessage = FlutterMessageApi(binaryMessenger: messenger)
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter和Native 通信 pigeon 的相关文章

随机推荐

  • C++获取含有中文的字符串长度

    在Windows下 xff0c 中文字符在C 43 43 中的内存占用为2字节 xff0c 此时采用字符串长度获取函数得到的结果会将一个中文字符识别为两个长度 xff1a include lt stdio h gt include lt s
  • IOS中自定义cell大小的两种方法

    第一种 xff1a 自定义cell xff0c 不用xib的 xff0c 用已经封装好的类Category m类 第一步 xff1a label 的自定义高度 xff0c 用的是 xff08 封装好的方法 xff09 根据 label 中的
  • mysql的2003-Can‘t connect to MySQL server on ‘localhost‘(10061“Unknown error“)错误解决方法

    在我们对mysql的数据库进行连接时出现2003 Can 39 t connect to MySQL server on 39 localhost 39 10061 34 Unknown error 34 的错误 xff0c 截图如下 xf
  • python实现朗读内容

    项目描述 pyttsx3 是 Python 中的文本到语音转换库 与替代库不同 xff0c 它可以脱机工作 xff0c 并且与Python 2和3兼容 pyttsx3 的官网pyttsx3 皮皮 pypi org https pypi or
  • python计算圆的面积

    提示 xff1a 笔记希望对你有帮助 文章目录 前言1 事先准备2 代码书写3 代码运行总结 前言 提示 xff1a 本次我们的代码的是通过pycharm实现的 下面让我们使用python对我们的圆的面积以及周长进行一个简单的计算 1 事先
  • Windows环境下edge浏览器点击下载没有反应

    项目场景 xff1a 系统 xff1a windows 11 家庭中文版 浏览器 xff1a Microsoft Edge版本 104 0 1293 54 正式版本 64 位 问题描述 edge浏览器点击下载没有反应 原因分析 xff1a
  • python怎么查看安装了哪些库

    这里写目录标题 前言方法1方法2 前言 有时候我们在使用python的时候 xff0c 想知道自己安装哪些了第三方库以及第三方库的版本 xff0c 下面来介绍一下方法 方法1 我们可以通过命令提示符输入相关的命令进行查看 xff0c 命令如
  • python 安装dmPython

    文章目录 前言下载达梦数据库安装dmPython模块引用模块解决方法 代码演示 前言 使用python连接我们的连接达梦数据库 下载达梦数据库 达梦数据库的官网链接 达梦数据库的下载链接 安装dmPython模块 找到达梦数据库的安装目录
  • python requests cookie的获取和使用

    文章目录 前言一 cookie是什么 xff1f 二 使用步骤开始代码实现会话是什么然后写入我们的账号信息 使用session访问登陆账号的url获取账号的书架上的数据 完整的代码补充比较暴力的获取方式 前言 我们在使用爬虫中会用到很多账号
  • pyspark报错 org.apache.spark.SparkException: Python worker failed to connect back.

    项目场景 xff1a 使用pycharm工具将spark分析完的数据存储到MySQL数据库中 问题描述 在程序执行过程中发生以下报错 xff1a org span class token punctuation span apache sp
  • python的tkinter(图形用户界面)

    目录标题 什么是图形用户界面 xff08 GUI xff09 Tinter函数和参数说明 xff08 常用 xff09 Lable 标签 xff1a 效果Button 按钮 效果 Entry 文本框 效果 Text xff08 多行文本框
  • K8s配置文档

    xff01 xff01 xff01 xff01 xff01 xff01 如果看不懂文档点击进入视频k8s配置视频 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff
  • 安装spark

    安装spark 上传安装包文件 spark 2 1 1 bin hadoop2 7 解压安装包 span class token function tar span xvf spark 2 1 1 bin hadoop2 7 C opt m
  • 人大金仓数据库的简单巡查

    人大金仓的简单巡查 查询人大金仓的版本 sys ctl V sys ctl version span class token comment 在ksql命令行工具中查询数据库版本 span span class token keyword
  • 人大金仓数据库的单表查询

    人大金仓数据库的单表查询 查看表的内容 span class token comment 查询数据库的创建语句 span d exam span class token punctuation span course span class
  • JWT和Security 登录权限判断和token访问和让token失效

    文章目录 Spring SecurityJWT无状态的单点登录流程用到的方法configure HttpSecurity http 登录 authenticationSuccessHandler loadUserByUsername 通过t
  • Flutter Container设置 width 无效

    文章目录 布局组件和容器组件BoxContraints机制布局组件 Row Column解决办法参考 布局组件和容器组件 容器类Widget和布局类Widget都作用于其子Widget xff0c 不同的是 xff1a 布局类Widget一
  • Flutter 滚动距离来设置TabBar的位置,点击TabBar滚动的到指定的位置

    文章目录 效果gif定义属性每个组件设置Key获取控件的距离顶部的位置设置监听设置TabBar 点击getY源码 感觉有用的话 xff0c star一下如果想一起学习进步 QQ群766903559 效果gif 定义属性 ScrollCont
  • solidity create2 学习

    文章目录 saltcreatecreate2address this clone factoryshr shl使用 两个值生成唯一的值 xff0c 通过唯一值获取对应的两个值 salt nonce 也可以自己生成 create addres
  • Flutter和Native 通信 pigeon

    文章目录 1 pigeon2 定义接口3 定义sh文件 pigeon sh xff08 lib同级目录创建 xff09 4 运行sh文件 pigeon sh 会生成一下文件5 配置6 使用7 IOS xxx plugin h8 XxxPlu