diff --git a/packages/flutter/lib/src/widgets/focus_manager.dart b/packages/flutter/lib/src/widgets/focus_manager.dart index f27293118f3..7f825a4a508 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 09cf1800841..93081058617 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; }