mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
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:
parent
02d5286e02
commit
8d955cdd64
@ -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!);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user