@@ -797,6 +797,92 @@ void main() {
797797 expect(editableTextWidget.onEditingComplete, onEditingComplete);
798798 });
799799
800+ // Regression test for https://github.com/flutter/flutter/issues/127597.
801+ testWidgets(
802+ 'The second TextField is clicked, triggers the onTapOutside callback of the previous TextField',
803+ (WidgetTester tester) async {
804+ final GlobalKey keyA = GlobalKey();
805+ final GlobalKey keyB = GlobalKey();
806+ final GlobalKey keyC = GlobalKey();
807+ bool outsideClickA = false;
808+ bool outsideClickB = false;
809+ bool outsideClickC = false;
810+ await tester.pumpWidget(
811+ MaterialApp(
812+ home: Align(
813+ alignment: Alignment.topLeft,
814+ child: Column(
815+ children: <Widget>[
816+ const Text('Outside'),
817+ Material(
818+ child: TextField(
819+ key: keyA,
820+ groupId: 'Group A',
821+ onTapOutside: (PointerDownEvent event) {
822+ outsideClickA = true;
823+ },
824+ ),
825+ ),
826+ Material(
827+ child: TextField(
828+ key: keyB,
829+ groupId: 'Group B',
830+ onTapOutside: (PointerDownEvent event) {
831+ outsideClickB = true;
832+ },
833+ ),
834+ ),
835+ Material(
836+ child: TextField(
837+ key: keyC,
838+ groupId: 'Group C',
839+ onTapOutside: (PointerDownEvent event) {
840+ outsideClickC = true;
841+ },
842+ ),
843+ ),
844+ ],
845+ ),
846+ ),
847+ ),
848+ );
849+
850+ await tester.pump();
851+
852+ Future<void> click(Finder finder) async {
853+ await tester.tap(finder);
854+ await tester.enterText(finder, 'Hello');
855+ await tester.pump();
856+ }
857+
858+ expect(outsideClickA, false);
859+ expect(outsideClickB, false);
860+ expect(outsideClickC, false);
861+
862+ await click(find.byKey(keyA));
863+ await tester.showKeyboard(find.byKey(keyA));
864+ await tester.idle();
865+ expect(outsideClickA, false);
866+ expect(outsideClickB, false);
867+ expect(outsideClickC, false);
868+
869+ await click(find.byKey(keyB));
870+ expect(outsideClickA, true);
871+ expect(outsideClickB, false);
872+ expect(outsideClickC, false);
873+
874+ await click(find.byKey(keyC));
875+ expect(outsideClickA, true);
876+ expect(outsideClickB, true);
877+ expect(outsideClickC, false);
878+
879+ await tester.tap(find.text('Outside'));
880+ expect(outsideClickA, true);
881+ expect(outsideClickB, true);
882+ expect(outsideClickC, true);
883+ },
884+ );
885+
800886 testWidgets('TextField has consistent size', (WidgetTester tester) async {
801887 final Key textFieldKey = UniqueKey();
802888 String? textFieldValue;
0 commit comments