Przeglądaj źródła

[feat]键盘插件,添加拦截器功能

hezihao 8 miesięcy temu
rodzic
commit
5741efd345

+ 26 - 4
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/RouteComponent.kt

@@ -2,6 +2,9 @@ package com.atmob.keyboard_android.component.base
 
 import android.content.Context
 import android.util.AttributeSet
+import com.atmob.keyboard_android.component.base.interceptor.InterceptorCallback
+import com.atmob.keyboard_android.component.base.interceptor.RouteCallback
+import com.atmob.keyboard_android.component.base.interceptor.RouteInterceptorManager
 
 /**
  * 带路由功能的组件
@@ -16,7 +19,8 @@ class RouteComponent @JvmOverloads constructor(
      */
     fun <T : IUIComponent> routeChildComponent(
         targetComponentClass: Class<T>,
-        mutex: Boolean = false
+        mutex: Boolean = false,
+        routeCallback: RouteCallback? = null
     ) {
         // 获取所有直接子组件
         val directChildComponentList = getDirectChildComponentList()
@@ -27,7 +31,7 @@ class RouteComponent @JvmOverloads constructor(
             targetComponentClass.isInstance(it)
         }
 
-        if (targetComponent != null) {
+        val routeAction = {
             // 找到兄弟组件
             if (mutex) {
                 val siblingComponentList = directChildComponentList.filter {
@@ -39,9 +43,27 @@ class RouteComponent @JvmOverloads constructor(
                 }
             }
             // 将自己的层级,移动到父View的最顶层,从而覆盖住兄弟组件
-            targetComponent.asView().parent.bringChildToFront(targetComponent.asView())
+            targetComponent?.asView()?.parent?.bringChildToFront(targetComponent.asView())
             // 再显示自己
-            targetComponent.show()
+            targetComponent?.show()
+        }
+
+        // 找不到目标组件,路由失败
+        if (targetComponent == null) {
+            routeCallback?.onLost()
+        } else {
+            // 找到目标组件,路由前,执行路由拦截器
+            RouteInterceptorManager.executeInterceptors(object : InterceptorCallback {
+                override fun onContinue() {
+                    // 拦截器放行,继续路由
+                    routeAction.invoke()
+                }
+
+                override fun onInterrupt(error: Throwable) {
+                    // 路由被拦截器拦截了,回调外部
+                    routeCallback?.onInterrupt()
+                }
+            })
         }
     }
 }

+ 17 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/interceptor/DefaultRouteInterceptor.kt

@@ -0,0 +1,17 @@
+package com.atmob.keyboard_android.component.base.interceptor
+
+/**
+ * 默认拦截器
+ */
+class DefaultRouteInterceptor : IRouteInterceptor {
+    override fun onInit() {
+    }
+
+    override fun onUnInit() {
+    }
+
+    override fun doProcess(callback: InterceptorCallback) {
+        // 默认放行
+        callback.onContinue()
+    }
+}

+ 23 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/interceptor/IRouteInterceptor.kt

@@ -0,0 +1,23 @@
+package com.atmob.keyboard_android.component.base.interceptor
+
+/**
+ * 路由拦截器接口
+ */
+interface IRouteInterceptor {
+    /**
+     * 初始化,只会调用一次
+     */
+    fun onInit()
+
+    /**
+     * 反初始化,取消注册时调用
+     */
+    fun onUnInit()
+
+    /**
+     * 拦截器的处理方法
+     *
+     * @param callback 拦截器回调
+     */
+    fun doProcess(callback: InterceptorCallback)
+}

+ 16 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/interceptor/InterceptorCallback.kt

@@ -0,0 +1,16 @@
+package com.atmob.keyboard_android.component.base.interceptor
+
+/**
+ * 拦截器回调
+ */
+interface InterceptorCallback {
+    /**
+     * 放行
+     */
+    fun onContinue()
+
+    /**
+     * 拦截
+     */
+    fun onInterrupt(error: Throwable)
+}

+ 21 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/interceptor/RouteCallback.kt

@@ -0,0 +1,21 @@
+package com.atmob.keyboard_android.component.base.interceptor
+
+/**
+ * 路由跳转回调
+ */
+interface RouteCallback {
+    /**
+     * 路由跳转成功
+     */
+    fun onFound()
+
+    /**
+     * 路由跳转被拦截了
+     */
+    fun onInterrupt()
+
+    /**
+     * 路由跳转失败
+     */
+    fun onLost()
+}

+ 44 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/component/base/interceptor/RouteInterceptorManager.kt

@@ -0,0 +1,44 @@
+package com.atmob.keyboard_android.component.base.interceptor
+
+/**
+ * 路由拦截器管理器
+ */
+class RouteInterceptorManager {
+    companion object {
+        private val interceptors = mutableListOf<IRouteInterceptor>()
+
+        init {
+            interceptors.add(DefaultRouteInterceptor())
+        }
+
+        /**
+         * 注册,路由拦截器
+         *
+         * @param interceptor 路由拦截器
+         */
+        fun registerInterceptor(interceptor: IRouteInterceptor) {
+            interceptors.add(interceptor)
+            interceptor.onInit()
+        }
+
+        /**
+         * 取消注册,路由拦截器
+         */
+        fun unRegisterInterceptor(interceptor: IRouteInterceptor) {
+            if (interceptors.remove(interceptor)) {
+                interceptor.onUnInit()
+            }
+        }
+
+        /**
+         * 执行路由拦截器
+         *
+         * @param callback 拦截器回调
+         */
+        fun executeInterceptors(callback: InterceptorCallback) {
+            for (interceptor in interceptors) {
+                interceptor.doProcess(callback)
+            }
+        }
+    }
+}