Repository navigation
Document that programmatic TextEditingController changes do not run input formatters - #190166
Conversation
…rmatters Add a note to TextEditingController.clear() explaining that TextInputFormatters are not invoked on programmatic changes to the controller's value. Input formatters only run on user input from the onscreen or physical keyboard. Fixes flutter#86354
There was a problem hiding this comment.
Code Review
This pull request updates the documentation for the clear method in TextEditingController within packages/flutter/lib/src/widgets/editable_text.dart. The added documentation clarifies that calling clear does not trigger TextInputFormatters, as they only run on user input, and notes that developers must manually sync formatter state if needed. There are no review comments, and I have no feedback to provide.
There was a problem hiding this comment.
@binSaed Thank you for the contribution! Overall this seems like a reasonable addition, I left a comment about how we can expand on this.
| /// this method should only be called between frames, e.g. in response to user | ||
| /// actions, not during the build, layout, or paint phases. | ||
| /// | ||
| /// This method does not trigger [TextInputFormatter]s. Input formatters only |
There was a problem hiding this comment.
Consider moving this to a top-level doc on TextEditingController. And adding a simpler doc on clear that simply states calling the method does not run TextInputFormatters. Consider also adding it to other methods in this class since they will face the same issue.
There was a problem hiding this comment.
Done in e684e62 — moved the full discussion to the TextEditingController class-level docs (right after the existing paragraph recommending formatters for as-you-type modification), simplified clear() to a one-liner, and added the same one-line note to the other members that change the value programmatically: the value, text, and selection setters, and clearComposing().
| /// actions, not during the build, layout, or paint phases. This property can | ||
| /// be set from a listener added to this [TextEditingController]. | ||
| /// | ||
| /// Setting this does not run [TextInputFormatter]s. See the discussion at |
There was a problem hiding this comment.
For these one line comments I would just say Setting this does not run [TextInputFormatter]s. Apply them manually if needed.
Renzo-Olivares
left a comment
There was a problem hiding this comment.
LGTM, thank you for the contribution @binSaed. This will need one more approval before landing.
Roll Flutter from c2437523d308 to 65c9a8dc60bc (195 revisions) flutter/flutter@c243752...65c9a8d 2026-08-22 [email protected] Roll ICU from d578f2e8b7bd to 8cc91d9b6ab9 (1 revision) (flutter/flutter#191542) 2026-08-22 [email protected] Roll Skia from 666a9b3d5cf0 to ad2106c0bb64 (3 revisions) (flutter/flutter#191527) 2026-08-22 [email protected] Roll Fuchsia Test Scripts from KaOq3EE4qJ9fnaaaK... to 0iCv10IlKfiilEBOU... (flutter/flutter#191524) 2026-08-22 [email protected] [flutter_tools] Add tests for negative lookahead regex in test runner and batch entrypoints (flutter/flutter#191438) 2026-08-22 [email protected] Roll Skia from 0c37868737fa to 666a9b3d5cf0 (2 revisions) (flutter/flutter#191518) 2026-08-21 [email protected] Revert "[input] Migrate fuchsia.ui.pointerinjector to TouchSource (#190855) (flutter/flutter#191509) 2026-08-21 [email protected] Fixes windows gallery benchmarks by forcing mobile layout (flutter/flutter#191507) 2026-08-21 [email protected] [flutter_tools] Restrict WebAssetServer source resolution to source map extensions (flutter/flutter#191501) 2026-08-21 [email protected] Roll Skia from f6900c5b8439 to 0c37868737fa (2 revisions) (flutter/flutter#191504) 2026-08-21 [email protected] Refactor `FlutterDevice.connect` and VM service discovery (flutter/flutter#191221) 2026-08-21 [email protected] [flutter_tools] Fix crash when migrating flow-style exclude lists in analysis_options.yaml (flutter/flutter#191269) 2026-08-21 [email protected] [rules] Add packages/flutter_tools/gradle/AGENTS.md rules (flutter/flutter#191486) 2026-08-21 [email protected] [flutter_tools] refactor CLI argument architecture with typed option descriptors and bundles (PoC) (flutter/flutter#191018) 2026-08-21 [email protected] tools: Extract Dart SDK to temp directory before moving to final location (flutter/flutter#191263) 2026-08-21 [email protected] [web] Move CanvasKit fragment shader classes to canvaskit/fragment_shader.dart (flutter/flutter#191451) 2026-08-21 [email protected] Roll Fuchsia Linux SDK from GCQlmt6h-esJsNubS... to ic6GjOSn-KN508XyK... (flutter/flutter#191485) 2026-08-21 [email protected] [Widget Preview] Isolate PageStorage scope in widget preview group expansion tile (flutter/flutter#191378) 2026-08-21 [email protected] [flutter_tools] Deprecate --build and --no-build flags on flutter run (flutter/flutter#191358) 2026-08-21 [email protected] Roll Skia from 70988bed1b3b to f6900c5b8439 (2 revisions) (flutter/flutter#191481) 2026-08-21 [email protected] Roll Packages from 1785501 to 252bb33 (6 revisions) (flutter/flutter#191480) 2026-08-21 [email protected] Roll Fuchsia Linux SDK from 20IJas24bZiNmCZTK... to GCQlmt6h-esJsNubS... (flutter/flutter#191415) 2026-08-21 [email protected] Roll Skia from 2ba6971bd0d1 to 70988bed1b3b (2 revisions) (flutter/flutter#191476) 2026-08-21 [email protected] Roll Skia from 1d5f72537ba6 to 2ba6971bd0d1 (2 revisions) (flutter/flutter#191473) 2026-08-21 [email protected] Roll Skia from 2c25efd2e369 to 1d5f72537ba6 (1 revision) (flutter/flutter#191472) 2026-08-21 [email protected] Roll Skia from 09b1b810850a to 2c25efd2e369 (9 revisions) (flutter/flutter#191470) 2026-08-21 [email protected] [Impeller] fix position of cached single glyph text shadows (flutter/flutter#191325) 2026-08-21 [email protected] Roll Skia from abdf8821f313 to 09b1b810850a (15 revisions) (flutter/flutter#191458) 2026-08-21 [email protected] Document that programmatic TextEditingController changes do not run input formatters (flutter/flutter#190166) 2026-08-21 [email protected] Adds new gallery benchmarks to windows (skia and impeller) (flutter/flutter#191454) 2026-08-21 [email protected] iOS: Deprecate FlutterEngine.isGpuDisabled (flutter/flutter#191393) 2026-08-21 [email protected] Revert: [web] Unskip decoration image lerp tests (flutter/flutter#191462) 2026-08-20 [email protected] android_hardware_smoke_test: Improve reliability (flutter/flutter#191374) 2026-08-20 [email protected] Don't size or offset the Android platform view before it is laid out (flutter/flutter#190895) 2026-08-20 [email protected] [iOS][add2app] Skip building SwiftPM plugins when generating CocoaPods artifacts (flutter/flutter#190736) 2026-08-20 [email protected] Optimize JSONMessageCodec UTF-8 conversion (flutter/flutter#190529) 2026-08-20 [email protected] [FML] Replace deprecated wstring_convert with Win32 APIs (flutter/flutter#191394) 2026-08-20 [email protected] SliverFillRemaining extends beyond viewport size when fillOverscroll is true (flutter/flutter#191236) 2026-08-20 [email protected] [flutter_tools] Update argParser usageLineLength when --wrap-column is passed (flutter/flutter#191264) 2026-08-20 [email protected] [flutter_tools] Fix UNC path resolution in depfile parsing on Windows (flutter/flutter#191265) 2026-08-20 [email protected] [web] Unskip decoration image lerp tests (flutter/flutter#191426) 2026-08-20 [email protected] Do not inject 'type' and 'method' into service extension responses (flutter/flutter#190946) 2026-08-20 [email protected] [flutter_tools] Fix crash in symbolize command on stream error (flutter/flutter#191273) 2026-08-20 [email protected] [flutter_tools] Prevent deletion of shared native asset hooks outputs as stale (flutter/flutter#191272) 2026-08-20 [email protected] [flutter_tools] Support package wildcard assets in app pubspec (flutter/flutter#191266) 2026-08-20 [email protected] Add SliverClipRect and SliverClipRRect (flutter/flutter#179003) 2026-08-20 [email protected] [flutter_tools] Implement Diagnostics extension slice and doctor integration (flutter/flutter#191162) ...
Description
This PR documents that
TextInputFormatters are not run when aTextEditingController's value is changed programmatically.The behavior is already documented on
EditableText(formatters run on user input only), butTextEditingControlleritself did not mention this. This has been a source of confusion for developers who expect formatters to stay in sync with programmatic changes (see #86354).Changes
TextEditingControllerclass-level docs explaining that input formatters only run when the user changes the text (for example using the keyboard or the text selection menu), not when the text is changed programmatically through the controller, and that programmatically set values should be formatted manually if needed.TextInputFormatters. See the discussion atTextEditingController.") to the members that change the value programmatically: thevalue,text, andselectionsetters,clear(), andclearComposing().Pre-launch Checklist
///).Fixes #86354