cometchat-flutter-v5-events — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited cometchat-flutter-v5-events (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Ground truth:cometchat_chat_uikit: ^5.2(legacy/maintenance-only; calls via rawcometchat_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.
Two layers: SDK listeners (low-level) and UIKit events (high-level component coordination).
Raw message/call/user/group events from the network.
High-level events emitted by UIKit components for UI coordination. Use a static Map<String, Listener> 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().
| 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) |
| 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) |
CometChatUIEvents:
openChat(User? user, Group? group) — request to open a chatCometChatMessageEvents:
ccMessageSent(BaseMessage message, MessageStatus status) — message sentccMessageEdited(BaseMessage message, MessageEditStatus status) — message editedccMessageDeleted(BaseMessage message, EventStatus status) — message deletedCometChatUserEvents:
ccUserBlocked(User user) / ccUserUnblocked(User user)CometChatGroupEvents:
ccGroupMemberKicked, ccGroupMemberBanned, ccGroupMemberAdded, ccOwnershipChangedCometChatCallEvents:
ccOutgoingCall(Call), ccCallAccepted(Call), ccCallRejected(Call), ccCallEnded(Call)// ❌ WRONG — hardcoded ID
CometChat.addMessageListener('messages', this);
// ✅ CORRECT — unique ID
final id = 'messages_${DateTime.now().millisecondsSinceEpoch}';
CometChat.addMessageListener(id, this);// ❌ WRONG — listener leaks
@override
void dispose() {
super.dispose();
}
// ✅ CORRECT
@override
void dispose() {
CometChat.removeMessageListener(_listenerId);
super.dispose();
}// ❌ WRONG — called every rebuild
@override
Widget build(BuildContext context) {
CometChat.addMessageListener(id, this);
return Container();
}initState() / onInit(), not build()dispose() / onClose() with same IDsubscriptionType set in UIKitSettings for presence events to work~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.