> ## Documentation Index
> Fetch the complete documentation index at: https://www.cometchat.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# All Real Time Listeners

> Handle CometChat real-time events in Flutter apps with user, group, and message listeners for presence, membership, and messages.

CometChat provides 4 listeners viz.

1. [UserListener](#user-listener)
2. [GroupListener](#group-listener)
3. [MessageListener](#message-listener)
4. [AIAssistantListener](#ai-assistant-listener)

## User Listener

The `UserListener` class provides you with live events related to users. Below are the callback methods provided by the `UserListener` class.

| Method                     | Information                                                                                                                                                                |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `onUserOnline(User user)`  | This method is triggered when a user comes online and is available to chat. The details of the user can be obtained from the user object received as the method parameter. |
| `onUserOffline(User user)` | This method is triggered when a user goes offline. The details of the user can be obtained from the User object received as the parameter.                                 |

To add the `UserListener`, you need to use the `addUserListener()` method provided by the `CometChat` class.

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    class Class_Name with UserListener {
      //CometChat.addUserListener("user_Listener_id", this);
    	@override
      void onUserOnline(User user) {

      }

      @override
      void onUserOffline(User user) {

      }

    }
    ```
  </Tab>
</Tabs>

where `UNIQUE_LISTENER_ID` is the unique identifier for the listener. Please make sure that no two listeners are added with the same listener id as this could lead to unexpected behavior resulting in loss of events.

Once the activity/fragment where the `UserListener` is declared is not in use, you need to remove the listener using the `removeUserListener()` method which takes the id of the listener to be removed as the parameter. We suggest you call this method in the `onPause()` method of the activity/fragment.

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    CometChat.removeUserListener(UNIQUE_LISTENER_ID)
    ```
  </Tab>
</Tabs>

## Group Listener

The `GroupListener` class provides you with all the real-time events related to groups. Below are the callback methods provided by the `GroupListener` class.

| Method                                                                                                                                    | Information                                                                                                                                    |
| ----------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `onGroupMemberJoined(Action action, User joinedUser, Group joinedGroup)`                                                                  | This method is triggered when a user joins any group. All the members present in the group will receive this event.                            |
| `onGroupMemberLeft(Action action, User leftUser, Group leftGroup)`                                                                        | This method is triggered when a user who was a member of any group leaves the group. All the members of the group receive this event.          |
| `onGroupMemberKicked(Action action, User kickedUser, User kickedBy, Group kickedFrom)`                                                    | This method is triggered when a user is kicked from a group. All the members including the user receive this event                             |
| `onGroupMemberBanned(Action action, User bannedUser, User bannedBy, Group bannedFrom)`                                                    | This method is triggered when a user is banned from a group. All the members including the user receive this event                             |
| `onGroupMemberUnbanned(Action action, User unbannedUser, User unbannedBy, Group unbannedFrom)`                                            | This method is triggered when a user is banned from a group. All the members of the group receive this event.                                  |
| `onGroupMemberScopeChanged(Action action, User updatedBy, User updatedUser, String scopeChangedTo, String scopeChangedFrom, Group group)` | This method is triggered when the scope of any Group Member has been changed. All the members that are a part of that group receive this event |
| `onMemberAddedToGroup(Action action, User addedBy, User userAdded, Group addedTo)`                                                        | This method is triggered when a user is added to any group. All the members including the user himself receive this event.                     |

To add the `GroupListener`, you need to use the `addGroupListener()` method provided by the `CometChat` class.

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    class Class_Name with GroupListener {
      //CometChat.addGroupListener("UNIQUE_LISTENER_ID", this);

      @override
      void onGroupMemberJoined(Action action, User joinedUser, Group joinedGroup) {

      }

      @override
      void onGroupMemberLeft(Action action, User leftUser, Group leftGroup) {

      }

      @override
      void onGroupMemberKicked(Action action, User kickedUser, User kickedBy, Group kickedFrom) {

      }

      @override
      void onGroupMemberBanned(Action action, User bannedUser, User bannedBy, Group bannedFrom) {

      }

      @override
      void onGroupMemberUnbanned(Action action, User unbannedUser, User unbannedBy, Group unbannedFrom) {

      }

      @override
      void onGroupMemberScopeChanged(Action action, User updatedBy, User updatedUser, String scopeChangedTo, String scopeChangedFrom, Group group) {

      }

      @override
      void onMemberAddedToGroup(Action action, User addedby, User userAdded, Group addedTo) {

      }

    }
    ```
  </Tab>
</Tabs>

where `UNIQUE_LISTENER_ID` is the unique identifier for the listener. Please make sure that no two listeners are added with the same listener id as this could lead to unexpected behavior resulting in loss of events.

Once the activity/fragment where the `GroupListener` is declared is not in use, you need to remove the listener using the `removeGroupListener()` method which takes the id of the listener to be removed as the parameter. We suggest you call this method in the `onPause()` method of the activity/fragment.

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    CometChat.removeGroupListener(UNIQUE_LISTENER_ID)
    ```
  </Tab>
</Tabs>

## Message Listener

The `MessageListener` class provides you with live events related to messages. Below are the callback methods provided by the `MessageListener` class.

| Method                                                          | Information                                                                                             |
| --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
| `onTextMessageReceived(TextMessage message)`                    | This event is triggered when a Text Message is received.                                                |
| `onMediaMessageReceived(MediaMessage message)`                  | This event is triggered when a Media Message is received.                                               |
| `onCustomMessageReceived(CustomMessage message)`                | This event is triggered when a Custom Message is received.                                              |
| `onTypingStarted(TypingIndicator typingIndicator)`              | This event is triggered when a user starts typing in a user/group conversation                          |
| `onTypingEnded(TypingIndicator typingIndicator)`                | This event is triggered when a user stops typing in a user/group conversation.                          |
| `onMessagesDelivered(MessageReceipt messageReceipt)`            | This event is triggered when a set of messages are marked as delivered for any particular conversation. |
| `onMessagesRead(MessageReceipt messageReceipt)`                 | This event is triggered when a set of messages are marked as read for any particular conversation.      |
| `onMessageEdited(BaseMessage message)`                          | This method is triggered when a particular message has been edited in a user/group conversation.        |
| `onMessageDeleted(BaseMessage message)`                         | This event is triggered when a particular message is deleted in a user/group conversation.              |
| `onInteractiveMessageReceived(InteractiveMessage message)`      | This event is triggered when an Interactive Message is received.                                        |
| `onCardMessageReceived(CardMessage message)`                    | This event is triggered when a Card Message is received.                                                |
| `onInteractionGoalCompleted(InteractionReceipt receipt)`        | This event is triggered when an interaction Goal is achieved.                                           |
| `onTransientMessageReceived(TransientMessage transientMessage)` | This event is triggered when a Transient Message is received.                                           |
| `onMessageReactionAdded(ReactionEvent reactionEvent)`           | This event is triggered when a reaction is added to a message in a user/group conversation.             |
| `onMessageReactionRemoved(ReactionEvent reactionEvent)`         | This event is triggered when a reaction is remove from a message in a user/group conversation.          |
| `onAIAssistantMessageReceived(AIAssistantMessage message)`      | This event is triggered when a persisted AI Assistant message is received after a run completes.        |
| `onAIToolResultReceived(AIToolResultMessage message)`           | This event is triggered when an AI tool result message is received.                                     |
| `onAIToolArgumentsReceived(AIToolArgumentMessage message)`      | This event is triggered when AI tool argument messages are received.                                    |

To add the `MessageListener`, you need to use the `addMessageListener()` method provided by the `CometChat` class.

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    class Class_Name with MessageListener {

      //CometChat.addMessageListener("listenerId", this);
    	@override
      void onTextMessageReceived(TextMessage textMessage) {

      }

      @override
      void onMediaMessageReceived(MediaMessage mediaMessage) {

      }

      @override
      void onCustomMessageReceived(CustomMessage customMessage) {

      }

        @override
      void onTypingStarted(TypingIndicator typingIndicator) {

      }

      @override
      void onTypingEnded(TypingIndicator typingIndicator) {

      }


      @override
      void onMessagesDelivered(MessageReceipt messageReceipt) {

      }

      @override
      void onMessagesRead(MessageReceipt messageReceipt) {

      }

      @override
      void onMessageEdited(BaseMessage message) {

      }

      @override
      void onMessageDeleted(BaseMessage message) {

      }

      @override
      void onInteractionGoalCompleted(InteractionReceipt receipt) {


      }

      @override
      void onInteractiveMessageReceived(InteractiveMessage message) {

      }

      @override
      void onCardMessageReceived(CardMessage cardMessage) {

      }


      @override
      void onTransientMessageReceived(TransientMessage transientMessage) {

      }

      @override
      void onMessageReactionAdded(ReactionEvent reactionEvent) {

      }

      @override
      void onMessageReactionRemoved(ReactionEvent reactionEvent) {

      }

      @override
      void onAIAssistantMessageReceived(AIAssistantMessage aiAssistantMessage) {

      }

      @override
      void onAIToolResultReceived(AIToolResultMessage aiToolResultMessage) {

      }

      @override
      void onAIToolArgumentsReceived(AIToolArgumentMessage aiToolArgumentMessage) {

      }

    }
    ```
  </Tab>
</Tabs>

where `UNIQUE_LISTENER_ID` is the unique identifier for the listener. Please make sure that no two listeners are added with the same listener id as this could lead to unexpected behavior resulting in loss of events.

Once the activity/fragment where the `MessageListener` is declared is not in use, you need to remove the listener using the `removeMessageListener()` method which takes the id of the listener to be removed as the parameter. We suggest you call this method in the `onPause()` method of the activity/fragment.

## AI Assistant Listener

The `AIAssistantListener` class provides you with real-time streaming events from AI Agent runs. These events are emitted during a run lifecycle and include tool calls, card generation, and text message streaming. For a complete overview of the event lifecycle, see [AI Agents](/sdk/flutter/ai-agents).

| Method                                                   | Information                                                                                                                                  |
| -------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| `onAIAssistantEventReceived(AIAssistantBaseEvent event)` | This event is triggered for every AI assistant streaming event during a run (run start/finish, tool calls, card generation, text streaming). |

To add the `AIAssistantListener`, use the `addAIAssistantListener()` method provided by the `CometChat` class.

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    class Class_Name with AIAssistantListener {
      CometChat.addAIAssistantListener("UNIQUE_LISTENER_ID", this);

      @override
      void onAIAssistantEventReceived(AIAssistantBaseEvent event) {
        // Handle different event types
        if (event is AIAssistantRunStartedEvent) {
          debugPrint("Run started: ${event.id}");
        } else if (event is AIAssistantToolStartedEvent) {
          debugPrint("Tool call started");
        } else if (event is AIAssistantCardStartedEvent) {
          debugPrint("Card generation started: ${event.cardId}");
        } else if (event is AIAssistantCardReceivedEvent) {
          final cardPayload = event.getCard();
          debugPrint("Card received: ${event.cardId}");
        } else if (event is AIAssistantCardEndedEvent) {
          debugPrint("Card ended: ${event.cardId}");
        } else if (event is AIAssistantContentReceivedEvent) {
          debugPrint("Streaming content delta: ${event.delta}");
        } else if (event is AIAssistantMessageEndedEvent) {
          debugPrint("Message streaming ended");
        } else if (event is AIAssistantRunFinishedEvent) {
          debugPrint("Run finished: ${event.id}");
        }
      }
    }
    ```
  </Tab>
</Tabs>

To remove the listener:

<Tabs>
  <Tab title="Dart">
    ```dart theme={null}
    CometChat.removeAIAssistantListener("UNIQUE_LISTENER_ID");
    ```
  </Tab>
</Tabs>

<Note>
  The `AIAssistantListener` delivers real-time streaming events. After a run completes, persisted agentic messages (`AIAssistantMessage`, `AIToolResultMessage`, `AIToolArgumentMessage`) are delivered via the `MessageListener` callbacks listed above.
</Note>
