Ver Fonte

[feat]键盘插件,处理FlutterEngine没有使用同一个,导致重复创建的问题

hezihao há 8 meses atrás
pai
commit
69a4c9393a

+ 3 - 3
android/app/src/main/kotlin/com/atmob/keyboard/AtmobApplication.kt

@@ -1,12 +1,12 @@
 package com.atmob.keyboard
 
 import android.app.Application
+import com.atmob.keyboard.config.AppConfig
 import io.flutter.embedding.engine.FlutterEngine
 import io.flutter.embedding.engine.FlutterEngineCache
 import io.flutter.embedding.engine.dart.DartExecutor
 
 class AtmobApplication : Application() {
-
     // 声明一个 FlutterEngine 实例
     lateinit var flutterEngine: FlutterEngine
 
@@ -19,7 +19,7 @@ class AtmobApplication : Application() {
             dartExecutor.executeDartEntrypoint(DartExecutor.DartEntrypoint.createDefault())
         }
 
-        // 将 FlutterEngine 添加到 FlutterEngineCache,使用指定的 engine ID 进行管理
-        FlutterEngineCache.getInstance().put("my_engine_id", flutterEngine)
+        // 将 FlutterEngine 添加到 FlutterEngineCache,使用指定的 engine ID 进行管理,MainActivity中要取回这个引擎来使用
+        FlutterEngineCache.getInstance().put(AppConfig.FLUTTER_ENGINE_ID, flutterEngine)
     }
 }

+ 13 - 3
android/app/src/main/kotlin/com/atmob/keyboard/MainActivity.kt

@@ -1,25 +1,35 @@
 package com.atmob.keyboard
 
+import android.content.Context
 import android.content.Intent
 import android.os.Handler
 import android.os.Looper
+import com.atmob.keyboard.config.AppConfig
 import com.atmob.keyboard.util.JumpAppPageUtil
 import io.flutter.embedding.android.FlutterActivity
 import io.flutter.embedding.engine.FlutterEngine
+import io.flutter.embedding.engine.FlutterEngineCache
 
 class MainActivity : FlutterActivity() {
     private val mMainHandler = Handler(Looper.getMainLooper())
 
+    /**
+     * 使用预缓存的引擎
+     */
+    override fun provideFlutterEngine(context: Context): FlutterEngine? {
+        return FlutterEngineCache.getInstance().get(AppConfig.FLUTTER_ENGINE_ID)
+    }
+
     override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
         super.configureFlutterEngine(flutterEngine)
-        mMainHandler.postDelayed({
-            JumpAppPageUtil.jumpAppPage(intent, flutterEngine)
-        }, 150)
+        // 执行路由跳转
+        JumpAppPageUtil.jumpAppPage(intent, flutterEngine)
     }
 
     override fun onNewIntent(intent: Intent) {
         super.onNewIntent(intent)
         setIntent(intent)
+        // 执行路由跳转
         flutterEngine?.let {
             JumpAppPageUtil.jumpAppPage(intent, it)
         }

+ 18 - 0
android/app/src/main/kotlin/com/atmob/keyboard/config/AppConfig.kt

@@ -0,0 +1,18 @@
+package com.atmob.keyboard.config
+
+/**
+ * App配置
+ */
+class AppConfig private constructor() {
+    companion object {
+        /**
+         * Flutter引擎Id
+         */
+        const val FLUTTER_ENGINE_ID = "my_engine_id"
+
+        /**
+         * 通道名称,和Flutter端要一一对应
+         */
+        const val FLUTTER_METHOD_CHANNEL_NAME = "keyboard_android"
+    }
+}

+ 2 - 6
android/app/src/main/kotlin/com/atmob/keyboard/util/JumpAppPageUtil.kt

@@ -1,6 +1,7 @@
 package com.atmob.keyboard.util
 
 import android.content.Intent
+import com.atmob.keyboard.config.AppConfig
 import io.flutter.embedding.engine.FlutterEngine
 import io.flutter.plugin.common.MethodChannel
 
@@ -20,11 +21,6 @@ class JumpAppPageUtil private constructor() {
         private const val KEY_ARGS = "args"
 
         /**
-         * 通道名称,和Flutter端要一一对应
-         */
-        private const val FLUTTER_METHOD_CHANNEL_NAME = "keyboard_android"
-
-        /**
          * Flutter的路由跳转方法
          */
         private const val FLUTTER_JUMP_APP_PAGE_METHOD = "jumpAppPage"
@@ -49,7 +45,7 @@ class JumpAppPageUtil private constructor() {
 
             val methodChannel = MethodChannel(
                 engine.dartExecutor.binaryMessenger,
-                FLUTTER_METHOD_CHANNEL_NAME
+                AppConfig.FLUTTER_METHOD_CHANNEL_NAME
             )
 
             methodChannel.invokeMethod(FLUTTER_JUMP_APP_PAGE_METHOD, arguments)

+ 2 - 0
plugins/keyboard_android/android/src/main/kotlin/com/atmob/keyboard_android/KeyboardAndroidPlugin.kt

@@ -45,6 +45,8 @@ class KeyboardAndroidPlugin : FlutterPlugin, MethodCallHandler {
         context = flutterPluginBinding.applicationContext
         channel = MethodChannel(flutterPluginBinding.binaryMessenger, "keyboard_android")
         channel.setMethodCallHandler(this)
+
+        LogUtil.d("KeyboardAndroidPlugin 初始化")
     }
 
     override fun onMethodCall(call: MethodCall, result: Result) {