From 8d955cdd644edd089d5545e83615d68b01d62c1c Mon Sep 17 00:00:00 2001 From: Nate Date: Thu, 23 May 2024 10:40:45 -0600 Subject: [PATCH] Update `FocusManager` platform check to include iOS (#148612) Both iOS and Android run into issues when the FocusManager starts responding to app lifecycle changes. Fortunately, this feature is primarily meant for desktop platforms, so the problem can be resolved with a platform check. fixes https://github.com/flutter/flutter/issues/148475 --- .../flutter/lib/src/widgets/focus_manager.dart | 13 +++++++++++-- .../test/widgets/focus_manager_test.dart | 18 +++++++++++++----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/packages/flutter/lib/src/widgets/focus_manager.dart b/packages/flutter/lib/src/widgets/focus_manager.dart index f27293118f3b1..7f825a4a50855 100644 --- a/packages/flutter/lib/src/widgets/focus_manager.dart +++ b/packages/flutter/lib/src/widgets/focus_manager.dart @@ -1532,12 +1532,21 @@ class FocusManager with DiagnosticableTreeMixin, ChangeNotifier { if (kFlutterMemoryAllocationsEnabled) { ChangeNotifier.maybeDispatchObjectCreation(this); } - if (kIsWeb || defaultTargetPlatform != TargetPlatform.android) { + final bool shouldListenToAppLifecycle = switch (defaultTargetPlatform) { + TargetPlatform.android || TargetPlatform.iOS => false, + TargetPlatform.fuchsia || TargetPlatform.linux => true, + TargetPlatform.windows || TargetPlatform.macOS => true, + }; + if (shouldListenToAppLifecycle) { // It appears that some Android keyboard implementations can cause // app lifecycle state changes: adding this listener would cause the // text field to unfocus as the user is trying to type. // - // Until this is resolved, we won't be adding the listener to Android apps. + // Additionally, on iOS, input fields aren't automatically populated + // with relevant data when using autofill. + // + // Until these are resolved, we won't be adding the listener to mobile platforms. + // https://github.com/flutter/flutter/issues/148475#issuecomment-2118407411 // https://github.com/flutter/flutter/pull/142930#issuecomment-1981750069 _appLifecycleListener = _AppLifecycleListener(_appLifecycleChange); WidgetsBinding.instance.addObserver(_appLifecycleListener!); diff --git a/packages/flutter/test/widgets/focus_manager_test.dart b/packages/flutter/test/widgets/focus_manager_test.dart index 09cf18008417b..930810586178a 100644 --- a/packages/flutter/test/widgets/focus_manager_test.dart +++ b/packages/flutter/test/widgets/focus_manager_test.dart @@ -354,9 +354,13 @@ void main() { logs.clear(); }, variant: KeySimulatorTransitModeVariant.all()); - testWidgets('FocusManager ignores app lifecycle changes on Android.', (WidgetTester tester) async { - final bool shouldRespond = kIsWeb || defaultTargetPlatform != TargetPlatform.android; - if (shouldRespond) { + testWidgets('FocusManager ignores app lifecycle changes on Android and iOS.', (WidgetTester tester) async { + final bool shouldListenToAppLifecycle = switch (defaultTargetPlatform) { + TargetPlatform.android || TargetPlatform.iOS => false, + TargetPlatform.fuchsia || TargetPlatform.linux => true, + TargetPlatform.windows || TargetPlatform.macOS => true, + }; + if (shouldListenToAppLifecycle) { return; } @@ -387,8 +391,12 @@ void main() { }); testWidgets('FocusManager responds to app lifecycle changes.', (WidgetTester tester) async { - final bool shouldRespond = kIsWeb || defaultTargetPlatform != TargetPlatform.android; - if (!shouldRespond) { + final bool shouldListenToAppLifecycle = switch (defaultTargetPlatform) { + TargetPlatform.android || TargetPlatform.iOS => false, + TargetPlatform.fuchsia || TargetPlatform.linux => true, + TargetPlatform.windows || TargetPlatform.macOS => true, + }; + if (!shouldListenToAppLifecycle) { return; }