From 54eae37038a9d3f64afbc9bc243dea207e85cae6 Mon Sep 17 00:00:00 2001 From: fufesou <13586388+fufesou@users.noreply.github.com> Date: Mon, 9 Feb 2026 00:36:25 +0800 Subject: [PATCH] fix(ios): workaround physical keyboard after virtual keyboard hidden (#14207) Signed-off-by: fufesou --- flutter/lib/mobile/pages/remote_page.dart | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/flutter/lib/mobile/pages/remote_page.dart b/flutter/lib/mobile/pages/remote_page.dart index 1850f2093..9c8ffed65 100644 --- a/flutter/lib/mobile/pages/remote_page.dart +++ b/flutter/lib/mobile/pages/remote_page.dart @@ -68,6 +68,7 @@ class _RemotePageState extends State with WidgetsBindingObserver { double _viewInsetsBottom = 0; final _uniqueKey = UniqueKey(); Timer? _timerDidChangeMetrics; + Timer? _iosKeyboardWorkaroundTimer; final _blockableOverlayState = BlockableOverlayState(); @@ -140,6 +141,7 @@ class _RemotePageState extends State with WidgetsBindingObserver { await gFFI.close(); _timer?.cancel(); _timerDidChangeMetrics?.cancel(); + _iosKeyboardWorkaroundTimer?.cancel(); gFFI.dialogManager.dismissAll(); await SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: SystemUiOverlay.values); @@ -206,6 +208,21 @@ class _RemotePageState extends State with WidgetsBindingObserver { gFFI.ffiModel.pi.version.isNotEmpty) { gFFI.invokeMethod("enable_soft_keyboard", false); } + + // Workaround for iOS: physical keyboard input fails after virtual keyboard is hidden + // https://github.com/flutter/flutter/issues/39900 + // https://github.com/rustdesk/rustdesk/discussions/11843#discussioncomment-13499698 - Virtual keyboard issue + if (isIOS) { + _iosKeyboardWorkaroundTimer?.cancel(); + _iosKeyboardWorkaroundTimer = Timer(Duration(milliseconds: 100), () { + if (!mounted) return; + _physicalFocusNode.unfocus(); + _iosKeyboardWorkaroundTimer = Timer(Duration(milliseconds: 50), () { + if (!mounted) return; + _physicalFocusNode.requestFocus(); + }); + }); + } } else { _timer?.cancel(); _timer = Timer(kMobileDelaySoftKeyboardFocus, () {