ChatController class

Controller that manages chat state and behavior.

This controller extends ScrollController to provide scrolling functionality while also managing message state, dispatch operations, and failed message handling. It follows the Single Responsibility Principle by focusing on chat-specific state management.

Key responsibilities:

  • Message state management
  • Scroll behavior control
  • Message dispatch and retry logic
  • Failed message tracking
  • Stream-based event notifications

Example usage:

final controller = ChatController();
controller.addMessage(message);
controller.dispatchMessage(
  message,
  onDispatch: (msg) async {
    // Send message to server
    return processedMessage;
  },
);
Inheritance

Constructors

ChatController({CustomSortCallback? customSortCallback})
Creates a new ChatController.

Properties

debugLabel String?
A label that is used in the toString output. Intended to aid with identifying scroll controller instances in debug output.
finalinherited
dispatchResultStream Stream<MessageDispatchResult>
Stream of message dispatch results.
no setter
hasClients bool
Whether any ScrollPosition objects have attached themselves to the ScrollController using the attach method.
no setterinherited
hashCode int
The hash code for this object.
no setterinherited
hasListeners bool
Whether any listeners are currently registered.
no setterinherited
initialScrollOffset double
The initial value to use for offset.
no setterinherited
isCollapsed bool
Whether the chat is currently in collapsed state.
no setter
isDisposed bool
Whether this controller has been disposed.
no setter
keepScrollOffset bool
Each time a scroll completes, save the current scroll offset with PageStorage and restore it if this controller's scrollable is recreated.
finalinherited
messageGroups List<MessageGroup>
List of message groups organized by sender and time.
no setter
newReceiveMessageStream Stream<Message>
Stream of newly received messages.
no setter
offset double
The current scroll offset of the scrollable widget.
no setterinherited
onAttach ScrollControllerCallback?
Called when a ScrollPosition is attached to the scroll controller.
finalinherited
onDetach ScrollControllerCallback?
Called when a ScrollPosition is detached from the scroll controller.
finalinherited
position ScrollPosition
Returns the attached ScrollPosition, from which the actual scroll offset of the ScrollView can be obtained.
no setterinherited
positions Iterable<ScrollPosition>
The currently attached positions.
no setterinherited
runtimeType Type
A representation of the runtime type of the object.
no setterinherited

Methods

addListener(VoidCallback listener) → void
Register a closure to be called when the object changes.
inherited
addMessage(Message message) MessageGroup
Adds a message to the chat.
animateTo(double offset, {required Duration duration, required Curve curve}) Future<void>
Animates the position from its current value to the given value.
inherited
appendMessages(List<Message> messages) → void
Appends older messages to the beginning of the chat.
attach(ScrollPosition position) → void
Register the given position with this controller.
inherited
containsMessageId(String messageId) bool
createScrollPosition(ScrollPhysics physics, ScrollContext context, ScrollPosition? oldPosition) ScrollPosition
Creates a ScrollPosition for use by a Scrollable widget.
inherited
debugFillDescription(List<String> description) → void
Add additional information to the given description for use by toString.
inherited
detach(ScrollPosition position) → void
Unregister the given position with this controller.
inherited
dispatchMessage(Message message, {required MessageDispatchCallback onDispatch}) Future<MessageDispatchResult>
Dispatches a message through the provided callback.
dispose() → void
Discards any resources used by the object. After this is called, the object is not in a usable state and should be discarded (calls to addListener will throw after the object is disposed).
override
isAtBottom({double threshold = 20}) bool
Checks if the scroll position is at the bottom within a threshold.
isDateChangedComparedTo(Message message, Message other) bool
isSameMinute(DateTime a, DateTime b) bool
jumpTo(double value) → void
Jumps the scroll position from its current value to the given value, without animation, and without checking if the new value is in range.
inherited
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
notifyListeners() → void
Call all the registered listeners.
override
removeListener(VoidCallback listener) → void
Remove a previously registered closure from the list of closures that are notified when the object changes.
inherited
removeMessageEverywhere(Message message) → void
Removes a message from all groups and cleans up empty groups.
removeMessageFromGroup(MessageGroup group, Message message) → void
removeMessageGroupAt(MessageGroup group, int messageIndex) → void
retryMessage(Message message) Future
Retries a failed message.
scrollToBottom() → void
Smoothly scrolls to the bottom of the chat.
scrollToBottomByValue(double offset) → void
scrollToTopByValue(double offset) → void
setIsCollapsed(bool value) → dynamic
Sets the collapsed state of the chat.
setMessages(List<Message> messages) → void
Initializes the chat with a list of messages.
toString() String
A string representation of this object.
inherited

Operators

operator ==(Object other) bool
The equality operator.
inherited