dispatchMessage method
Future<MessageDispatchResult>
dispatchMessage(
- Message message, {
- required MessageDispatchCallback onDispatch,
Dispatches a message through the provided callback.
This method handles the complete message lifecycle:
- Adds the message with loading state
- Calls the dispatch callback
- Updates the message based on the result
- Handles failures and retry logic
The onDispatch callback should return the processed message
or null if the operation failed.
Returns a MessageDispatchResult indicating success or failure.
Implementation
Future<MessageDispatchResult> dispatchMessage(
Message message, {
required MessageDispatchCallback onDispatch,
}) async {
final messageGroup =
addMessage(message.copyWith(isLoading: true, isFailed: false));
late final MessageDispatchResult dispatchResult;
late final Message? result;
result = await onDispatch(message);
final index =
messageGroup.messages.indexWhere((element) => element.id == message.id);
if (result != null) {
messageGroup.messages[index] = result;
messageGroup.sortMessages();
dispatchResult = MessageDispatchResult(
message: message,
isSuccess: true,
exception: null,
);
if (!result.isSender) {
_newReceiveMessageController.add(result);
}
notifyListeners();
} else {
dispatchResult = MessageDispatchResult(
message: message,
isSuccess: false,
exception: Exception("Failed to dispatch message"),
);
removeMessageGroupAt(messageGroup, index);
_failedMessageEntries[message.id] = FailedMessageEntry(
messageId: message.id,
messageGroup: messageGroup,
onDispatch: onDispatch,
);
addMessage(message.copyWith(isLoading: false, isFailed: true));
}
if (_dispatchResultController.isClosed) return dispatchResult;
_dispatchResultController.add(dispatchResult);
return dispatchResult;
}