fixed texteditingcontroller issues

This commit is contained in:
Deven Joshi
2021-10-22 18:51:06 +05:30
parent 4459253f49
commit 8e7e6c9542
5 changed files with 27 additions and 22 deletions
@@ -696,13 +696,13 @@ class MessageInputState extends State<MessageInput> {
_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<MessageInput> {
.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<MessageInput> {
}
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<MessageInput> {
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<MessageInput> {
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<MessageInput> {
text = '${'/${_chosenCommand!.name} '}$text';
}
messageInputController.text = '';
messageInputController.clearAttachments();
messageInputController
..text = ''
..clearAttachments();
widget.onQuotedMessageCleared?.call();
setState(() {
@@ -710,17 +710,13 @@ class _StreamMessageTextFieldState extends State<StreamMessageTextField>
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<StreamMessageTextField>
@override
void dispose() {
_onChangedDebounced.cancel();
_controller?.dispose();
super.dispose();
}
@@ -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';
@@ -32,16 +32,20 @@ class MessageInputController extends ValueNotifier<Message> {
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<Message> {
return textEditingController.selection.baseOffset;
}
///
get selectionStart {
return textEditingController.selection.start;
}
set showInChannel(bool newValue) {
value = value.copyWith(showInChannel: newValue);
}