Ground truth: cometchat_chat_uikit: ^5.2 (legacy/maintenance-only; calls via raw cometchat_calls_sdk ^5.0.2) — pub-cache source + ui-kit/flutter/v5. Official docs: https://www.cometchat.com/docs/ui-kit/flutter/v5/overview · Docs MCP: claude mcp add --transport http cometchat-docs https://www.cometchat.com/docs/mcp (or fetch the URL directly without MCP). Verify symbols against the installed package/source before relying on them.
CometChat Flutter UIKit v5 — Events
Two layers: SDK listeners (low-level) and UIKit events (high-level component coordination).
Event System Architecture
Layer 1: SDK Listeners (CometChat SDK)
Raw message/call/user/group events from the network.
Layer 2: UIKit Events (CometChat UIKit)
High-level events emitted by UIKit components for UI coordination. Use a static Map<String, Listener> pattern.
Listener Registration Pattern
All event classes follow the same register/remove pattern:
// ✅ CORRECT — register in initState, remove in dispose
class _MyWidgetState extends State<MyWidget> {
late final String _listenerId;
@override
void initState() {
super.initState();
_listenerId = 'my_widget_${DateTime.now().millisecondsSinceEpoch}';
// UIKit events
CometChatMessageEvents.addMessagesListener(_listenerId, this);
CometChatUIEvents.addUiListener(_listenerId, this);
// SDK listeners
CometChat.addMessageListener(_listenerId, this);
CometChat.addUserListener(_listenerId, this);
CometChat.addGroupListener(_listenerId, this);
CometChat.addCallListener(_listenerId, this);
}
@override
void dispose() {
CometChatMessageEvents.removeMessagesListener(_listenerId);
CometChatUIEvents.removeUiListener(_listenerId);
CometChat.removeMessageListener(_listenerId);
CometChat.removeUserListener(_listenerId);
CometChat.removeGroupListener(_listenerId);
CometChat.removeCallListener(_listenerId);
super.dispose();
}
}
For GetxController, use onInit() / onClose() instead of initState() / dispose().
UIKit Event Classes — Registration
| Class |
Register |
Remove |
CometChatMessageEvents |
addMessagesListener(id, listener) |
removeMessagesListener(id) |
CometChatUserEvents |
addUsersListener(id, listener) |
removeUsersListener(id) |
CometChatGroupEvents |
addGroupsListener(id, listener) |
removeGroupsListener(id) |
CometChatCallEvents |
addCallEventsListener(id, listener) |
removeCallEventsListener(id) |
CometChatUIEvents |
addUiListener(id, listener) |
removeUiListener(id) |
CometChatConversationEvents |
addConversationListListener(id, listener) |
removeConversationListListener(id) |
SDK Listeners — Registration
| Listener |
Register |
Remove |
| Messages |
CometChat.addMessageListener(id, this) |
CometChat.removeMessageListener(id) |
| Users (online/offline) |
CometChat.addUserListener(id, this) |
CometChat.removeUserListener(id) |
| Groups |
CometChat.addGroupListener(id, this) |
CometChat.removeGroupListener(id) |
| Calls |
CometChat.addCallListener(id, this) |
CometChat.removeCallListener(id) |
| Connection |
CometChat.addConnectionListener(id, this) |
CometChat.removeConnectionListener(id) |
Key UIKit Events (commonly used)
CometChatUIEvents:
openChat(User? user, Group? group) — request to open a chat
CometChatMessageEvents:
ccMessageSent(BaseMessage message, MessageStatus status) — message sent
ccMessageEdited(BaseMessage message, MessageEditStatus status) — message edited
ccMessageDeleted(BaseMessage message, EventStatus status) — message deleted
CometChatUserEvents:
ccUserBlocked(User user) / ccUserUnblocked(User user)
CometChatGroupEvents:
ccGroupMemberKicked, ccGroupMemberBanned, ccGroupMemberAdded, ccOwnershipChanged
CometChatCallEvents:
ccOutgoingCall(Call), ccCallAccepted(Call), ccCallRejected(Call), ccCallEnded(Call)
UIKit Events vs SDK Listeners
- UIKit events — react to UIKit-level actions (message sent via composer, group created via UI, user blocked via UI)
- SDK listeners — raw network events (message received, user online/offline, group member joined)
- UIKit components internally use both
Gotchas
Unique Listener IDs
// ❌ WRONG — hardcoded ID
CometChat.addMessageListener('messages', this);
// ✅ CORRECT — unique ID
final id = 'messages_${DateTime.now().millisecondsSinceEpoch}';
CometChat.addMessageListener(id, this);
Always Remove in dispose()
// ❌ WRONG — listener leaks
@override
void dispose() {
super.dispose();
}
// ✅ CORRECT
@override
void dispose() {
CometChat.removeMessageListener(_listenerId);
super.dispose();
}
Never Register in build()
// ❌ WRONG — called every rebuild
@override
Widget build(BuildContext context) {
CometChat.addMessageListener(id, this);
return Container();
}
Checklist — Events
1---2name: cometchat-flutter-v5-events3description: Use when working with CometChat Flutter UIKit v5 event system. Triggers on CometChatMessageEvents, CometChatUserEvents, CometChatGroupEvents, CometChatCallEvents, CometChatUIEvents, listeners.4license: MIT5---67> **Ground truth:** `cometchat_chat_uikit: ^5.2` (legacy/maintenance-only; calls via raw `cometchat_calls_sdk ^5.0.2`) — pub-cache source + `ui-kit/flutter/v5`. **Official docs:** https://www.cometchat.com/docs/ui-kit/flutter/v5/overview · **Docs MCP:** `claude mcp add --transport http cometchat-docs https://www.cometchat.com/docs/mcp` (or fetch the URL directly without MCP). Verify symbols against the installed package/source before relying on them.89# CometChat Flutter UIKit v5 — Events1011Two layers: SDK listeners (low-level) and UIKit events (high-level component coordination).1213## Event System Architecture1415### Layer 1: SDK Listeners (CometChat SDK)16Raw message/call/user/group events from the network.1718### Layer 2: UIKit Events (CometChat UIKit)19High-level events emitted by UIKit components for UI coordination. Use a static `Map<String, Listener>` pattern.2021## Listener Registration Pattern2223All event classes follow the same register/remove pattern:2425```dart26// ✅ CORRECT — register in initState, remove in dispose27class _MyWidgetState extends State<MyWidget> {28 late final String _listenerId;2930 @override31 void initState() {32 super.initState();33 _listenerId = 'my_widget_${DateTime.now().millisecondsSinceEpoch}';3435 // UIKit events36 CometChatMessageEvents.addMessagesListener(_listenerId, this);37 CometChatUIEvents.addUiListener(_listenerId, this);3839 // SDK listeners40 CometChat.addMessageListener(_listenerId, this);41 CometChat.addUserListener(_listenerId, this);42 CometChat.addGroupListener(_listenerId, this);43 CometChat.addCallListener(_listenerId, this);44 }4546 @override47 void dispose() {48 CometChatMessageEvents.removeMessagesListener(_listenerId);49 CometChatUIEvents.removeUiListener(_listenerId);50 CometChat.removeMessageListener(_listenerId);51 CometChat.removeUserListener(_listenerId);52 CometChat.removeGroupListener(_listenerId);53 CometChat.removeCallListener(_listenerId);54 super.dispose();55 }56}57```5859For GetxController, use `onInit()` / `onClose()` instead of `initState()` / `dispose()`.6061## UIKit Event Classes — Registration6263| Class | Register | Remove |64|-------|----------|--------|65| `CometChatMessageEvents` | `addMessagesListener(id, listener)` | `removeMessagesListener(id)` |66| `CometChatUserEvents` | `addUsersListener(id, listener)` | `removeUsersListener(id)` |67| `CometChatGroupEvents` | `addGroupsListener(id, listener)` | `removeGroupsListener(id)` |68| `CometChatCallEvents` | `addCallEventsListener(id, listener)` | `removeCallEventsListener(id)` |69| `CometChatUIEvents` | `addUiListener(id, listener)` | `removeUiListener(id)` |70| `CometChatConversationEvents` | `addConversationListListener(id, listener)` | `removeConversationListListener(id)` |7172## SDK Listeners — Registration7374| Listener | Register | Remove |75|----------|----------|--------|76| Messages | `CometChat.addMessageListener(id, this)` | `CometChat.removeMessageListener(id)` |77| Users (online/offline) | `CometChat.addUserListener(id, this)` | `CometChat.removeUserListener(id)` |78| Groups | `CometChat.addGroupListener(id, this)` | `CometChat.removeGroupListener(id)` |79| Calls | `CometChat.addCallListener(id, this)` | `CometChat.removeCallListener(id)` |80| Connection | `CometChat.addConnectionListener(id, this)` | `CometChat.removeConnectionListener(id)` |8182## Key UIKit Events (commonly used)8384**CometChatUIEvents:**85- `openChat(User? user, Group? group)` — request to open a chat8687**CometChatMessageEvents:**88- `ccMessageSent(BaseMessage message, MessageStatus status)` — message sent89- `ccMessageEdited(BaseMessage message, MessageEditStatus status)` — message edited90- `ccMessageDeleted(BaseMessage message, EventStatus status)` — message deleted9192**CometChatUserEvents:**93- `ccUserBlocked(User user)` / `ccUserUnblocked(User user)`9495**CometChatGroupEvents:**96- `ccGroupMemberKicked`, `ccGroupMemberBanned`, `ccGroupMemberAdded`, `ccOwnershipChanged`9798**CometChatCallEvents:**99- `ccOutgoingCall(Call)`, `ccCallAccepted(Call)`, `ccCallRejected(Call)`, `ccCallEnded(Call)`100101## UIKit Events vs SDK Listeners102103- **UIKit events** — react to UIKit-level actions (message sent via composer, group created via UI, user blocked via UI)104- **SDK listeners** — raw network events (message received, user online/offline, group member joined)105- UIKit components internally use both106107## Gotchas108109### Unique Listener IDs110```dart111// ❌ WRONG — hardcoded ID112CometChat.addMessageListener('messages', this);113114// ✅ CORRECT — unique ID115final id = 'messages_${DateTime.now().millisecondsSinceEpoch}';116CometChat.addMessageListener(id, this);117```118119### Always Remove in dispose()120```dart121// ❌ WRONG — listener leaks122@override123void dispose() {124 super.dispose();125}126127// ✅ CORRECT128@override129void dispose() {130 CometChat.removeMessageListener(_listenerId);131 super.dispose();132}133```134135### Never Register in build()136```dart137// ❌ WRONG — called every rebuild138@override139Widget build(BuildContext context) {140 CometChat.addMessageListener(id, this);141 return Container();142}143```144145## Checklist — Events146147- [ ] Listener ID is unique (use timestamp or hashCode)148- [ ] Listener registered in `initState()` / `onInit()`, not `build()`149- [ ] Listener removed in `dispose()` / `onClose()` with same ID150- [ ] UIKit events for UI coordination, SDK listeners for raw events151- [ ] `subscriptionType` set in UIKitSettings for presence events to work