@@ -132,6 +132,10 @@ class Composer extends StatefulWidget {
132132 /// and hide the button. Defaults to `false` .
133133 final bool sendButtonHidden;
134134
135+ /// Controls the behavior of the text input field after a message is sent.
136+ /// Defaults to [InputClearMode.always] .
137+ final InputClearMode inputClearMode;
138+
135139 /// Creates a message composer widget.
136140 const Composer ({
137141 super .key,
@@ -175,6 +179,7 @@ class Composer extends StatefulWidget {
175179 this .allowEmptyMessage = false ,
176180 this .sendButtonDisabled = false ,
177181 this .sendButtonHidden = false ,
182+ this .inputClearMode = InputClearMode .always,
178183 });
179184
180185 @override
@@ -194,6 +199,7 @@ class _ComposerState extends State<Composer> {
194199 _focusNode = widget.focusNode ?? FocusNode ();
195200 _hasTextNotifier = ValueNotifier (_textController.text.trim ().isNotEmpty);
196201 _focusNode.onKeyEvent = _handleKeyEvent;
202+ _textController.addListener (_handleTextControllerChange);
197203 WidgetsBinding .instance.addPostFrameCallback ((_) => _measure ());
198204 }
199205
@@ -211,12 +217,18 @@ class _ComposerState extends State<Composer> {
211217 @override
212218 void didUpdateWidget (covariant Composer oldWidget) {
213219 super .didUpdateWidget (oldWidget);
220+ if (widget.textEditingController != oldWidget.textEditingController) {
221+ _textController.removeListener (_handleTextControllerChange);
222+ _textController = widget.textEditingController ?? TextEditingController ();
223+ _textController.addListener (_handleTextControllerChange);
224+ }
214225 WidgetsBinding .instance.addPostFrameCallback ((_) => _measure ());
215226 }
216227
217228 @override
218229 void dispose () {
219230 _hasTextNotifier.dispose ();
231+ _textController.removeListener (_handleTextControllerChange);
220232 // Only try to dispose text controller if it's not provided, let
221233 // user handle disposing it how they want.
222234 if (widget.textEditingController == null ) {
@@ -392,11 +404,14 @@ class _ComposerState extends State<Composer> {
392404 }
393405 }
394406
407+ void _handleTextControllerChange () {
408+ _hasTextNotifier.value = _textController.text.trim ().isNotEmpty;
409+ }
410+
395411 void _handleSubmitted (String text) {
396- final trimmed = text.trim ();
397- if (trimmed.isNotEmpty || widget.allowEmptyMessage) {
398- context.read <OnMessageSendCallback ?>()? .call (trimmed);
399- _hasTextNotifier.value = false ;
412+ if (widget.allowEmptyMessage == false && text.trim ().isEmpty) return ;
413+ context.read <OnMessageSendCallback ?>()? .call (text.trim ());
414+ if (widget.inputClearMode == InputClearMode .always) {
400415 _textController.clear ();
401416 }
402417 }
0 commit comments