Skip to main content
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

MethodReturns
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

MethodMessage 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

AndroidFlutter V6Notes
ChatConfigurator.getDataSource()MessageTemplateUtils (static)Flutter uses static methods instead of a decorator chain
DataSourceDecorator patternTemplate overrides via templates / addTemplate propsFlutter overrides at the component level, not globally
CometChatUIKit.getDataSource()MessageTemplateUtilsSame functionality, different access pattern
Global decorator chainPer-component template listsFlutter’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.