> ## Documentation Index
> Fetch the complete documentation index at: https://cometchat-22654f5b-docs-llms-scoped-indexes.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# MessageTemplateUtils & Data Source

> Customize how messages are rendered, what options appear on bubbles, and what formatters are used — all through the central MessageTemplateUtils registry.

<Accordion title="AI Integration Quick Reference">
  | Field | Value |
  | - | - |
  | Package | `cometchat_chat_uikit` |
  | Import | `import 'package:cometchat_chat_uikit/cometchat_chat_uikit.dart';` |
  | Purpose | Customize how messages are rendered, what options appear on bubbles, and what formatters are used — all through the central MessageTemplateUtils registry. |
  | Key classes | `CometChatMessageTemplate` · `CometChatMessageList` · `CometChatEmailFormatter` · `CometChatMentionsFormatter` · `CometChatPhoneNumberFormatter` |
  | v5 → v6 | `CometChatUIKit.getDataSource()` no longer exists. v6 exposes `MessageTemplateUtils`; emitting the v5 registration path does not compile. |
  | Related | [Message Template](/ui-kit/flutter/message-template) · [Message List](/ui-kit/flutter/message-list) |
</Accordion>

`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

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    // 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,
    );
    ```
  </Tab>
</Tabs>

## 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`:

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    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(),
      ],
    )
    ```
  </Tab>
</Tabs>

### 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:

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    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);
          },
        ),
      ],
    )
    ```
  </Tab>
</Tabs>

## Message Options

### Getting Default Options

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    // 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,
    );
    ```
  </Tab>
</Tabs>

### 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

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    // Get default formatters
    final formatters = MessageTemplateUtils.getDefaultTextFormatters();
    // Returns: [CometChatMentionsFormatter, CometChatEmailFormatter, CometChatPhoneNumberFormatter]
    ```
  </Tab>
</Tabs>

## Type and Category Lists

Used when building custom `MessagesRequestBuilder` instances:

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    // All registered message types
    final types = MessageTemplateUtils.getAllMessageTypes();

    // All registered message categories
    final categories = MessageTemplateUtils.getAllMessageCategories();
    ```
  </Tab>
</Tabs>

## 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 |

<Note>
  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.
</Note>

## Related

* [Message Template](/ui-kit/flutter/message-template) — Full template structure and examples.
* [Menu & Options](/ui-kit/flutter/customization-menu-options) — Component-level option customization.
* [Text Formatters](/ui-kit/flutter/customization-text-formatters) — Custom text processing.
* [Customization Overview](/ui-kit/flutter/customization-overview) — See all customization categories.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.