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

# Threaded Messages

> Send, receive, and fetch CometChat threaded messages in Flutter apps using parent message IDs.

<Accordion title="AI Integration Quick Reference">
  | Field              | Value                                                                                                                                                                                                                                                                                                 |
  | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | Package            | `cometchat_sdk`                                                                                                                                                                                                                                                                                       |
  | Import             | `import 'package:cometchat_sdk/cometchat_sdk.dart';`                                                                                                                                                                                                                                                  |
  | Purpose            | Send, receive, and fetch CometChat threaded messages in Flutter apps using parent message IDs.                                                                                                                                                                                                        |
  | Key methods        | `addMessageListener()` · `sendMessage()`                                                                                                                                                                                                                                                              |
  | Key classes        | `TextMessage` · `CometChatException` · `BaseMessage` · `CustomMessage` · `MediaMessage` · `CometChatConversationType` · `CometChatMessageType`                                                                                                                                                        |
  | Listener callbacks | `onCustomMessageReceived()` · `onMediaMessageReceived()` · `onTextMessageReceived()`                                                                                                                                                                                                                  |
  | Prerequisites      | SDK initialised via [`CometChat.init()`](/sdk/flutter/setup) and a logged-in user via [`CometChat.login()`](/sdk/flutter/authentication-overview).                                                                                                                                                    |
  | Constraints        | `onSuccess` and `onError` are **both required** — omitting either is a compile error, and awaiting the call alone gives you nothing to act on. Put the success path inside `onSuccess`.                                                                                                               |
  | Related            | [Send A Message](/sdk/flutter/send-message) · [Receive A Message](/sdk/flutter/receive-messages)                                                                                                                                                                                                      |
  | Full reference     | [`TextMessage`](/sdk/reference/messages#textmessage) · [`CometChatException`](/sdk/reference/auxiliary#cometchatexception) · [`BaseMessage`](/sdk/reference/messages#basemessage) · [`CustomMessage`](/sdk/reference/messages#custommessage) · [`MediaMessage`](/sdk/reference/messages#mediamessage) |
</Accordion>

Messages that are started from a particular message are called Threaded messages or simply threads.
Each Thread is attached to a message which is the Parent message for that thread.

## Send Message in a Thread

As mentioned in the [Send a Message](/sdk/flutter/send-message) section, you can send a message to a User or a Group by mentioning the receiver (uid/guid) and `receiverType`(user/group).

A message can be categorized as:

1. Text Message
2. Media Message
3. Custom Message.
4. Interactive Message

Any of the above messages can be sent in a thread. As a thread is identified with a parent message, the `parentMessageId` must be set for the message. This will indicate that the message to be sent has to be a part of the thread of the message with the specified `parentMessageId`.

This can be achieved using the `parentMessageId` parameter provided by the object of the `TextMessage`, `MediaMessage` and `CustomMessage` class. The id specified in the `parentMessageId` parameter maps the message sent to the particular thread.

**Example to Send a Text Message in a thread in a user conversation.**

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    String receiverID = "UID";
    String messagesText = "Hello";
    String receiverType = CometChatConversationType.user;
    String type = CometChatMessageType.text;

    TextMessage textMessage = TextMessage(
                            text: messagesText,
                            receiverUid: receiverID,
                            receiverType: receiverType,
                            type: type);
    textMessage.parentMessageId = 103

    CometChat.sendMessage(textMessage,onSuccess: (TextMessage message) {
    debugPrint("Message sent successfully:  $message");
    }, onError: (CometChatException e) {
    debugPrint("Message sending failed with exception:  ${e.message}");
    });
    ```
  </Tab>
</Tabs>

The above snippet shows how a message with the text "Hello" can be sent in the thread with `parentMessageId` 103.

Similarly, using the `parentMessageId` parameter, Media and Custom Messages can be sent in threads too.

### Receiving Real-Time Messages

The procedure to receive real-time messages is exactly the same as mentioned in the [Receive Messages](/sdk/flutter/receive-messages). This can be achieved using the `MessageListener` class provided by the SDK.
To add a MessageListener, you can use the `addMessageListener()` method of the SDK.
The only thing that needs to be checked is if the received message belongs to the active thread. This can be done using `parentMessageId` field of the message object.

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    class Class_Name  with MessageListener {
    	int activeParentMessageId= 103;
    //CometChat.addMessageListener("listenerId", this);
    	@override
    void onTextMessageReceived(TextMessage textMessage) {
       if(textMessage.parentMessageId == activeParentMessageId){
          debugPrint("Text message received successfully: $textMessage");
      }

    }

    @override
    void onMediaMessageReceived(MediaMessage mediaMessage) {
      if(mediaMessage.parentMessageId== activeParentMessageId){
      	debugPrint("Media message received successfully: $mediaMessage");
      }
    }

    @override
    void onCustomMessageReceived(CustomMessage customMessage) {
      if(customMessage.parentMessageId== activeParentMessageId){
        debugPrint("Custom message received successfully: $customMessage");
      }
    }
    }
    ```
  </Tab>
</Tabs>

### Fetch all the messages for any particular thread.

You can fetch all the messages belonging to a particular thread by using the `MessagesRequest` class.

The `MessageRequestBuilder` builds the `MessageRequest` object using the following functions:

1. parentMessageId: Takes the parentId of the message as argument whose thread needs to be requested.
2. build(): returns the MessageRequest object.

Once you have the `MessagesRequest` object, you can call the `fetchPrevious()` method to get the latest messages in the thread. In one iteration, a maximum of 100 messages can be fetched. If you wish to fetch the next set of messages, you need to call the fetchPrevious() method again on the same object.

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    String UID = "cometchat-uid-1";

    MessagesRequest messageRequest = (MessagesRequestBuilder()
              ..uid = UID
              ..parentMessageId = 103
              ..limit = 50).build();

    messageRequest.fetchPrevious(onSuccess: (List<BaseMessage> list) {
             debugPrint("Message fetching Successful");
          }, onError: (CometChatException e) {
            debugPrint("Message fetching failed with exception: ${e.message}");
          });
    ```
  </Tab>
</Tabs>

## Avoid Threaded Messages in User/Group Conversations

While fetching messages for normal user/group conversations using the `MessagesRequest`, the threaded messages by default will be a part of the list of messages received. In order to exclude the threaded messages from the list of user/group messages, you need to use the `hideReplies` parameter of the `MessagesRequestBuilder` class. This method takes a boolean argument which when set to true excludes the messages belonging to threads from the list of messages.

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    String UID = "cometchat-uid-1";

    MessagesRequest messageRequest = (MessagesRequestBuilder()
              ..uid = UID
              ..hideReplies = true
              ..limit = 50).build();

    messageRequest.fetchNext(onSuccess: (List<BaseMessage> list) {
             debugPrint("Message fetching Successful");
          }, onError: (CometChatException e) {
            debugPrint("Message fetching failed with exception: ${e.message}");
          });
    ```
  </Tab>
</Tabs>

The above snippet will return messages between the logged in user and `cometchat-uid-1` excluding all the threaded messages belonging to the same conversation.
