diff --git a/lib/tag_editor.dart b/lib/tag_editor.dart index 0552733..45108ca 100644 --- a/lib/tag_editor.dart +++ b/lib/tag_editor.dart @@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:super_tag_editor/suggestions_box_controller.dart'; import 'package:pointer_interceptor/pointer_interceptor.dart'; +import 'package:super_tag_editor/utils/direction_helper.dart'; import 'package:super_tag_editor/widgets/validation_suggestion_item.dart'; import './tag_editor_layout_delegate.dart'; @@ -183,6 +184,7 @@ class TagEditor extends StatefulWidget { class TagsEditorState extends State> { /// A controller to keep value of the [TextField]. late TextEditingController _textFieldController; + late TextDirection _textDirection; /// A state variable for checking if new text is enter. var _previousText = ''; @@ -211,6 +213,7 @@ class TagsEditorState extends State> { void initState() { super.initState(); _textFieldController = (widget.controller ?? TextEditingController()); + _textDirection = widget.textDirection ?? TextDirection.ltr; _focusNodeKeyboard = FocusNode()..addListener(_onFocusKeyboardChanged); _focusNode = (widget.focusNode ?? FocusNode()) ..addListener(_onFocusChanged); @@ -603,7 +606,7 @@ class TagsEditorState extends State> { @override Widget build(BuildContext context) { - final decoration = widget.hasAddButton + final decoration = widget.hasAddButton && widget.icon == null ? widget.inputDecoration.copyWith( suffixIcon: CupertinoButton( padding: EdgeInsets.zero, @@ -667,13 +670,23 @@ class TagsEditorState extends State> { cursorColor: widget.cursorColor, autocorrect: widget.autocorrect, textAlign: widget.textAlign, - textDirection: widget.textDirection, + textDirection: _textDirection, readOnly: widget.readOnly, autofocus: widget.autofocus, enableSuggestions: widget.enableSuggestions, maxLines: widget.maxLines, decoration: decoration, - onChanged: _onTextFieldChange, + onChanged: (value) { + _onTextFieldChange.call(value); + if (value.isNotEmpty) { + final directionByText = DirectionHelper.getDirectionByEndsText(value); + if (directionByText != _textDirection) { + setState(() { + _textDirection = directionByText; + }); + } + } + }, onSubmitted: _onSubmitted, inputFormatters: widget.inputFormatters, ), diff --git a/lib/utils/direction_helper.dart b/lib/utils/direction_helper.dart new file mode 100644 index 0000000..8c11056 --- /dev/null +++ b/lib/utils/direction_helper.dart @@ -0,0 +1,10 @@ + +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart' as intl; + +abstract class DirectionHelper { + + static bool isDirectionRTLByEndsText(String text) => intl.Bidi.endsWithRtl(text); + + static TextDirection getDirectionByEndsText(String text) => isDirectionRTLByEndsText(text) ? TextDirection.rtl : TextDirection.ltr; +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index af357ab..7c56118 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -14,6 +14,8 @@ dependencies: debounce_throttle: ^2.0.0 + intl: ^0.17.0 + dev_dependencies: flutter_test: sdk: flutter