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
This commit is contained in:
Nate 2024-05-23 10:40:45 -06:00 committed by GitHub
parent 02d5286e02
commit 8d955cdd64
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 24 additions and 7 deletions

View File

@ -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!);

View File

@ -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;
}