• 用pigeon kotlin swift写一个自己的插件


    1. 创建一个flutter plugin项目
    2. 引入依赖

    pigeon: ^18.0.0

    3. 创建pigeons文件夹和message.dart
    import 'package:pigeon/pigeon.dart';
    
    
    // 输出配置
    // 控制台执行:dart  run pigeon --input pigeons/message.dart
    (PigeonOptions(
      dartOut: './lib/messages.g.dart',
      dartPackageName: 'base_plugin',
      kotlinOut: 'android/src/main/kotlin/com/app/base_plugin/Messages.g.kt',
      kotlinOptions: KotlinOptions(
        // copyrightHeader: ['zero'],
        package: 'com.app.base_plugin',
      ),
      swiftOut: 'ios/Classes/Messages.g.swift',
      swiftOptions: SwiftOptions(),
    ))
    ()
    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);
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    4. 执行生成各个平台文件的命令

    dart run pigeon --input pigeons/message.dart

    5. base_plugin.dart
    import 'messages.g.dart';
    
    class BasePlugin {
      static final HostMessageApi _api = HostMessageApi();
      static Future<String>  flutter2Native(String message, int type) async {
        return await _api.flutter2Native(message, type);
      }
      static Future<String>  flutter2NativeAsync(String message, int type) async {
        return await _api.flutter2NativeAsync(message, type);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    6. BasePlugin.kt
    package com.app.base_plugin
    
    import androidx.annotation.NonNull
    import com.app.base_plugin.FlutterMessageApi
    import com.app.base_plugin.HostMessageApi
    import io.flutter.embedding.engine.plugins.FlutterPlugin
    
    
    /** BasePlugin */
    class BasePlugin: 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 flutterMessageApi: FlutterMessageApi
        override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
            print("onAttachedToEngine")
            HostMessageApi.setUp(flutterPluginBinding.binaryMessenger, this)
            flutterMessageApi = FlutterMessageApi(flutterPluginBinding.binaryMessenger)
        }
    
        override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
            HostMessageApi.setUp(binding.binaryMessenger, null)
        }
    
        override fun flutter2Native(message: String, type: Long): String {
            print("flutter2Native=message=$message=type=$type")
            flutterMessageApi.native2Flutter("111", callback = {
                print("1111")
            }, typeArg = 1)
            return message
        }
    
        override fun flutter2NativeAsync(
            message: String,
            type: Long,
            callback: (Result<String>) -> Unit
        ) {
            fun  d(e:Result<String>){
                print("d")
            }
            print("flutter2NativeAsync=message=$message=type=$type")
            flutterMessageApi.native2FlutterAsync("2222", callback = {
                print("222")
            }, typeArg = 2)
            callback(Result.success("flutter2NativeAsync=message=$message=type=$type"));
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    7. BasePlugin.swift
    import Flutter
    import UIKit
    
    public class BasePlugin: NSObject, FlutterPlugin,HostMessageApi {
        
        private static var flutterAPI: FlutterMessageApi? = nil
        public static func register(with registrar: any FlutterPluginRegistrar) {
            let api = BasePlugin()
            HostMessageApiSetup.setUp(binaryMessenger: registrar.messenger(), api: api)
            flutterAPI = FlutterMessageApi(binaryMessenger: registrar.messenger())
        }
        
        func flutter2Native(message: String, type: Int64) throws -> String {
            print("ios->flutter2NativeMessage===="+message);
            return "ios->flutter2Native=message=\(message)=type=\(type)"
        }
        
        func flutter2NativeAsync(message: String, type: Int64, completion: @escaping (Result<String, any Error>) -> Void) {
            print("ios->flutter2NativeAsyncMessage===2")
            completion(.success(message))
        }
    
        
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    8. 遇到的问题

    Parse Issue (Xcode): Module ‘base_plugin’ not found

    1. 删除ios文件下面的podfile和podfile.lock
    2. Messages.g.swift 和BasePlugin.swift 要放到Classes下面

    Pigeon: error: type ‘FlutterError’ does not conform to protocol ‘Error’

    1. 在Messages.g.swift中添加extension FlutterError: Swift.Error {}
    9. 源码
  • 相关阅读:
    stm32flymcu烧写几次后就超时无应答,如何解决?
    【微信小程序】小程序使用详细教程(建议收藏)
    【Python】四、程序顺序和分支控制结构
    【码蹄集新手村600题】判断一个数字是否为完全平方数
    计算机网络-网络层(移动IP通信过程,网络层设备路由器,路由表与路由转发)
    Lock和synchronized的区别
    ES6中set()和map()数据结构
    webpack常见的loader和plugins,及它们各自作用机制
    windows7中安装docker
    【生物信息学】基因差异分析Deg(数据读取、数据处理、差异分析、结果可视化)
  • 原文地址:https://blog.csdn.net/yujunlong3919/article/details/137935491