CupertinoTextField class
An iOS-style text field.
A text field lets the user enter text, either with a hardware keyboard or with an onscreen keyboard.
This widget corresponds to both a UITextField
and an editable UITextView
on iOS.
The text field calls the onChanged callback whenever the user changes the text in the field. If the user indicates that they are done typing in the field (e.g., by pressing a button on the soft keyboard), the text field calls the onSubmitted callback.
It's important to always use characters when dealing with user input text that may contain complex characters. This will ensure that extended grapheme clusters and surrogate pairs are treated as single characters, as they appear to the user.
For example, when finding the length of some user input, use
string.characters.length
. Do NOT use string.length
or even
string.runes.length
. For the complex character "👨👩👦", this
appears to the user as a single character, and string.characters.length
intuitively returns 1. On the other hand, string.length
returns 8, and
string.runes.length
returns 5!
To create a local project with this code sample, run:
flutter create --sample=cupertino.CupertinoTextField.1 mysample
The controller can also control the selection and composing region (and to observe changes to the text, selection, and composing region).
The text field has an overridable decoration that, by default, draws a rounded rectangle border around the text field. If you set the decoration property to null, the decoration will be removed entirely.
When the widget has focus, it will prevent itself from disposing via its underlying EditableText's AutomaticKeepAliveClientMixin.wantKeepAlive in order to avoid losing the selection. Removing the focus will allow it to be disposed.
Remember to call TextEditingController.dispose when it is no longer needed. This will ensure we discard any resources used by the object.
Keep the caret visible when focused
When focused, this widget will make attempts to keep the text area and its
caret (even when showCursor is false
) visible, on these occasions:
- When the user focuses this text field and it is not readOnly.
- When the user changes the selection of the text field, or changes the text when the text field is not readOnly.
- When the virtual keyboard pops up.
Scrolling Considerations
If this CupertinoTextField is not a descendant of Scaffold and is being used within a Scrollable or nested Scrollables, consider placing a ScrollNotificationObserver above the root Scrollable that contains this CupertinoTextField to ensure proper scroll coordination for CupertinoTextField and its components like TextSelectionOverlay.
See also:
- developer.apple.com/documentation/uikit/uitextfield
- TextField, an alternative text field widget that follows the Material Design UI conventions.
- EditableText, which is the raw text editing control at the heart of a TextField.
- Learn how to use a TextEditingController in one of our cookbook recipes.
- developer.apple.com/design/human-interface-guidelines/ios/controls/text-fields/
- Inheritance
-
- Object
- DiagnosticableTree
- Widget
- StatefulWidget
- CupertinoTextField
Constructors
-
CupertinoTextField({Key? key, Object groupId = EditableText, TextEditingController? controller, FocusNode? focusNode, UndoHistoryController? undoController, BoxDecoration? decoration = _kDefaultRoundedBorderDecoration, EdgeInsetsGeometry padding = const EdgeInsets.all(7.0), String? placeholder, TextStyle? placeholderStyle = const TextStyle(fontWeight: FontWeight.w400, color: CupertinoColors.placeholderText), Widget? prefix, OverlayVisibilityMode prefixMode = OverlayVisibilityMode.always, Widget? suffix, OverlayVisibilityMode suffixMode = OverlayVisibilityMode.always, OverlayVisibilityMode clearButtonMode = OverlayVisibilityMode.never, String? clearButtonSemanticLabel, TextInputType? keyboardType, TextInputAction? textInputAction, TextCapitalization textCapitalization = TextCapitalization.none, TextStyle? style, StrutStyle? strutStyle, TextAlign textAlign = TextAlign.start, TextAlignVertical? textAlignVertical, TextDirection? textDirection, bool readOnly = false, @Deprecated('Use `contextMenuBuilder` instead. ' 'This feature was deprecated after v3.3.0-0.5.pre.') ToolbarOptions? toolbarOptions, bool? showCursor, bool autofocus = false, String obscuringCharacter = '•', bool obscureText = false, bool autocorrect = true, SmartDashesType? smartDashesType, SmartQuotesType? smartQuotesType, bool enableSuggestions = true, int? maxLines = 1, int? minLines, bool expands = false, int? maxLength, MaxLengthEnforcement? maxLengthEnforcement, ValueChanged<
String> ? onChanged, VoidCallback? onEditingComplete, ValueChanged<String> ? onSubmitted, TapRegionCallback? onTapOutside, List<TextInputFormatter> ? inputFormatters, bool enabled = true, double cursorWidth = 2.0, double? cursorHeight, Radius cursorRadius = const Radius.circular(2.0), bool cursorOpacityAnimates = true, Color? cursorColor, BoxHeightStyle selectionHeightStyle = ui.BoxHeightStyle.tight, BoxWidthStyle selectionWidthStyle = ui.BoxWidthStyle.tight, Brightness? keyboardAppearance, EdgeInsets scrollPadding = const EdgeInsets.all(20.0), DragStartBehavior dragStartBehavior = DragStartBehavior.start, bool? enableInteractiveSelection, TextSelectionControls? selectionControls, GestureTapCallback? onTap, ScrollController? scrollController, ScrollPhysics? scrollPhysics, Iterable<String> ? autofillHints = const <String>[], ContentInsertionConfiguration? contentInsertionConfiguration, Clip clipBehavior = Clip.hardEdge, String? restorationId, bool scribbleEnabled = true, bool enableIMEPersonalizedLearning = true, EditableTextContextMenuBuilder? contextMenuBuilder = _defaultContextMenuBuilder, SpellCheckConfiguration? spellCheckConfiguration, TextMagnifierConfiguration? magnifierConfiguration}) -
Creates an iOS-style text field.
const
-
CupertinoTextField.borderless({Key? key, Object groupId = EditableText, TextEditingController? controller, FocusNode? focusNode, UndoHistoryController? undoController, BoxDecoration? decoration, EdgeInsetsGeometry padding = const EdgeInsets.all(7.0), String? placeholder, TextStyle? placeholderStyle = _kDefaultPlaceholderStyle, Widget? prefix, OverlayVisibilityMode prefixMode = OverlayVisibilityMode.always, Widget? suffix, OverlayVisibilityMode suffixMode = OverlayVisibilityMode.always, OverlayVisibilityMode clearButtonMode = OverlayVisibilityMode.never, String? clearButtonSemanticLabel, TextInputType? keyboardType, TextInputAction? textInputAction, TextCapitalization textCapitalization = TextCapitalization.none, TextStyle? style, StrutStyle? strutStyle, TextAlign textAlign = TextAlign.start, TextAlignVertical? textAlignVertical, TextDirection? textDirection, bool readOnly = false, @Deprecated('Use `contextMenuBuilder` instead. ' 'This feature was deprecated after v3.3.0-0.5.pre.') ToolbarOptions? toolbarOptions, bool? showCursor, bool autofocus = false, String obscuringCharacter = '•', bool obscureText = false, bool autocorrect = true, SmartDashesType? smartDashesType, SmartQuotesType? smartQuotesType, bool enableSuggestions = true, int? maxLines = 1, int? minLines, bool expands = false, int? maxLength, MaxLengthEnforcement? maxLengthEnforcement, ValueChanged<
String> ? onChanged, VoidCallback? onEditingComplete, ValueChanged<String> ? onSubmitted, TapRegionCallback? onTapOutside, List<TextInputFormatter> ? inputFormatters, bool enabled = true, double cursorWidth = 2.0, double? cursorHeight, Radius cursorRadius = const Radius.circular(2.0), bool cursorOpacityAnimates = true, Color? cursorColor, BoxHeightStyle selectionHeightStyle = ui.BoxHeightStyle.tight, BoxWidthStyle selectionWidthStyle = ui.BoxWidthStyle.tight, Brightness? keyboardAppearance, EdgeInsets scrollPadding = const EdgeInsets.all(20.0), DragStartBehavior dragStartBehavior = DragStartBehavior.start, bool? enableInteractiveSelection, TextSelectionControls? selectionControls, GestureTapCallback? onTap, ScrollController? scrollController, ScrollPhysics? scrollPhysics, Iterable<String> ? autofillHints = const <String>[], ContentInsertionConfiguration? contentInsertionConfiguration, Clip clipBehavior = Clip.hardEdge, String? restorationId, bool scribbleEnabled = true, bool enableIMEPersonalizedLearning = true, EditableTextContextMenuBuilder? contextMenuBuilder = _defaultContextMenuBuilder, SpellCheckConfiguration? spellCheckConfiguration, TextMagnifierConfiguration? magnifierConfiguration}) -
Creates a borderless iOS-style text field.
const
Properties
- autocorrect → bool
-
Whether to enable autocorrection.
final
-
autofillHints
→ Iterable<
String> ? -
A list of strings that helps the autofill service identify the type of this
text input.
final
- autofocus → bool
-
Whether this text field should focus itself if nothing else is already
focused.
final
- clearButtonMode → OverlayVisibilityMode
-
Show an iOS-style clear button to clear the current text entry.
final
- clearButtonSemanticLabel → String?
-
The semantic label for the clear button used by screen readers.
final
- clipBehavior → Clip
-
The content will be clipped (or not) according to this option.
final
- contentInsertionConfiguration → ContentInsertionConfiguration?
-
Configuration of handler for media content inserted via the system input
method.
final
- contextMenuBuilder → EditableTextContextMenuBuilder?
-
Builds the text selection toolbar when requested by the user.
final
- controller → TextEditingController?
-
Controls the text being edited.
final
- cursorColor → Color?
-
The color to use when painting the cursor.
final
- cursorHeight → double?
-
How tall the cursor will be.
final
- cursorOpacityAnimates → bool
-
Whether the cursor will animate from fully transparent to fully opaque
during each cursor blink.
final
- cursorRadius → Radius
-
How rounded the corners of the cursor should be.
final
- cursorWidth → double
-
How thick the cursor will be.
final
- decoration → BoxDecoration?
-
Controls the BoxDecoration of the box behind the text input.
final
- dragStartBehavior → DragStartBehavior
-
Determines the way that drag start behavior is handled.
final
- enabled → bool
-
Disables the text field when false.
final
- enableIMEPersonalizedLearning → bool
-
Whether to enable that the IME update personalized data such as typing
history and user dictionary data.
final
- enableInteractiveSelection → bool
-
Whether to enable user interface affordances for changing the
text selection.
final
- enableSuggestions → bool
-
Whether to show input suggestions as the user types.
final
- expands → bool
-
Whether this widget's height will be sized to fill its parent.
final
- focusNode → FocusNode?
-
An optional focus node to use as the focus node for this widget.
final
- groupId → Object
-
The group identifier for the TextFieldTapRegion of this text field.
final
- hashCode → int
-
The hash code for this object.
no setterinherited
-
inputFormatters
→ List<
TextInputFormatter> ? -
Optional input validation and formatting overrides.
final
- key → Key?
-
Controls how one widget replaces another widget in the tree.
finalinherited
- keyboardAppearance → Brightness?
-
The appearance of the keyboard.
final
- keyboardType → TextInputType
-
The type of keyboard to use for editing the text.
final
- magnifierConfiguration → TextMagnifierConfiguration?
-
Configuration for the text field magnifier.
final
- maxLength → int?
-
The maximum number of characters (Unicode grapheme clusters) to allow in
the text field.
final
- maxLengthEnforcement → MaxLengthEnforcement?
-
Determines how the maxLength limit should be enforced.
final
- maxLines → int?
-
The maximum number of lines to show at one time, wrapping if necessary.
final
- minLines → int?
-
The minimum number of lines to occupy when the content spans fewer lines.
final
- obscureText → bool
-
Whether to hide the text being edited (e.g., for passwords).
final
- obscuringCharacter → String
-
Character used for obscuring text if obscureText is true.
final
-
onChanged
→ ValueChanged<
String> ? -
Called when the user initiates a change to the TextField's
value: when they have inserted or deleted text.
final
- onEditingComplete → VoidCallback?
-
Called when the user submits editable content (e.g., user presses the "done"
button on the keyboard).
final
-
onSubmitted
→ ValueChanged<
String> ? -
Called when the user indicates that they are done editing the text in the
field.
final
- onTap → GestureTapCallback?
-
Called for the first tap in a series of taps.
final
- onTapOutside → TapRegionCallback?
-
Called for each tap that occurs outside of theTextFieldTapRegion group
when the text field is focused.
final
- padding → EdgeInsetsGeometry
-
Padding around the text entry area between the prefix and suffix
or the clear button when clearButtonMode is not never.
final
- placeholder → String?
-
A lighter colored placeholder hint that appears on the first line of the
text field when the text entry is empty.
final
- placeholderStyle → TextStyle?
-
The style to use for the placeholder text.
final
- prefix → Widget?
-
An optional Widget to display before the text.
final
- prefixMode → OverlayVisibilityMode
-
Controls the visibility of the prefix widget based on the state of
text entry when the prefix argument is not null.
final
- readOnly → bool
-
Whether the text can be changed.
final
- restorationId → String?
-
Restoration ID to save and restore the state of the text field.
final
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
- scribbleEnabled → bool
-
Whether iOS 14 Scribble features are enabled for this widget.
final
- scrollController → ScrollController?
-
The ScrollController to use when vertically scrolling the input.
final
- scrollPadding → EdgeInsets
-
Configures padding to edges surrounding a Scrollable when the Textfield scrolls into view.
final
- scrollPhysics → ScrollPhysics?
-
The ScrollPhysics to use when vertically scrolling the input.
final
- selectionControls → TextSelectionControls?
-
Optional delegate for building the text selection handles.
final
- selectionEnabled → bool
-
Same as enableInteractiveSelection.
no setter
- selectionHeightStyle → BoxHeightStyle
-
Controls how tall the selection highlight boxes are computed to be.
final
- selectionWidthStyle → BoxWidthStyle
-
Controls how wide the selection highlight boxes are computed to be.
final
- showCursor → bool?
-
Whether to show cursor.
final
- smartDashesType → SmartDashesType
-
Whether to allow the platform to automatically format dashes.
final
- smartQuotesType → SmartQuotesType
-
Whether to allow the platform to automatically format quotes.
final
- spellCheckConfiguration → SpellCheckConfiguration?
-
Configuration that details how spell check should be performed.
final
- strutStyle → StrutStyle?
-
The strut style used for the vertical layout.
final
- style → TextStyle?
-
The style to use for the text being edited.
final
- suffix → Widget?
-
An optional Widget to display after the text.
final
- suffixMode → OverlayVisibilityMode
-
Controls the visibility of the suffix widget based on the state of
text entry when the suffix argument is not null.
final
- textAlign → TextAlign
-
How the text should be aligned horizontally.
final
- textAlignVertical → TextAlignVertical?
-
How the text should be aligned vertically.
final
- textCapitalization → TextCapitalization
-
Configures how the platform keyboard will select an uppercase or
lowercase keyboard.
final
- textDirection → TextDirection?
-
The directionality of the text.
final
- textInputAction → TextInputAction?
-
The type of action button to use for the keyboard.
final
- toolbarOptions → ToolbarOptions?
-
Configuration of toolbar options.
final
- undoController → UndoHistoryController?
-
Controls the undo state.
final
Methods
-
createElement(
) → StatefulElement -
Creates a StatefulElement to manage this widget's location in the tree.
inherited
-
createState(
) → State< CupertinoTextField> -
Creates the mutable state for this widget at a given location in the tree.
override
-
debugDescribeChildren(
) → List< DiagnosticsNode> -
Returns a list of DiagnosticsNode objects describing this node's
children.
inherited
-
debugFillProperties(
DiagnosticPropertiesBuilder properties) → void -
Add additional properties associated with the node.
override
-
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
toDiagnosticsNode(
{String? name, DiagnosticsTreeStyle? style}) → DiagnosticsNode -
Returns a debug representation of the object that is used by debugging
tools and by DiagnosticsNode.toStringDeep.
inherited
-
toString(
{DiagnosticLevel minLevel = DiagnosticLevel.info}) → String -
A string representation of this object.
inherited
-
toStringDeep(
{String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug}) → String -
Returns a string representation of this node and its descendants.
inherited
-
toStringShallow(
{String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) → String -
Returns a one-line detailed description of the object.
inherited
-
toStringShort(
) → String -
A short, textual description of this widget.
inherited
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited
Static Methods
-
defaultSpellCheckSuggestionsToolbarBuilder(
BuildContext context, EditableTextState editableTextState) → Widget - Default builder for the spell check suggestions toolbar in the Cupertino style.
-
inferIOSSpellCheckConfiguration(
SpellCheckConfiguration? configuration) → SpellCheckConfiguration - Returns a new SpellCheckConfiguration where the given configuration has had any missing values replaced with their defaults for the iOS platform.
Constants
- cupertinoMisspelledTextStyle → const TextStyle
- The TextStyle used to indicate misspelled words in the Cupertino style.
- kMisspelledSelectionColor → const Color
- The color of the selection highlight when the spell check menu is visible.