From 90d6f19d9a166fb8ecc47f993df3fc5cc59c620f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Kilczan?= Date: Wed, 12 Mar 2025 22:02:48 +0100 Subject: [PATCH] Keyboard type update (#164274) This fixes the bug #163013 by detecting changes of the `keyboardType`. ## Pre-launch Checklist - [x] I read the [Contributor Guide] and followed the process outlined there for submitting PRs. - [x] I read the [Tree Hygiene] wiki page, which explains my responsibilities. - [x] I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement]. - [x] I signed the [CLA]. - [x] I listed at least one issue that this PR fixes in the description above. - [ ] I updated/added relevant documentation (doc comments with `///`). - [x] I added new tests to check the change I am making, or this PR is [test-exempt]. - [x] I followed the [breaking change policy] and added [Data Driven Fixes] where supported. - [x] All existing and new tests are passing. If you need help, consider asking for advice on the #hackers-new channel on [Discord]. [Contributor Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview [Tree Hygiene]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md [test-exempt]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests [Flutter Style Guide]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md [Features we expect every widget to implement]: https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement [CLA]: https://cla.developers.google.com/ [flutter/tests]: https://github.com/flutter/tests [breaking change policy]: https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes [Discord]: https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md [Data Driven Fixes]: https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md --- .../lib/src/widgets/editable_text.dart | 3 +- .../test/widgets/editable_text_test.dart | 44 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/packages/flutter/lib/src/widgets/editable_text.dart b/packages/flutter/lib/src/widgets/editable_text.dart index f4b90c39a63..fa0853c9f16 100644 --- a/packages/flutter/lib/src/widgets/editable_text.dart +++ b/packages/flutter/lib/src/widgets/editable_text.dart @@ -3266,7 +3266,8 @@ class EditableTextState extends State } if (_hasInputConnection) { - if (oldWidget.obscureText != widget.obscureText) { + if (oldWidget.obscureText != widget.obscureText || + oldWidget.keyboardType != widget.keyboardType) { _textInputConnection!.updateConfig(_effectiveAutofillClient.textInputConfiguration); } } diff --git a/packages/flutter/test/widgets/editable_text_test.dart b/packages/flutter/test/widgets/editable_text_test.dart index 34718066be2..eae26cf3f38 100644 --- a/packages/flutter/test/widgets/editable_text_test.dart +++ b/packages/flutter/test/widgets/editable_text_test.dart @@ -3093,6 +3093,50 @@ void main() { expect(tester.testTextInput.setClientArgs!['obscureText'], isFalse); }); + testWidgets('Sends "updateConfig" when keyboardType is changed', (WidgetTester tester) async { + TextInputType keyboardType = TextInputType.text; + late StateSetter setState; + controller.text = 'Lorem'; + + await tester.pumpWidget( + MaterialApp( + home: StatefulBuilder( + builder: (BuildContext context, StateSetter stateSetter) { + setState = stateSetter; + return EditableText( + keyboardType: keyboardType, + controller: controller, + backgroundCursorColor: Colors.grey, + focusNode: focusNode, + style: textStyle, + cursorColor: cursorColor, + ); + }, + ), + ), + ); + + // Interact with the field to establish the input connection. + final Offset topLeft = tester.getTopLeft(find.byType(EditableText)); + await tester.tapAt(topLeft + const Offset(0.0, 5.0)); + await tester.pump(); + + expect( + (tester.testTextInput.setClientArgs!['inputType'] as Map)['name'], + 'TextInputType.text', + ); + + setState(() { + keyboardType = TextInputType.number; + }); + await tester.pump(); + + expect( + (tester.testTextInput.setClientArgs!['inputType'] as Map)['name'], + 'TextInputType.number', + ); + }); + testWidgets('Sends viewId and updates config when it changes', (WidgetTester tester) async { int viewId = 14; late StateSetter setState;