diff --git a/packages/flutter/lib/src/cupertino/text_field.dart b/packages/flutter/lib/src/cupertino/text_field.dart index 3c6096e619f..35b7189203b 100644 --- a/packages/flutter/lib/src/cupertino/text_field.dart +++ b/packages/flutter/lib/src/cupertino/text_field.dart @@ -1878,4 +1878,20 @@ class _RenderBaselineAlignedStack extends RenderBox assert(size.isFinite); return constraints.constrain(size); } + + @override + bool hitTestChildren(BoxHitTestResult result, {required Offset position}) { + final RenderBox editableText = _editableTextChild; + final _BaselineAlignedStackParentData editableTextParentData = + editableText.parentData! as _BaselineAlignedStackParentData; + + return result.addWithPaintOffset( + offset: editableTextParentData.offset, + position: position, + hitTest: (BoxHitTestResult result, Offset transformed) { + assert(transformed == position - editableTextParentData.offset); + return editableText.hitTest(result, position: transformed); + }, + ); + } } diff --git a/packages/flutter/test/cupertino/text_field_test.dart b/packages/flutter/test/cupertino/text_field_test.dart index a620205c811..38a9c3fa217 100644 --- a/packages/flutter/test/cupertino/text_field_test.dart +++ b/packages/flutter/test/cupertino/text_field_test.dart @@ -10462,6 +10462,19 @@ void main() { await performBaselineAlignmentCheck(20.0, 40.0); }); + testWidgets('Editable text in text field with placeholder is hit-testable', ( + WidgetTester tester, + ) async { + await tester.pumpWidget( + const CupertinoApp( + home: Center(child: CupertinoTextField(placeholder: 'placeholder')), + ), + ); + + expect(find.byType(CupertinoTextField), findsOneWidget); + expect(find.byType(EditableText).hitTestable(), findsOne); + }); + testWidgets('Start the floating cursor on long tap', (WidgetTester tester) async { EditableText.debugDeterministicCursor = true; final TextEditingController controller = TextEditingController(text: 'abcd');