From 8e7e6c9542f28b24780e6211e7f1bf90fbb80222 Mon Sep 17 00:00:00 2001 From: Deven Joshi Date: Fri, 22 Oct 2021 18:51:06 +0530 Subject: [PATCH] fixed texteditingcontroller issues --- .../lib/src/message_input.dart | 21 +++++++++---------- .../src/mip/stream_message_send_button.dart | 1 + .../src/mip/stream_message_text_field.dart | 11 +++------- .../lib/stream_chat_flutter.dart | 1 + .../lib/src/message_input_controller.dart | 15 ++++++++++--- 5 files changed, 27 insertions(+), 22 deletions(-) diff --git a/packages/stream_chat_flutter/lib/src/message_input.dart b/packages/stream_chat_flutter/lib/src/message_input.dart index 982d5cc5..e1ab4b90 100644 --- a/packages/stream_chat_flutter/lib/src/message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input.dart @@ -696,13 +696,13 @@ class MessageInputState extends State { _buildAttachments(), LimitedBox( maxHeight: widget.maxHeight, - child: TextField( + child: StreamMessageTextField( key: const Key('messageInputText'), enabled: _inputEnabled, maxLines: null, onSubmitted: (_) => sendMessage(), keyboardType: widget.keyboardType, - controller: messageInputController.textEditingController, + controller: messageInputController, focusNode: _focusNode, style: _messageInputTheme.inputTextStyle, autofocus: widget.autofocus, @@ -876,7 +876,7 @@ class MessageInputState extends State { .contains(':')) { final textToSelection = messageInputController.text.substring( 0, - messageInputController.textEditingController.value.selection.start, + messageInputController.selectionStart, ); final splits = textToSelection.split(':'); final query = splits[splits.length - 2].toLowerCase(); @@ -1179,15 +1179,14 @@ class MessageInputState extends State { } Widget _buildMentionsOverlayEntry() { - if (messageInputController.textEditingController.value.selection.start < - 0) { + if (messageInputController.selectionStart < 0) { return const Offstage(); } final splits = messageInputController.text .substring( 0, - messageInputController.textEditingController.value.selection.start, + messageInputController.selectionStart, ) .split('@'); final query = splits.last.toLowerCase(); @@ -1223,8 +1222,7 @@ class MessageInputState extends State { messageInputController.textEditingController.value = TextEditingValue( text: rejoin + messageInputController.text.substring( - messageInputController - .textEditingController.value.selection.start, + messageInputController.selectionStart, ), selection: TextSelection.collapsed( offset: rejoin.length, @@ -1267,7 +1265,7 @@ class MessageInputState extends State { messageInputController.textEditingController.value = TextEditingValue( text: rejoin + messageInputController.text.substring( - messageInputController.textEditingController.selection.start, + messageInputController.selectionStart, ), selection: TextSelection.collapsed( offset: rejoin.length, @@ -1794,8 +1792,9 @@ class MessageInputState extends State { text = '${'/${_chosenCommand!.name} '}$text'; } - messageInputController.text = ''; - messageInputController.clearAttachments(); + messageInputController + ..text = '' + ..clearAttachments(); widget.onQuotedMessageCleared?.call(); setState(() { diff --git a/packages/stream_chat_flutter/lib/src/mip/stream_message_send_button.dart b/packages/stream_chat_flutter/lib/src/mip/stream_message_send_button.dart index e69de29b..8b137891 100644 --- a/packages/stream_chat_flutter/lib/src/mip/stream_message_send_button.dart +++ b/packages/stream_chat_flutter/lib/src/mip/stream_message_send_button.dart @@ -0,0 +1 @@ + diff --git a/packages/stream_chat_flutter/lib/src/mip/stream_message_text_field.dart b/packages/stream_chat_flutter/lib/src/mip/stream_message_text_field.dart index 48ece391..43acce31 100644 --- a/packages/stream_chat_flutter/lib/src/mip/stream_message_text_field.dart +++ b/packages/stream_chat_flutter/lib/src/mip/stream_message_text_field.dart @@ -710,17 +710,13 @@ class _StreamMessageTextFieldState extends State registerForRestoration(_controller!, 'controller'); } - late final _onChangedDebounced = debounce( - (String newText) => _effectiveController.text = newText, - const Duration(milliseconds: 350), - leading: true, - ); - @override Widget build(BuildContext context) => TextField( key: widget.key, controller: _effectiveController.textEditingController, - onChanged: (newText) => _onChangedDebounced([newText]), + onChanged: (newText) { + _effectiveController.text = newText; + }, focusNode: widget.focusNode, decoration: widget.decoration, keyboardType: widget.keyboardType, @@ -775,7 +771,6 @@ class _StreamMessageTextFieldState extends State @override void dispose() { - _onChangedDebounced.cancel(); _controller?.dispose(); super.dispose(); } diff --git a/packages/stream_chat_flutter/lib/stream_chat_flutter.dart b/packages/stream_chat_flutter/lib/stream_chat_flutter.dart index 0447fc68..948f0261 100644 --- a/packages/stream_chat_flutter/lib/stream_chat_flutter.dart +++ b/packages/stream_chat_flutter/lib/stream_chat_flutter.dart @@ -28,6 +28,7 @@ export 'src/message_search_item.dart'; export 'src/message_search_list_view.dart'; export 'src/message_text.dart'; export 'src/message_widget.dart'; +export 'src/mip/stream_message_text_field.dart'; export 'src/option_list_tile.dart'; export 'src/reaction_icon.dart'; export 'src/reaction_picker.dart'; diff --git a/packages/stream_chat_flutter_core/lib/src/message_input_controller.dart b/packages/stream_chat_flutter_core/lib/src/message_input_controller.dart index 96026530..3f60efaf 100644 --- a/packages/stream_chat_flutter_core/lib/src/message_input_controller.dart +++ b/packages/stream_chat_flutter_core/lib/src/message_input_controller.dart @@ -32,16 +32,20 @@ class MessageInputController extends ValueNotifier { final TextEditingController _textEditingController; /// - String get text => value.text ?? ''; + String get text => _textEditingController.text; /// set message(Message message) { value = message; } - set text(String? newText) { + set text(String newText) { value = value.copyWith(text: newText); - _textEditingController.text = newText ?? ''; + _textEditingController + ..text = newText + ..selection = TextSelection.fromPosition( + TextPosition(offset: _textEditingController.text.length), + ); } /// @@ -55,6 +59,11 @@ class MessageInputController extends ValueNotifier { return textEditingController.selection.baseOffset; } + /// + get selectionStart { + return textEditingController.selection.start; + } + set showInChannel(bool newValue) { value = value.copyWith(showInChannel: newValue); }