AI Integration Quick Reference
AI Integration Quick Reference
The two-phase contract
Each read fires up to two callbacks, always in this order:1
Cached phase
The SDK delivers a page from the local cache first, synchronously-fast. It fires even when the page is empty — an empty cached page is indistinguishable from a cache miss, by design. Render it right away.
2
Server phase
After a successful server response, the SDK delivers the server’s copy for the same slice and writes it through to the cache before the callback. Reconcile your displayed list against it. (Blocked users are the exception: their server page is delivered but not written to the cache, which keeps that list current through its own background refresh.)
- Offline, the read ends with an error. After the cached page, a read that gets no answer because the device is offline settles with
onError, codeERR_CONNECTION. A real server error reachesonErrorunchanged. The call always settles, as long as you wait for each fetch to return before starting the next one on the same request object. - The server phase never fires offline. It fires only on a genuine server response. Never treat a cached page as “end of history”; an empty cached page only means the end of the cached window.
The
listener: turns on the cache phase. The onSuccess / onError form of the same method keeps working and receives only the server result — the cached phase never fires through it. Nothing changes until you call OfflineConfig(enabled: true) (see Enable Offline Support). Minimum version 5.1.0.Read messages
MessagesRequest supports both directions. fetchPrevious pages toward older messages; fetchNext pages toward newer ones. Pass a MessageFetchListener to either.
Starting with v5.1.0, `fetchPrevious()` / `fetchNext()` accepts a
listener: parameter. Pass a `MessageFetchListener` to receive the on-device cached result. The listener: parameter requires cometchat_sdk 5.1.0 or later, so on 5.0.x keep using onSuccess/onError. With offline support off, the listener behaves exactly like the callbacks: onError is unchanged, and the server result arrives in the onServer… callback instead of onSuccess. With offline support on, the listener also delivers the cached result first, then the server result. onSuccess/onError keep working and receive only the server result. See Show Cached Data.- Dart
Read conversations
ConversationsRequest pages in one direction with fetchNext, taking a ConversationFetchListener.
Starting with v5.1.0, `fetchNext()` accepts a
listener: parameter. Pass a `ConversationFetchListener` to receive the on-device cached result. The listener: parameter requires cometchat_sdk 5.1.0 or later, so on 5.0.x keep using onSuccess/onError. With offline support off, the listener behaves exactly like the callbacks: onError is unchanged, and the server result arrives in the onServer… callback instead of onSuccess. With offline support on, the listener also delivers the cached result first, then the server result. onSuccess/onError keep working and receive only the server result. See Show Cached Data.- Dart
Read the other lists
Every remaining list read gains the same two-phase behaviour. Each has its own listener with cached/server callbacks of the matching type plusonError.
On these requests —
UsersRequest, BlockedUsersRequest, GroupsRequest, GroupMembersRequest, BannedGroupMembersRequest, ReactionsRequest, and NotificationFeedRequest — onSuccess and onError are declared required. When you drive the read with a listener:, pass onSuccess: null, onError: null and handle every result on the listener.
- Dart
ReactionsRequest caches the fetchNext direction; fetchPrevious returns the server page directly. Users, groups, members, banned members, reactions, and the notification feed are served from a per-request snapshot rather than a shared store; per-builder details live on each request’s own page and in the Configuration & API Reference.Read a single item
getConversation and getMessageDetails each deliver a two-phase result through a listener. Unlike the list reads, the cached callback fires only when the item is cached — never with an empty or null object. A cache miss goes straight to the server phase online, or straight to onError offline.
CometChat.getConversation(...)takes aConversationDetailsListener. ItsonSuccess/onErrorarerequired, so passonSuccess: null, onError: nullwhen you use the listener.- The two-phase message lookup lives on
CometChatHelper.getMessageDetails(messageId, listener: ...).
Starting with v5.1.0, `getConversation()` accepts a
listener: parameter. Pass a `ConversationDetailsListener` to receive the on-device cached result. The listener: parameter requires cometchat_sdk 5.1.0 or later, so on 5.0.x keep using onSuccess/onError. With offline support off, the listener behaves exactly like the callbacks: onError is unchanged, and the server result arrives in the onServer… callback instead of onSuccess. With offline support on, the listener also delivers the cached result first, then the server result. onSuccess/onError keep working and receive only the server result. See Show Cached Data.- Dart
Merge the two phases
The server phase replaces the same slice — it is a reconcile, not a second batch. Render the cached page straight away, then on the server phase diff it into your displayed list keyed by the item’s stable id (message id, conversation id, uid, guid). Do not append the server page to the cached one.When the cached page is empty
The cache answers a read only if every filter on it is locally computable. A single server-only predicate makes the entire cached phase return an empty list — with no error and no warning — while the server phase still answers in full. The guiding rule is better empty than wrong. The most common server-only predicate issearchKeyword, which blanks the cached phase on any request that carries a search keyword — except BlockedUsersRequest, which answers it from the cache as a substring match on the user’s name (threads, reactions and the notification feed never carry one). Other examples include hasLinks, updatesOnly, and interactionGoalCompletedOnly on MessagesRequest, setting a uid and a guid together outside a thread (one sender’s messages in a group), and the presence filters (UsersRequestBuilder.userStatus, GroupMembersRequestBuilder.status) on the entity lists.