diff --git a/android/src/main/kotlin/com/example/external_display/ExternalDisplayPlugin.kt b/android/src/main/kotlin/com/example/external_display/ExternalDisplayPlugin.kt index 6a77e08..625e35a 100644 --- a/android/src/main/kotlin/com/example/external_display/ExternalDisplayPlugin.kt +++ b/android/src/main/kotlin/com/example/external_display/ExternalDisplayPlugin.kt @@ -42,6 +42,8 @@ class ExternalDisplayPlugin: FlutterPlugin, MethodCallHandler, StreamHandler, Ac private lateinit var eventChannel : EventChannel private lateinit var context: Context private lateinit var displayManager : DisplayManager + private val activePresentations = mutableMapOf() + private val activeEngines = mutableMapOf() // 處理監控插入和拔出外部顯示器 private val displayListener = object : DisplayManager.DisplayListener { @@ -93,18 +95,15 @@ class ExternalDisplayPlugin: FlutterPlugin, MethodCallHandler, StreamHandler, Ac "connect" -> { if (displayManager.displays.size > 1 && context != null) { val args = JSONObject("${call.arguments}") - var routeName: String = args.getString("routeName") - var displayId: Int = args.getInt("targetScreen") - if (routeName == "null") { - routeName = "externalView" - } + var routeName: String = args.optString("routeName", "externalView") + var displayId: Int? = args.optInt("targetScreen", -1) var display: Display? = null - if (displayId > 0) { + if (displayId != null && displayId > 0) { display = displayManager.getDisplay(displayId) } - if (display == null) { - displayId = displayManager.displays.last().displayId - display = displayManager.getDisplay(displayManager.displays.last().displayId) + if (display == null && displayManager.displays.isNotEmpty()) { + display = displayManager.displays.last() + displayId = display.displayId } if (display != null) { val flutterEngine : FlutterEngine @@ -119,7 +118,14 @@ class ExternalDisplayPlugin: FlutterPlugin, MethodCallHandler, StreamHandler, Ac flutterEngine.dartExecutor.executeDartEntrypoint(entrypoint) flutterEngine.lifecycleChannel.appIsResumed() + flutterEngine.platformViewsController.attach( + context, + flutterEngine.renderer, + flutterEngine.dartExecutor + ) + FlutterEngineCache.getInstance().put(routeName, flutterEngine) + activeEngines[routeName] = flutterEngine } else { flutterEngine = FlutterEngineCache.getInstance().get(routeName) as FlutterEngine } @@ -148,6 +154,7 @@ class ExternalDisplayPlugin: FlutterPlugin, MethodCallHandler, StreamHandler, Ac val presentation = Presentation(context, display) presentation.setContentView(view) presentation.show() + activePresentations[routeName] = presentation result.success(resolution) return @@ -155,7 +162,21 @@ class ExternalDisplayPlugin: FlutterPlugin, MethodCallHandler, StreamHandler, Ac result.success(false) } } + + "disconnect" -> { + val args = JSONObject("${call.arguments}") + val routeName = args.optString("routeName", "externalView") + + val presentation = activePresentations.remove(routeName) + presentation?.dismiss() + val engine = activeEngines.remove(routeName) + if (engine != null) { + engine.destroy() + FlutterEngineCache.getInstance().remove(routeName) + } + result.success(true) + } // 等候外部顯示器可以接收參數 "waitingTransferParametersReady" -> { val handler = Handler(Looper.getMainLooper()) diff --git a/lib/external_display.dart b/lib/external_display.dart index cd0a242..a13c2de 100644 --- a/lib/external_display.dart +++ b/lib/external_display.dart @@ -83,6 +83,12 @@ class ExternalDisplay { } } + /// 斷開外接顯示器 + Future disconnect({String? routeName}) async { + await _displayController + .invokeMethod('disconnect', {"routeName": routeName}); + } + /// 等候外部顯示器可以接收參數 Future waitingTransferParametersReady( {required Function() onReady, Function()? onError}) async {