BidiTextField class
A text field widget that automatically detects and sets text direction based on content.
BidiTextField is a StatefulWidget that wraps Flutter's standard TextField
and automatically determines whether the text should be displayed in
right-to-left (RTL) or left-to-right (LTR) direction based on its content.
This is particularly useful for applications that support multiple languages with different text directions, as it eliminates the need to manually specify direction.
Breaking change (v2.0.0)
BidiTextField no longer extends TextField. It extends StatefulWidget
and builds a TextField internally. If your code relied on
bidiTextFieldInstance is TextField type checks, update them —
all widget behaviour is identical.
Example:
BidiTextField(
decoration: InputDecoration(hintText: 'Enter text'),
onDirectionChanged: (TextDirection direction) {
print('Text direction changed to: $direction');
},
)
- Inheritance
-
- Object
- DiagnosticableTree
- Widget
- StatefulWidget
- BidiTextField
Constructors
-
BidiTextField({Key? key, Object groupId = EditableText, TextEditingController? controller, FocusNode? focusNode, UndoHistoryController? undoController, InputDecoration? decoration = const InputDecoration(), TextInputType? keyboardType, TextInputAction? textInputAction, TextCapitalization textCapitalization = TextCapitalization.none, TextStyle? style, StrutStyle? strutStyle, TextAlign textAlign = TextAlign.start, TextAlignVertical? textAlignVertical, TextDirection? textDirection, bool readOnly = false, bool? showCursor, bool autofocus = false, WidgetStatesController? statesController, 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, AppPrivateCommandCallback? onAppPrivateCommand, List<TextInputFormatter> ? inputFormatters, bool? enabled, bool? ignorePointers, double cursorWidth = 2.0, double? cursorHeight, Radius? cursorRadius, bool? cursorOpacityAnimates, Color? cursorColor, Color? cursorErrorColor, 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, bool onTapAlwaysCalled = false, TapRegionCallback? onTapOutside, MouseCursor? mouseCursor, InputCounterWidgetBuilder? buildCounter, ScrollController? scrollController, ScrollPhysics? scrollPhysics, Iterable<String> ? autofillHints = const <String>[], ContentInsertionConfiguration? contentInsertionConfiguration, Clip clipBehavior = Clip.hardEdge, String? restorationId, bool enableIMEPersonalizedLearning = true, EditableTextContextMenuBuilder? contextMenuBuilder = _defaultContextMenuBuilder, bool stylusHandwritingEnabled = true, SpellCheckConfiguration? spellCheckConfiguration, TextMagnifierConfiguration? magnifierConfiguration, int? sampleLength = 50, ValueChanged<TextDirection> ? onDirectionChanged}) -
const
Properties
- autocorrect → bool
-
final
-
autofillHints
→ Iterable<
String> ? -
final
- autofocus → bool
-
final
- buildCounter → InputCounterWidgetBuilder?
-
final
- clipBehavior → Clip
-
final
- contentInsertionConfiguration → ContentInsertionConfiguration?
-
final
- contextMenuBuilder → EditableTextContextMenuBuilder?
-
final
- controller → TextEditingController?
-
final
- cursorColor → Color?
-
final
- cursorErrorColor → Color?
-
final
- cursorHeight → double?
-
final
- cursorOpacityAnimates → bool?
-
final
- cursorRadius → Radius?
-
final
- cursorWidth → double
-
final
- decoration → InputDecoration?
-
final
- dragStartBehavior → DragStartBehavior
-
final
- enabled → bool?
-
final
- enableIMEPersonalizedLearning → bool
-
final
- enableInteractiveSelection → bool?
-
final
- enableSuggestions → bool
-
final
- expands → bool
-
final
- focusNode → FocusNode?
-
final
- groupId → Object
-
final
- hashCode → int
-
The hash code for this object.
no setterinherited
- ignorePointers → bool?
-
final
-
inputFormatters
→ List<
TextInputFormatter> ? -
final
- key → Key?
-
Controls how one widget replaces another widget in the tree.
finalinherited
- keyboardAppearance → Brightness?
-
final
- keyboardType → TextInputType?
-
final
- magnifierConfiguration → TextMagnifierConfiguration?
-
final
- maxLength → int?
-
final
- maxLengthEnforcement → MaxLengthEnforcement?
-
final
- maxLines → int?
-
final
- minLines → int?
-
final
- mouseCursor → MouseCursor?
-
final
- obscureText → bool
-
final
- obscuringCharacter → String
-
final
- onAppPrivateCommand → AppPrivateCommandCallback?
-
final
-
onChanged
→ ValueChanged<
String> ? -
final
-
onDirectionChanged
→ ValueChanged<
TextDirection> ? -
Callback that is called when the text direction changes.
final
- onEditingComplete → VoidCallback?
-
final
-
onSubmitted
→ ValueChanged<
String> ? -
final
- onTap → VoidCallback?
-
final
- onTapAlwaysCalled → bool
-
final
- onTapOutside → TapRegionCallback?
-
final
- readOnly → bool
-
final
- restorationId → String?
-
final
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
- sampleLength → int?
-
Maximum number of characters to sample for direction detection.
final
- scrollController → ScrollController?
-
final
- scrollPadding → EdgeInsets
-
final
- scrollPhysics → ScrollPhysics?
-
final
- selectionControls → TextSelectionControls?
-
final
- selectionHeightStyle → BoxHeightStyle
-
final
- selectionWidthStyle → BoxWidthStyle
-
final
- showCursor → bool?
-
final
- smartDashesType → SmartDashesType?
-
final
- smartQuotesType → SmartQuotesType?
-
final
- spellCheckConfiguration → SpellCheckConfiguration?
-
final
- statesController → WidgetStatesController?
-
final
- strutStyle → StrutStyle?
-
final
- style → TextStyle?
-
final
- stylusHandwritingEnabled → bool
-
final
- textAlign → TextAlign
-
final
- textAlignVertical → TextAlignVertical?
-
final
- textCapitalization → TextCapitalization
-
final
- textDirection → TextDirection?
-
final
- textInputAction → TextInputAction?
-
final
- undoController → UndoHistoryController?
-
final
Methods
-
createElement(
) → StatefulElement -
Creates a StatefulElement to manage this widget's location in the tree.
inherited
-
createState(
) → State< BidiTextField> -
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.
inherited
-
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, int wrapWidth = 65}) → 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