TextField.autofocus should skip the element that never layout (#87109)
diff --git a/packages/flutter/lib/src/widgets/editable_text.dart b/packages/flutter/lib/src/widgets/editable_text.dart
index 9123167..6a657d3 100644
--- a/packages/flutter/lib/src/widgets/editable_text.dart
+++ b/packages/flutter/lib/src/widgets/editable_text.dart
@@ -1555,7 +1555,7 @@
if (!_didAutoFocus && widget.autofocus) {
_didAutoFocus = true;
SchedulerBinding.instance!.addPostFrameCallback((_) {
- if (mounted) {
+ if (mounted && renderEditable.hasSize) {
FocusScope.of(context).autofocus(widget.focusNode);
}
});
diff --git a/packages/flutter/test/material/text_field_focus_test.dart b/packages/flutter/test/material/text_field_focus_test.dart
index f22d118..50d5653 100644
--- a/packages/flutter/test/material/text_field_focus_test.dart
+++ b/packages/flutter/test/material/text_field_focus_test.dart
@@ -9,6 +9,24 @@
import 'package:flutter_test/flutter_test.dart';
void main() {
+ // Regression test for https://github.com/flutter/flutter/issues/87099
+ testWidgets('TextField.autofocus should skip the element that never layout', (WidgetTester tester) async {
+ await tester.pumpWidget(
+ MaterialApp(
+ home: Scaffold(
+ body: Navigator(
+ pages: <Page<void>>[_APage(), _BPage()],
+ onPopPage: (Route<dynamic> route, dynamic result) {
+ return false;
+ },
+ ),
+ ),
+ ),
+ );
+
+ expect(tester.takeException(), isNull);
+ });
+
testWidgets('Dialog interaction', (WidgetTester tester) async {
expect(tester.testTextInput.isVisible, isFalse);
@@ -531,3 +549,19 @@
expect(focusNodeB.hasFocus, true);
}, variant: TargetPlatformVariant.desktop());
}
+
+class _APage extends Page<void> {
+ @override
+ Route<void> createRoute(BuildContext context) => PageRouteBuilder<void>(
+ settings: this,
+ pageBuilder: (_, __, ___) => const TextField(autofocus: true),
+ );
+}
+
+class _BPage extends Page<void> {
+ @override
+ Route<void> createRoute(BuildContext context) => PageRouteBuilder<void>(
+ settings: this,
+ pageBuilder: (_, __, ___) => const Text('B'),
+ );
+}