MessageTemplateUtils is the central registry that defines how each message type is rendered, what options appear on message bubbles, and what text formatters are applied. It replaces the DataSource / ChatConfigurator pattern used in the Android UI Kit.
How It Works
In V6, MessageTemplateUtils is a static utility class that provides:
- Message templates (how each message type is rendered as a bubble)
- Message options (long-press actions per message type)
- Text formatters (text processing for mentions, links, etc.)
- Message type/category lists (for request builder filtering)
Components call MessageTemplateUtils internally to get defaults. You override behavior by passing custom templates, options, or formatters directly to the component.
Getting Default Templates
// Get all default templates
final templates = MessageTemplateUtils.getAllMessageTemplates();
// Get a specific template
final textTemplate = MessageTemplateUtils.getTextMessageTemplate();
final imageTemplate = MessageTemplateUtils.getImageMessageTemplate();
// Get template by type and category
final template = MessageTemplateUtils.getMessageTemplate(
messageType: MessageTypeConstants.text,
messageCategory: MessageCategoryConstants.message,
);
Available Template Methods
| Method | Returns |
|---|
getTextMessageTemplate() | Template for text messages |
getImageMessageTemplate() | Template for image messages |
getVideoMessageTemplate() | Template for video messages |
getAudioMessageTemplate() | Template for audio messages |
getFileMessageTemplate() | Template for file messages |
getGroupActionTemplate() | Template for group action messages |
getFormMessageTemplate() | Template for form messages |
getCardMessageTemplate() | Template for card messages |
getSchedulerMessageTemplate() | Template for scheduler messages |
getPollMessageTemplate() | Template for poll messages |
getStickerMessageTemplate() | Template for sticker messages |
getCollaborativeDocumentTemplate() | Template for collaborative document messages |
getCollaborativeWhiteboardTemplate() | Template for collaborative whiteboard messages |
getAllMessageTemplates() | All templates combined |
getMessageTemplate(messageType, messageCategory) | Template for a specific type/category |
Overriding Templates
Replace All Templates
Pass a complete list of templates to CometChatMessageList:
CometChatMessageList(
user: user,
templates: [
// Your custom text template
CometChatMessageTemplate(
type: MessageTypeConstants.text,
category: MessageCategoryConstants.message,
contentView: (message, context, alignment, {additionalConfigurations}) {
return MyCustomTextBubble(message: message as TextMessage);
},
options: MessageTemplateUtils.getMessageOptions,
),
// Keep defaults for other types
MessageTemplateUtils.getImageMessageTemplate(),
MessageTemplateUtils.getVideoMessageTemplate(),
MessageTemplateUtils.getAudioMessageTemplate(),
MessageTemplateUtils.getFileMessageTemplate(),
MessageTemplateUtils.getGroupActionTemplate(),
],
)
Add or Override Specific Templates
Use addTemplate to merge custom templates with defaults. Templates are keyed by category_type — if your template matches an existing key, it overrides the default:
CometChatMessageList(
user: user,
addTemplate: [
// Override text message rendering
CometChatMessageTemplate(
type: MessageTypeConstants.text,
category: MessageCategoryConstants.message,
contentView: (message, context, alignment, {additionalConfigurations}) {
return MyCustomTextBubble(message: message as TextMessage);
},
options: MessageTemplateUtils.getMessageOptions,
),
// Add a new custom message type
CometChatMessageTemplate(
type: 'contact',
category: MessageCategoryConstants.custom,
contentView: (message, context, alignment, {additionalConfigurations}) {
return ContactCardBubble(message: message);
},
),
],
)
Message Options
Getting Default Options
// Get options for a specific message type
final textOptions = MessageTemplateUtils.getTextMessageOptions(
loggedInUser, messageObject, context, group, additionalConfigurations,
);
// Get options for any message (dispatches by type)
final options = MessageTemplateUtils.getMessageOptions(
loggedInUser, messageObject, context, group, additionalConfigurations,
);
// Get common options (shared across all types)
final commonOptions = MessageTemplateUtils.getCommonOptions(
loggedInUser, messageObject, context, group, additionalConfigurations,
);
Option Methods by Message Type
| Method | Message Type |
|---|
getTextMessageOptions(...) | Text |
getImageMessageOptions(...) | Image |
getVideoMessageOptions(...) | Video |
getAudioMessageOptions(...) | Audio |
getFileMessageOptions(...) | File |
getCommonOptions(...) | Shared across all types |
getMessageOptions(...) | Dispatches to the correct type-specific method |
Text Formatters
// Get default formatters
final formatters = MessageTemplateUtils.getDefaultTextFormatters();
// Returns: [CometChatMentionsFormatter, CometChatEmailFormatter, CometChatPhoneNumberFormatter]
Type and Category Lists
Used when building custom MessagesRequestBuilder instances:
// All registered message types
final types = MessageTemplateUtils.getAllMessageTypes();
// All registered message categories
final categories = MessageTemplateUtils.getAllMessageCategories();
Comparison with Android’s DataSource
| Android | Flutter V6 | Notes |
|---|
ChatConfigurator.getDataSource() | MessageTemplateUtils (static) | Flutter uses static methods instead of a decorator chain |
DataSourceDecorator pattern | Template overrides via templates / addTemplate props | Flutter overrides at the component level, not globally |
CometChatUIKit.getDataSource() | MessageTemplateUtils | Same functionality, different access pattern |
| Global decorator chain | Per-component template lists | Flutter’s approach is more explicit but less global |
Unlike Android’s DataSourceDecorator which applies globally, Flutter’s template overrides are scoped to the component instance. To apply the same customization everywhere, pass the same template list to each CometChatMessageList instance.