Explorar el Código

[feat]键盘插件,抽取代码

hezihao hace 7 meses
padre
commit
09e27235a3
Se han modificado 13 ficheros con 323 adiciones y 171 borrados
  1. 11 121
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/KeyboardAndroidPlugin.kt
  2. 0 5
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/constant/PluginConfig.kt
  3. 17 3
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/FlutterEngineHolder.kt
  4. 17 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/FlutterBridgeManager.kt
  5. 1 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/IBridgeApi.kt
  6. 9 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/IExposeApi.kt
  7. 0 11
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/api/KeyboardEventApi.kt
  8. 21 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/api/KeyboardExposeApi.kt
  9. 6 1
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/callback/NativeMethodHandler.kt
  10. 7 2
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/callback/ResultCallback.kt
  11. 61 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/enums/ExposeNativeMethod.kt
  12. 147 0
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/method/KeyboardExposeNativeMethodHandler.kt
  13. 26 24
      plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/util/NativeMethodRegistry.kt

+ 11 - 121
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/KeyboardAndroidPlugin.kt

@@ -1,37 +1,21 @@
 package com.atmob.keyboard_android
 
-import android.content.Context
-import android.os.Build
 import com.atmob.keyboard_android.component.ComponentMediator
 import com.atmob.keyboard_android.component.base.interceptor.LoginRouteInterceptor
 import com.atmob.keyboard_android.component.base.interceptor.RouteInterceptorManager
 import com.atmob.keyboard_android.component.listener.ComponentUpdateLoggingListener
-import com.atmob.keyboard_android.constant.PluginConfig
-import com.atmob.keyboard_android.floating.FloatingButtonService
-import com.atmob.keyboard_android.model.KeyboardSelectModel
 import com.atmob.keyboard_android.util.AppMonitor
 import com.atmob.keyboard_android.util.ContextUtil
-import com.atmob.keyboard_android.util.FloatingWindowUtil
-import com.atmob.keyboard_android.util.InputMethodUtil
-import com.atmob.keyboard_android.util.JsonUtil
-import com.atmob.keyboard_android.util.KeyboardHolder
+import com.atmob.keyboard_android.util.FlutterEngineHolder
 import com.atmob.keyboard_android.util.LogUtil
 import com.atmob.keyboard_android.util.activity.ActivityProvider
 import com.atmob.keyboard_android.util.bridge.FlutterBridgeManager
 import io.flutter.embedding.engine.plugins.FlutterPlugin
-import io.flutter.plugin.common.MethodCall
-import io.flutter.plugin.common.MethodChannel
-import io.flutter.plugin.common.MethodChannel.MethodCallHandler
-import io.flutter.plugin.common.MethodChannel.Result
 
 /**
  * 键盘插件
  */
-class KeyboardAndroidPlugin : FlutterPlugin, MethodCallHandler {
-    private lateinit var channel: MethodChannel
-
-    private lateinit var context: Context
-
+class KeyboardAndroidPlugin : FlutterPlugin {
     companion object {
         init {
             // 伴生对象的初始化,相当于Java的静态代码块,只初始化一次
@@ -67,112 +51,18 @@ class KeyboardAndroidPlugin : FlutterPlugin, MethodCallHandler {
     }
 
     override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
-        context = flutterPluginBinding.applicationContext
-        channel = MethodChannel(
-            flutterPluginBinding.binaryMessenger,
-            PluginConfig.FLUTTER_METHOD_CHANNEL_NAME
+        FlutterEngineHolder.attachFlutterEngine(
+            flutterPluginBinding.flutterEngine
         )
-        channel.setMethodCallHandler(this)
-
-        LogUtil.d("KeyboardAndroidPlugin 初始化")
-    }
-
-    override fun onMethodCall(call: MethodCall, result: Result) {
-        LogUtil.d("Method called: ${call.method}")
-        when (call.method) {
-            "getPlatformVersion" -> {
-                result.success("Android ${Build.VERSION.RELEASE}")
-            }
-
-            // 初始化插件
-            "initPlugin" -> {
-                // 注册键盘切换监听
-                FlutterBridgeManager.registerDefaultKeyboardChangeEvent()
-                result.success(null)
-            }
-
-            // 开启或关闭悬浮窗
-            "enableFloatingWindow" -> {
-                val enable = call.argument<Boolean>("enable") == true
-                enableFloatingWindow(enable)
-                result.success(null)
-            }
-
-            // 跳转到系统的悬浮窗设置页
-            "jumpFloatingWindowSetting" -> {
-                FloatingWindowUtil.jumpFloatingWindowSetting(context)
-                result.success(null)
-            }
-
-            // 是否开启了悬浮窗权限
-            "hasFloatingWindowPermission" -> {
-                val hasPermission = FloatingWindowUtil.hasFloatingWindowPermission(context)
-                result.success(hasPermission)
-            }
-
-            // 打开输入法设置
-            "openInputMethodSettings" -> {
-                InputMethodUtil.openInputMethodSettings(context)
-                result.success(null)
-            }
-
-            // 判断指定的输入法是否启用
-            "isTargetKeyboardEnabled" -> {
-                result.success(InputMethodUtil.isTargetKeyboardEnabled(context))
-            }
-
-            // 是否是默认输入法
-            "isDefaultKeyboard" -> {
-                result.success(InputMethodUtil.isDefaultKeyboard(context))
-            }
-
-            // 更新键盘信息
-            "updateKeyboardInfo" -> {
-                val keyboardInfoJson = call.arguments<String>() ?: ""
-                val currentKeyboardInfo =
-                    JsonUtil.parseJsonByClass(keyboardInfoJson, KeyboardSelectModel::class.java)
-                KeyboardHolder.getKeyboardService()?.getKeyboardViewModel()
-                    ?.updateCurrentKeyboardInfo(currentKeyboardInfo)
-                result.success(null)
-            }
-
-            // 刷新人设列表
-            "refreshCharacterList" -> {
-                LogUtil.d("刷新人设列表")
-                KeyboardHolder.getKeyboardService()?.getKeyboardViewModel()
-                    ?.getCharacterList()
-                result.success(null)
-            }
-
-            // 登录成功\退出登录\注销账号,刷新用户数据
-            "refreshData" -> {
-                KeyboardHolder.getKeyboardService()?.getKeyboardViewModel()?.run {
-                    // 刷新数据
-                    getCurrentKeyboardInfo()
-                    getKeyboardList()
-                    getCharacterList()
-                    getPrologueList()
-                }
-            }
-
-            else -> {
-                result.notImplemented()
-            }
-        }
-    }
-
-    /**
-     * 开启或关闭悬浮窗
-     */
-    private fun enableFloatingWindow(enable: Boolean) {
-        if (enable) {
-            FloatingButtonService.start(context)
-        } else {
-            FloatingButtonService.stop(context)
-        }
+        // 暴露给Flutter的原生方法
+        FlutterBridgeManager.exposeKeyboardOptMethod()
+        LogUtil.d("KeyboardAndroidPlugin 注册到引擎,onAttachedToEngine()")
     }
 
     override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
-        channel.setMethodCallHandler(null)
+        // 取消暴露给Flutter的原生方法
+        FlutterBridgeManager.cancelExposeKeyboardOptMethod()
+        FlutterEngineHolder.detachFlutterEngine()
+        LogUtil.d("KeyboardAndroidPlugin 从引擎中注销,onDetachedFromEngine()")
     }
 }

+ 0 - 5
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/constant/PluginConfig.kt

@@ -6,11 +6,6 @@ package com.atmob.keyboard_android.constant
 interface PluginConfig {
     companion object {
         /**
-         * Flutter端引擎Id
-         */
-        const val FLUTTER_ENGINE_ID = "my_engine_id"
-
-        /**
          * MethodChannel通道名称,和Flutter端要一一对应
          */
         const val FLUTTER_METHOD_CHANNEL_NAME = "keyboard_android"

+ 17 - 3
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/FlutterEngineHolder.kt

@@ -1,17 +1,31 @@
 package com.atmob.keyboard_android.util
 
-import com.atmob.keyboard_android.constant.PluginConfig
 import io.flutter.embedding.engine.FlutterEngine
-import io.flutter.embedding.engine.FlutterEngineCache
 
 /**
  * Flutter引擎持有者
  */
 object FlutterEngineHolder {
+    private var mFlutterEngine: FlutterEngine? = null
+
+    /**
+     * 保存Flutter引擎
+     */
+    fun attachFlutterEngine(engine: FlutterEngine) {
+        this.mFlutterEngine = engine
+    }
+
+    /**
+     * 取消保存Flutter引擎
+     */
+    fun detachFlutterEngine() {
+        this.mFlutterEngine = null
+    }
+
     /**
      * 获取FlutterEngine
      */
     fun getFlutterEngine(): FlutterEngine? {
-        return FlutterEngineCache.getInstance().get(PluginConfig.FLUTTER_ENGINE_ID)
+        return mFlutterEngine
     }
 }

+ 17 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/FlutterBridgeManager.kt

@@ -6,6 +6,7 @@ import com.atmob.keyboard_android.enums.host.HostMainTab
 import com.atmob.keyboard_android.util.FlutterEngineHolder
 import com.atmob.keyboard_android.util.FlutterPageLaunchUtil
 import com.atmob.keyboard_android.util.bridge.event.DefaultKeyboardNativeEventHandler
+import com.atmob.keyboard_android.util.bridge.method.KeyboardExposeNativeMethodHandler
 import com.atmob.keyboard_android.util.bridge.model.base.EmptyResp
 import com.atmob.keyboard_android.util.bridge.model.req.SuperReplyReq
 import com.atmob.keyboard_android.util.bridge.model.req.SuperSpeakReq
@@ -18,6 +19,7 @@ import com.atmob.keyboard_android.util.bridge.model.resp.SuperReplyResp
 import com.atmob.keyboard_android.util.bridge.model.resp.SuperSpeakResp
 import com.atmob.keyboard_android.util.bridge.util.FlutterMethodCaller
 import com.atmob.keyboard_android.util.bridge.util.NativeEventRegistry
+import com.atmob.keyboard_android.util.bridge.util.NativeMethodRegistry
 
 /**
  * 交互管理器,封装原生端和Flutter端的交互方法
@@ -31,20 +33,25 @@ object FlutterBridgeManager : IBridgeApi {
     /**
      * 暴露原生方法给Flutter调用
      */
-    // private val mNativeMethodRegistry = NativeMethodRegistry()
+    private val mNativeMethodRegistry = NativeMethodRegistry()
 
     /**
      * 暴露原生事件给Flutter接收
      */
     private val mNativeEventRegistry = NativeEventRegistry()
 
+    /**
+     * 键盘原生方法
+     */
+    private val mKeyboardNativeMethodHandler = KeyboardExposeNativeMethodHandler()
+
     init {
         val flutterEngine = FlutterEngineHolder.getFlutterEngine()
         if (flutterEngine == null) {
             throw IllegalArgumentException("FlutterEngine 未找到,MethodChannel 无法初始化")
         }
         mFlutterMethodCaller.init(flutterEngine)
-        // mNativeMethodRegistry.init(flutterEngine)
+        mNativeMethodRegistry.init(flutterEngine)
         mNativeEventRegistry.init(flutterEngine)
     }
 
@@ -226,6 +233,14 @@ object FlutterBridgeManager : IBridgeApi {
         )
     }
 
+    override fun exposeKeyboardOptMethod() {
+        mNativeMethodRegistry.registerNativeMethod(mKeyboardNativeMethodHandler)
+    }
+
+    override fun cancelExposeKeyboardOptMethod() {
+        mNativeMethodRegistry.unRegisterNativeMethod(mKeyboardNativeMethodHandler)
+    }
+
     override fun registerDefaultKeyboardChangeEvent() {
         val eventChannelHandler = DefaultKeyboardNativeEventHandler()
         mNativeEventRegistry.registerNativeEvent(

+ 1 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/IBridgeApi.kt

@@ -2,11 +2,10 @@ package com.atmob.keyboard_android.util.bridge
 
 import com.atmob.keyboard_android.util.bridge.api.AiChatApi
 import com.atmob.keyboard_android.util.bridge.api.KeyboardApi
-import com.atmob.keyboard_android.util.bridge.api.KeyboardEventApi
 import com.atmob.keyboard_android.util.bridge.api.RouteJumpApi
 import com.atmob.keyboard_android.util.bridge.api.UserApi
 
 /**
  * 定义桥接交互API
  */
-interface IBridgeApi : UserApi, RouteJumpApi, KeyboardApi, AiChatApi, KeyboardEventApi
+interface IBridgeApi : UserApi, RouteJumpApi, KeyboardApi, AiChatApi, IExposeApi

+ 9 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/IExposeApi.kt

@@ -0,0 +1,9 @@
+package com.atmob.keyboard_android.util.bridge
+
+import com.atmob.keyboard_android.util.bridge.api.KeyboardExposeApi
+
+/**
+ * 定义暴露给Flutter端的API
+ */
+interface IExposeApi : KeyboardExposeApi {
+}

+ 0 - 11
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/api/KeyboardEventApi.kt

@@ -1,11 +0,0 @@
-package com.atmob.keyboard_android.util.bridge.api
-
-/**
- * 键盘事件相关Api
- */
-interface KeyboardEventApi {
-    /**
-     * 注册默认键盘切换事件
-     */
-    fun registerDefaultKeyboardChangeEvent()
-}

+ 21 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/api/KeyboardExposeApi.kt

@@ -0,0 +1,21 @@
+package com.atmob.keyboard_android.util.bridge.api
+
+/**
+ * 键盘相关暴露的Api
+ */
+interface KeyboardExposeApi {
+    /**
+     * 暴露键盘相关操作方法
+     */
+    fun exposeKeyboardOptMethod()
+
+    /**
+     * 取消暴露键盘相关操作方法
+     */
+    fun cancelExposeKeyboardOptMethod()
+
+    /**
+     * 注册默认键盘切换事件
+     */
+    fun registerDefaultKeyboardChangeEvent()
+}

+ 6 - 1
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/callback/NativeMethodHandler.kt

@@ -5,11 +5,16 @@ package com.atmob.keyboard_android.util.bridge.callback
  */
 interface NativeMethodHandler {
     /**
+     * 是否可以处理该方法
+     */
+    fun isCanHandle(methodName: String): Boolean
+
+    /**
      * 方法被Flutter调用
      *
      * @param methodName 方法名
      * @param args 方法参数
      * @param resultCallback 回调结果
      */
-    fun onMethodCall(methodName: String, args: String, resultCallback: ResultCallback)
+    fun onMethodCall(methodName: String, args: Any?, resultCallback: ResultCallback)
 }

+ 7 - 2
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/callback/ResultCallback.kt

@@ -9,10 +9,15 @@ interface ResultCallback {
      *
      * @param data 返回给Flutter端的结果数据
      */
-    fun onSuccess(data: Any)
+    fun onSuccess(data: Any?)
 
     /**
      * 回调Flutter端,处理失败
      */
-    fun onFail()
+    fun onFail(errorCode: Int, errorMsg: String)
+
+    /**
+     * 回调Flutter端,方法未找到
+     */
+    fun onMethodNotFound()
 }

+ 61 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/enums/ExposeNativeMethod.kt

@@ -0,0 +1,61 @@
+package com.atmob.keyboard_android.util.bridge.enums
+
+/**
+ * 暴露给Flutter的原生方法名
+ */
+enum class ExposeNativeMethod(val methodName: String) {
+    /**
+     * 获取平台版本
+     */
+    GET_PLATFORM_VERSION("getPlatformVersion"),
+
+    /**
+     * 初始化插件
+     */
+    INIT_PLUGIN("initPlugin"),
+
+    /**
+     * 开启或关闭悬浮窗
+     */
+    ENABLE_FLOATING_WINDOW("enableFloatingWindow"),
+
+    /**
+     * 跳转到系统的悬浮窗设置页
+     */
+    JUMP_FLOATING_WINDOW_SETTING("jumpFloatingWindowSetting"),
+
+    /**
+     * 是否开启了悬浮窗权限
+     */
+    HAS_FLOATING_WINDOW_PERMISSION("hasFloatingWindowPermission"),
+
+    /**
+     * 打开输入法设置
+     */
+    OPEN_INPUT_METHOD_SETTINGS("openInputMethodSettings"),
+
+    /**
+     * 判断指定的输入法是否启用
+     */
+    IS_TARGET_KEYBOARD_ENABLED("isTargetKeyboardEnabled"),
+
+    /**
+     * 是否是默认输入法
+     */
+    IS_DEFAULT_KEYBOARD("isDefaultKeyboard"),
+
+    /**
+     * 更新键盘信息
+     */
+    UPDATE_KEYBOARD_INFO("updateKeyboardInfo"),
+
+    /**
+     * 刷新人设列表
+     */
+    REFRESH_CHARACTER_LIST("refreshCharacterList"),
+
+    /**
+     * 登录成功\退出登录\注销账号,刷新用户数据
+     */
+    REFRESH_DATA("refreshData");
+}

+ 147 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/method/KeyboardExposeNativeMethodHandler.kt

@@ -0,0 +1,147 @@
+package com.atmob.keyboard_android.util.bridge.method
+
+import android.content.Context
+import android.os.Build
+import com.atmob.keyboard_android.floating.FloatingButtonService
+import com.atmob.keyboard_android.model.KeyboardSelectModel
+import com.atmob.keyboard_android.util.ContextUtil
+import com.atmob.keyboard_android.util.FloatingWindowUtil
+import com.atmob.keyboard_android.util.InputMethodUtil
+import com.atmob.keyboard_android.util.JsonUtil
+import com.atmob.keyboard_android.util.KeyboardHolder
+import com.atmob.keyboard_android.util.LogUtil
+import com.atmob.keyboard_android.util.bridge.FlutterBridgeManager
+import com.atmob.keyboard_android.util.bridge.callback.NativeMethodHandler
+import com.atmob.keyboard_android.util.bridge.callback.ResultCallback
+import com.atmob.keyboard_android.util.bridge.enums.ExposeNativeMethod
+
+/**
+ * 键盘,暴露给Flutter的原生方法处理器
+ */
+class KeyboardExposeNativeMethodHandler : NativeMethodHandler {
+    override fun isCanHandle(methodName: String): Boolean {
+        return true
+    }
+
+    override fun onMethodCall(
+        methodName: String,
+        args: Any?,
+        resultCallback: ResultCallback
+    ) {
+        LogUtil.d("Method called: $methodName")
+
+        val context = ContextUtil.getContext()
+
+        // 参数
+        val callArgs = if (args is String) {
+            args.toString()
+        } else if (args is Map<*, *>) {
+            JsonUtil.toJson(args)
+        } else {
+            null
+        }
+
+        when (methodName) {
+            // 获取平台版本
+            ExposeNativeMethod.GET_PLATFORM_VERSION.methodName -> {
+                resultCallback.onSuccess("${Build.VERSION.RELEASE}")
+            }
+
+            // 初始化插件
+            ExposeNativeMethod.INIT_PLUGIN.methodName -> {
+                // 注册键盘切换监听
+                FlutterBridgeManager.registerDefaultKeyboardChangeEvent()
+                resultCallback.onSuccess(null)
+            }
+
+            // 开启或关闭悬浮窗
+            ExposeNativeMethod.ENABLE_FLOATING_WINDOW.methodName -> {
+                if (callArgs == null || callArgs.isBlank()) {
+                    resultCallback.onFail(-1, "args is null")
+                    return
+                }
+                val argsMap = JsonUtil.parseJsonByClass(callArgs.toString(), Map::class.java)
+                val enable = argsMap["enable"] == true
+                enableFloatingWindow(context, enable)
+                resultCallback.onSuccess(null)
+            }
+
+            // 跳转到系统的悬浮窗设置页
+            ExposeNativeMethod.JUMP_FLOATING_WINDOW_SETTING.methodName -> {
+                FloatingWindowUtil.jumpFloatingWindowSetting(context)
+                resultCallback.onSuccess(null)
+            }
+
+            // 是否开启了悬浮窗权限
+            ExposeNativeMethod.HAS_FLOATING_WINDOW_PERMISSION.methodName -> {
+                val hasPermission = FloatingWindowUtil.hasFloatingWindowPermission(context)
+                resultCallback.onSuccess(hasPermission)
+            }
+
+            // 打开输入法设置
+            ExposeNativeMethod.OPEN_INPUT_METHOD_SETTINGS.methodName -> {
+                InputMethodUtil.openInputMethodSettings(context)
+                resultCallback.onSuccess(null)
+            }
+
+            // 判断指定的输入法是否启用
+            ExposeNativeMethod.IS_TARGET_KEYBOARD_ENABLED.methodName -> {
+                resultCallback.onSuccess(InputMethodUtil.isTargetKeyboardEnabled(context))
+            }
+
+            // 是否是默认输入法
+            ExposeNativeMethod.IS_DEFAULT_KEYBOARD.methodName -> {
+                resultCallback.onSuccess(InputMethodUtil.isDefaultKeyboard(context))
+            }
+
+            // 更新键盘信息
+            ExposeNativeMethod.UPDATE_KEYBOARD_INFO.methodName -> {
+                val keyboardInfoJson = callArgs ?: ""
+                if (keyboardInfoJson.isBlank()) {
+                    resultCallback.onSuccess(null)
+                    return
+                }
+                val currentKeyboardInfo =
+                    JsonUtil.parseJsonByClass(keyboardInfoJson, KeyboardSelectModel::class.java)
+                KeyboardHolder.getKeyboardService()?.getKeyboardViewModel()
+                    ?.updateCurrentKeyboardInfo(currentKeyboardInfo)
+                resultCallback.onSuccess(null)
+            }
+
+            // 刷新人设列表
+            ExposeNativeMethod.REFRESH_CHARACTER_LIST.methodName -> {
+                LogUtil.d("刷新人设列表")
+                KeyboardHolder.getKeyboardService()?.getKeyboardViewModel()
+                    ?.getCharacterList()
+                resultCallback.onSuccess(null)
+            }
+
+            // 登录成功\退出登录\注销账号,刷新用户数据
+            ExposeNativeMethod.REFRESH_DATA.methodName -> {
+                KeyboardHolder.getKeyboardService()?.getKeyboardViewModel()?.run {
+                    // 刷新数据
+                    getCurrentKeyboardInfo()
+                    getKeyboardList()
+                    getCharacterList()
+                    getPrologueList()
+                }
+                resultCallback.onSuccess(null)
+            }
+
+            else -> {
+                resultCallback.onMethodNotFound()
+            }
+        }
+    }
+
+    /**
+     * 开启或关闭悬浮窗
+     */
+    private fun enableFloatingWindow(context: Context, enable: Boolean) {
+        if (enable) {
+            FloatingButtonService.start(context)
+        } else {
+            FloatingButtonService.stop(context)
+        }
+    }
+}

+ 26 - 24
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/util/bridge/util/NativeMethodRegistry.kt

@@ -1,22 +1,21 @@
 package com.atmob.keyboard_android.util.bridge.util
 
 import com.atmob.keyboard_android.constant.PluginConfig
-import com.atmob.keyboard_android.util.JsonUtil
 import com.atmob.keyboard_android.util.bridge.callback.NativeMethodHandler
 import com.atmob.keyboard_android.util.bridge.callback.ResultCallback
 import io.flutter.embedding.engine.FlutterEngine
 import io.flutter.plugin.common.MethodCall
 import io.flutter.plugin.common.MethodChannel
-import java.util.concurrent.ConcurrentHashMap
+import java.util.concurrent.CopyOnWriteArrayList
 
 /**
  * 原生端方法注册表,提供方法给Flutter端
  */
 class NativeMethodRegistry {
     /**
-     * 注册表
+     * 方法注册
      */
-    private val mMethodMap = ConcurrentHashMap<String, NativeMethodHandler>()
+    private val mMethodList = CopyOnWriteArrayList<NativeMethodHandler>()
 
     /**
      * 用于与 Flutter 端通信的 MethodChannel
@@ -36,38 +35,41 @@ class NativeMethodRegistry {
             // 方法名
             val methodName = call.method
             // 方法参数
-            val callArgs: Any = call.arguments
-            val args = if (callArgs is String) {
-                callArgs
-            } else {
-                val argMap: Map<*, *> = call.arguments<Map<*, *>>() ?: mapOf<Any, Any>()
-                JsonUtil.toJson(argMap)
-            }
-            // 通过方法名,查找到方法处理器
-            val nativeMethodHandler = mMethodMap[methodName]
-            nativeMethodHandler?.onMethodCall(methodName, args, object : ResultCallback {
-                override fun onSuccess(data: Any) {
-                    result.success(data)
-                }
+            val callArgs: Any? = call.arguments
+            // 查找到方法处理器
+            for (methodHandler in mMethodList) {
+                if (methodHandler.isCanHandle(methodName)) {
+                    methodHandler.onMethodCall(methodName, callArgs, object : ResultCallback {
+                        override fun onSuccess(data: Any?) {
+                            result.success(data)
+                        }
+
+                        override fun onFail(errorCode: Int, errorMsg: String) {
+                            result.error(errorCode.toString(), errorMsg, null)
+                        }
 
-                override fun onFail() {
-                    result.error("-1", "error", null)
+                        override fun onMethodNotFound() {
+                            result.notImplemented()
+                        }
+                    })
                 }
-            })
+            }
         }
     }
 
     /**
      * 注册原生方法
      */
-    fun registerNativeMethod(methodName: String, methodHandler: NativeMethodHandler) {
-        mMethodMap[methodName] = methodHandler
+    fun registerNativeMethod(methodHandler: NativeMethodHandler) {
+        if (!mMethodList.contains(methodHandler)) {
+            mMethodList.add(methodHandler)
+        }
     }
 
     /**
      * 取消注册原生方法
      */
-    fun unRegisterNativeMethod(methodName: String) {
-        mMethodMap.remove(methodName)
+    fun unRegisterNativeMethod(methodHandler: NativeMethodHandler) {
+        mMethodList.remove(methodHandler)
     }
 }