cometchat-flutter-v6-troubleshooting — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited cometchat-flutter-v6-troubleshooting (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: ^6.0— pub-cache source +ui-kit/flutter. Official docs: https://www.cometchat.com/docs/ui-kit/flutter/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.
Comprehensive guide for diagnosing and fixing CometChat Flutter UIKit v6 integration problems.
Use this decision tree to jump to the right section:
What's happening?
│
├─ App crashes or errors on startup
│ └─ Go to → Section 2: Init & Login Errors
│
├─ UI looks wrong, layout broken, keyboard issues
│ └─ Go to → Section 3: UI Rendering Issues
│
├─ Calls not working, call screen blank or stuck
│ ├─ Outgoing screen NEVER renders (peer rings, caller shows nothing) → Section 4.7 (V6 navigatorKey trap)
│ ├─ Stuck on "Calling…" after peer accepts → Section 4.8 (upgrade to 6.0.1)
│ └─ Otherwise → Section 4: Call Issues
│
├─ Events not firing, duplicate events, memory leaks
│ └─ Go to → Section 5: Listener Issues
│
├─ Build fails on Android or iOS
│ └─ Go to → Section 6: Build Errors
│
├─ App is slow, janky scrolling, laggy keyboard
│ └─ Go to → Section 7: Performance Issues
│
└─ Platform-specific weirdness (Android/iOS/Web)
└─ Go to → Section 8: Platform-Specific IssuesAuthentication null or Please log in to CometChat before calling this method when using any CometChat component or SDK call.CometChatUIKit.init() was not called, or was called but not awaited before using components or calling login.init() completes before any other CometChat usage:// ✅ CORRECT — await init before anything else
final settings = (UIKitSettingsBuilder()
..appId = 'APP_ID'
..region = 'us'
..authKey = 'AUTH_KEY'
..subscriptionType = CometChatSubscriptionType.allUsers)
.build();
await CometChatUIKit.init(
uiKitSettings: settings,
onSuccess: (_) => debugPrint('Init done'),
onError: (e) => debugPrint('Init failed: ${e.message}'),
);
// ❌ WRONG — login before init completes (race condition)
CometChatUIKit.init(uiKitSettings: settings);
CometChatUIKit.login('uid');APP ID null or appId is required during init.appId not set in UIKitSettingsBuilder.appId before calling .build():final settings = (UIKitSettingsBuilder()
..appId = 'YOUR_APP_ID' // ← Must be set
..region = 'us'
..authKey = 'YOUR_AUTH_KEY')
.build();ERR_ALREADY_LOGGED_IN when calling CometChatUIKit.login().init(), the SDK restores cached sessions automatically.CometChatUIKit.loggedInUser after init before calling login:CometChatUIKit.init(
uiKitSettings: settings,
onSuccess: (_) {
if (CometChatUIKit.loggedInUser != null) {
// Already logged in — skip login, go to home
navigateToHome();
} else {
// No session — show login screen
navigateToLogin();
}
},
);Android internal error message.CometChat.login(uid, authKey) directly to isolate UIKit vs SDK issueCometChat.getLoggedInUser() after init instead of the synchronous CometChatUIKit.loggedInUser. The callback API silently fails when no session exists — neither onSuccess nor onError fires.// ✅ CORRECT — synchronous check, always resolves
CometChatUIKit.init(
uiKitSettings: settings,
onSuccess: (_) {
final hasUser = CometChatUIKit.loggedInUser != null;
setState(() {
_loggedIn = hasUser;
_initializing = false;
});
},
);
// ❌ WRONG — callback may never fire when no session exists
CometChatUIKit.init(
uiKitSettings: settings,
onSuccess: (_) {
CometChat.getLoggedInUser(
onSuccess: (user) { /* may never fire */ },
onError: (e) { /* may never fire */ },
);
},
);
// ❌ ALSO WRONG — redundant native bridge round-trip
CometChatUIKit.init(
uiKitSettings: settings,
onSuccess: (_) async {
final user = await CometChatUIKit.getLoggedInUser(); // Unnecessary!
},
);ERR_INVALID_REGION.'us', 'eu', 'in':// ✅ CORRECT
..region = 'us'
// ❌ WRONG
..region = 'US'
..region = 'United States'StateError: not initialized when creating a BLoC manually.ServiceLocator.instance.setup() was not called before creating the BLoC. UIKit widgets do this automatically, but manual BLoC creation requires it.// ✅ CORRECT
ConversationsServiceLocator.instance.setup();
final bloc = ConversationsBloc(
getLoggedInUserUseCase: ConversationsServiceLocator.instance.getLoggedInUserUseCase,
);
// ❌ WRONG — setup not called
final bloc = ConversationsBloc(
getLoggedInUserUseCase: ConversationsServiceLocator.instance.getLoggedInUserUseCase,
);viewInsets, so a Scaffold with resizeToAvoidBottomInset: true (the default) double-compensated. On ^6.0.1 the composer clamps to viewInsets, so true is correct and does NOT double-compensate.resizeToAvoidBottomInset: true (or omit it — true is the default). Setting false is only a stopgap on old kits you can't upgrade.// ✅ CORRECT on ^6.0.1 — true (or omit; true is the default). Composer clamps
// to viewInsets (ENG-34434), so no double-compensation.
Scaffold(
resizeToAvoidBottomInset: true,
body: Column(
children: [
Expanded(child: CometChatMessageList(user: user)),
CometChatMessageComposer(user: user),
],
),
)
// ⚠ PRE-6.0.1 STOPGAP ONLY — false suppresses the double gap on kits that
// predate the ENG-34434 clamp. Prefer upgrading the kit.
Scaffold(
resizeToAvoidBottomInset: false,
body: Column(
children: [
Expanded(child: CometChatMessageList(user: user)),
CometChatMessageComposer(user: user),
],
),
)This applies everywhere the composer is used: messages screen, thread screen, or any custom screen.
widget.user or widget.group directly to UIKit components instead of maintaining mutable state that updates from listeners._user/_group in your State class and update from SDK listeners:class _MessagesScreenState extends State<MessagesScreen> {
late User? _user;
late Group? _group;
@override
void initState() {
super.initState();
_user = widget.user;
_group = widget.group;
// Register listeners to update _user/_group on changes
}
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: true, // ^6.0.1: composer clamps to viewInsets (ENG-34434)
body: Column(
children: [
Expanded(child: CometChatMessageList(user: _user, group: _group)),
CometChatMessageComposer(user: _user, group: _group),
],
),
);
}
}subscriptionType was not set in UIKitSettingsBuilder. Omitting it silently disables all presence events.subscriptionType:// ✅ CORRECT
UIKitSettingsBuilder()
..appId = 'APP_ID'
..region = 'us'
..authKey = 'AUTH_KEY'
..subscriptionType = CometChatSubscriptionType.allUsers
// ❌ WRONG — no error, but presence events never fire
UIKitSettingsBuilder()
..appId = 'APP_ID'
..region = 'us'
..authKey = 'AUTH_KEY'
// subscriptionType missing!subscriptionType not set (see 3.3)subscriptionType is set in UIKitSettingsCometChatMessageList widget is mounted and not disposedCometChat.addMessageListener() in its constructor and removes it in close()CometChatThemeHelper.getColorPalette(context), etc.) are being looked up inside build(). During keyboard animation, MediaQuery changes trigger rebuilds, and each lookup does expensive InheritedWidget traversal (44–95ms instead of <16ms).didChangeDependencies() with a _themeInitialized flag:// ✅ CORRECT — cache once, reuse on every build
class _MyWidgetState extends State<MyWidget> {
late CometChatColorPalette _colorPalette;
late CometChatSpacing _spacing;
late CometChatTypography _typography;
bool _themeInitialized = false;
@override
void didChangeDependencies() {
super.didChangeDependencies();
if (!_themeInitialized) {
_colorPalette = CometChatThemeHelper.getColorPalette(context);
_spacing = CometChatThemeHelper.getSpacing(context);
_typography = CometChatThemeHelper.getTypography(context);
_themeInitialized = true;
}
}
@override
Widget build(BuildContext context) {
// Use _colorPalette, _spacing, _typography — no lookups here
return Container(color: _colorPalette.primary);
}
}
// ❌ WRONG — lookup in build causes jank during keyboard animation
@override
Widget build(BuildContext context) {
final colors = CometChatThemeHelper.getColorPalette(context); // Expensive!
return Container(color: colors.primary);
}MediaQuery.paddingOf(context).bottom once in didChangeDependencies(). Never wrap the composer in an extra SafeArea widget — CometChatMessageComposer already handles bottom inset internally via SliverSpacing:// ✅ CORRECT — cache safe area once, no extra SafeArea wrapper
class _MessagesScreenState extends State<MessagesScreen> {
double _bottomSafeArea = 0;
@override
void didChangeDependencies() {
super.didChangeDependencies();
_bottomSafeArea = MediaQuery.paddingOf(context).bottom;
}
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: true, // ^6.0.1: composer clamps to viewInsets (ENG-34434)
body: Column(
children: [
Expanded(child: CometChatMessageList(user: widget.user)),
CometChatMessageComposer(user: widget.user), // No SafeArea wrapper!
],
),
);
}
}
// ❌ WRONG — SafeArea wrapper adds bottom padding the composer already handles
Scaffold(
resizeToAvoidBottomInset: true,
body: Column(
children: [
Expanded(child: CometChatMessageList(user: widget.user)),
SafeArea( // ← Causes extra white gap when keyboard opens
child: CometChatMessageComposer(user: widget.user),
),
],
),
)auth token null or similar authentication error when trying to start a call.cometchat-flutter-v6-calls §1.0)...enableCalls = true is set on UIKitSettingsBuilder, CallEventService handles both CometChatUIKitCalls.init() and CometChatUIKitCalls.loginWithAuthToken() internally — chat init must complete first. For manual integrations, gate calls init on chat init success:// ✅ CORRECT — chat init first, calls init in onSuccess
await CometChatUIKit.init(
uiKitSettings: settings,
onSuccess: (_) async {
// For manual calls integration (no ..enableCalls = true):
// CometChatUIKitCalls.init takes raw appId + region STRINGS (not a settings
// builder) and reports via callbacks — verified vs cometchat_uikit_calls.dart:9.
CometChatUIKitCalls.init(
'APP_ID',
'us',
onSuccess: (_) {},
onError: (e) => debugPrint('Calls init failed: $e'),
);
},
onError: (e) => debugPrint('Chat init failed: ${e.message}'),
);
// ❌ WRONG — calls init runs before chat init completes
CometChatUIKit.init(uiKitSettings: settings); // not awaited
await CometChatUIKitCalls.init(callAppSettings); // auth token nullsession already started when trying to join or start a call.cometchat-flutter-v6-calls). Calling init more than once (e.g., from multiple bootstrap paths, hot-restart with stale state) emits this error.// ✅ CAUSE (a) — single-init guard at app boot
bool _callsInitDone = false;
Future<void> initCallsOnce(CallAppSettings settings) async {
if (_callsInitDone) return;
await CometChatUIKitCalls.init(settings);
_callsInitDone = true;
}
// ✅ CAUSE (b) — clean up the stale session via the UIKit-namespaced API.
// The method is endSession (NOT endCall) and takes named callbacks, no sessionId
// — verified vs cometchat_uikit_calls.dart:236.
await CometChatUIKitCalls.endSession(
onSuccess: (_) {},
onError: (e) => debugPrint('endSession failed: $e'),
);
// ❌ WRONG — bare CometChat.endCall is the Chat SDK API, not the calls cleanup
CometChat.endCall(sessionId, onSuccess: ..., onError: ...);CallManager not found or CometChat Calling module not found.cometchat_chat_uikit is properly added to pubspec.yamlflutter clean and rebuildandroid.enableJetifier=true is in gradle.propertiesstartSession returns null on Android with no error feedback. The call screen may appear blank or stuck.startSession silently fails. A 5-second timeout workaround exists but provides no error feedback.startSession callscometchat_calls_sdk that may fix thissubscriptionType not set (presence/events disabled)subscriptionType is set to CometChatSubscriptionType.allUsersCometChatUIKit.logout(), the Calls SDK session is invalidated but may not be properly re-initialized on the next login.onSuccess/onError. CometChat.initiateCall returns successfully with a valid sessionId, but no UI ever appears.MaterialApp is missing navigatorKey: CallNavigationContext.navigatorKey. The kit's CometChatCallButtons and outgoing-call flow navigate via CallNavigationContext.navigatorKey.currentContext — which is null until the app's MaterialApp is wired to that key. The failure is silent because initiateCall itself succeeds; only the navigation to the outgoing-call screen fails. Important: the vendor's own 6.0.1 sample app is missing this line, so customers who copied main.dart verbatim will hit this bug. This is the single most common customer-blocking V6 calls trap.CallNavigationContext.navigatorKey on the root MaterialApp:// ✅ CORRECT — navigatorKey wired on MaterialApp
import 'package:flutter/material.dart';
import 'package:cometchat_chat_uikit/cometchat_calls_uikit.dart'
show CallNavigationContext; // calls is a sub-library of cometchat_chat_uikit — there is NO separate cometchat_calls_uikit package in v6
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: CallNavigationContext.navigatorKey, // REQUIRED for V6 calls
home: const HomeScreen(),
);
}
}
// ❌ WRONG — no navigatorKey; outgoing-call screen never appears
return MaterialApp(
home: const HomeScreen(),
);See cometchat-flutter-v6-calls §1.7 for the canonical wiring rule.
cometchat_chat_uikit ^6.0.0-beta2 where the outgoing → in-call state never fires. This is FIXED in 6.0.1 GA.cometchat_chat_uikit ^6.0.1 (or the latest 6.x):# pubspec.yaml
dependencies:
cometchat_chat_uikit: ^6.0.1 # was ^6.0.0-beta2Then run:
flutter pub get
flutter clean
flutter runIf the bug persists after upgrade, verify Section 4.7 (navigatorKey is still required on 6.0.1).
// ✅ CORRECT — unique ID per instance
class _MyScreenState extends State<MyScreen> with MessageListener {
late final String _listenerId;
@override
void initState() {
super.initState();
_listenerId = 'my_screen_${DateTime.now().millisecondsSinceEpoch}';
CometChat.addMessageListener(_listenerId, this);
}
@override
void dispose() {
CometChat.removeMessageListener(_listenerId);
super.dispose();
}
}
// ❌ WRONG — hardcoded ID causes collisions across instances
CometChat.addMessageListener('messages', this); // Collision!initState() but not removed in dispose().@override
void dispose() {
CometChat.removeMessageListener(_listenerId);
CometChat.removeUserListener(_listenerId);
CometChat.removeGroupListener(_listenerId);
CometChat.removeCallListener(_listenerId);
super.dispose();
}subscriptionType not set in UIKitSettingsBuilder. This silently disables all real-time events.subscriptionType during init:UIKitSettingsBuilder()
..subscriptionType = CometChatSubscriptionType.allUserspub get can't resolve cometchat_chat_uikit ^6.x / resolves a betaflutter pub get fails to find cometchat_chat_uikit ^6.0.x, or pulls a 6.0.0-beta instead of the GA.dependencies: cometchat_chat_uikit: ^6.0.2 (no hosted: block). Only add the Cloudsmith hosted: URL if you are intentionally on a beta/V5. (V6 calls fold into this one package — there is no separate cometchat_calls_uikit package on v6; calls types come from the package:cometchat_chat_uikit/cometchat_calls_uikit.dart sub-library.)PNRegistryPNRegistry class that won't import.PNRegistry is not a kit/SDK symbol — it's a copy-in V5 sample-app extension (extension PNRegistry on CometChatService), not exported by any cometchat_* package.CometChatNotifications.registerPushToken(PushPlatforms.FCM_FLUTTER_ANDROID, fcmToken: token, providerId: ...) (+ FCM_FLUTTER_IOS / APNS_FLUTTER_DEVICE / APNS_FLUTTER_VOIP) — call it AFTER login, and unregisterPushToken(...) on logout. See cometchat-flutter-v6-push.ClassNotFoundException for CometChat classes. Debug builds work fine.android/app/proguard-rules.pro with:# CometChat — prevent R8 from stripping SDK classes
-keep class com.cometchat.** { *; }
-keep interface com.cometchat.** { *; }
# Suppress warnings for Calls SDK classes referenced cross-module
-dontwarn com.cometchat.calls.CometChatRTCView$CometChatRTCViewBuilder
-dontwarn com.cometchat.calls.CometChatRTCView
-dontwarn com.cometchat.calls.CometChatRTCViewListener
-dontwarn com.cometchat.calls.model.AnalyticsSettings
-dontwarn com.cometchat.calls.model.RTCCallback
-dontwarn com.cometchat.calls.model.RTCReceiverReference it in android/app/build.gradle:
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}minSdkVersion incompatibility.minSdk is set below 26. The cometchat_calls_sdk requires minSdk 26.android/app/build.gradle (or .kts):defaultConfig {
minSdk = 26 // Required by cometchat_calls_sdk
}androidx conflicts.android.enableJetifier=true not set. Transitive dependencies from the CometChat SDK use old Android Support Library references.android/gradle.properties:android.useAndroidX=true
android.enableJetifier=truepod install fails with dependency resolution errors, version conflicts, or missing pods.cd ios
rm -rf Pods Podfile.lock
pod repo update
pod install --repo-update
cd ..
flutter clean
flutter pub getIf still failing, check that the iOS deployment target in ios/Podfile is high enough:
platform :ios, '13.0' # Minimum for CometChatInfo.plist.ios/Runner/Info.plist:<key>NSCameraUsageDescription</key>
<string>Camera access is needed for video calls and sending photos</string>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone access is needed for voice and video calls</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Photo library access is needed for sending images</string>For VoIP calls, also add:
<key>UIBackgroundModes</key>
<array>
<string>voip</string>
<string>remote-notification</string>
</array>flutter build apk / flutter run prints a warning that the CometChat plugins apply the Kotlin Gradle Plugin the legacy way (e.g. "The Kotlin Gradle plugin was loaded multiple times…" / legacy-plugin-application deprecation from both cometchat_chat_uikit and cometchat_calls_sdk).plugins {} KGP application. It's emitted by the kit, not your project.flutter build apk --debug). Don't try to "fix" it in your app; it clears when the kit updates its Gradle plugin wiring.CometChatThemeHelper.getColorPalette(context) and similar calls in build() do expensive InheritedWidget traversal on every rebuild.didChangeDependencies() — see Section 3.5 for the full pattern. For child widgets, pass pre-cached theme values from the parent:// Parent passes cached values to children
CometChatImageBubble(
imageUrl: message.attachment?.fileUrl,
colorPalette: _colorPalette, // Pre-cached from parent
spacing: _spacing, // Pre-cached from parent
);BlocConsumer or BlocBuilder without buildWhen — rebuilds on every state emission.buildWhen to limit rebuilds to relevant state changes:BlocConsumer<MessageComposerBloc, MessageComposerState>(
buildWhen: (previous, current) =>
previous.isEditMode != current.isEditMode ||
previous.isReplyMode != current.isReplyMode ||
previous.isRecordingMode != current.isRecordingMode ||
previous.editMessage != current.editMessage ||
previous.replyMessage != current.replyMessage,
listener: (context, state) { /* still receives ALL state changes */ },
builder: (context, state) { /* only rebuilds when buildWhen is true */ },
)findChildIndexCallback takes too long.list.indexWhere() (O(n)) to find messages instead of a Map-based O(1) lookup.Map<int, int> alongside the message list for O(1) index lookups:// In BLoC — maintain O(1) lookup map
final Map<int, int> _messageIndexMap = {};
int? findMessageIndex(int messageId) => _messageIndexMap[messageId];
// In SliverAnimatedList
SliverAnimatedList(
findChildIndexCallback: (Key key) {
if (key is ValueKey<int>) {
final index = widget.findMessageIndex?.call(key.value) ??
_messages.indexWhere((m) => m.id == key.value);
if (index != -1) return visualPosition(index);
}
return null;
},
)| Symptom | Cause | Fix |
|---|---|---|
Release crash ClassNotFoundException | Missing ProGuard rules | Add -keep class com.cometchat.** { *; } — see Section 6.1 |
Build fail minSdk | minSdk < 26 | Set minSdk = 26 in build.gradle |
| Build fail support library | Missing Jetifier | Add android.enableJetifier=true to gradle.properties |
startSession returns null | Known Calls SDK issue | Implement timeout + retry — see Section 4.4 |
CallManager not found | Native module not linked | Clean build + verify ProGuard + Jetifier — see Section 4.3 |
| Audio recording stuck after permission | Permission callback race | Ensure permission is granted before starting recording; handle the permission result callback properly |
| Symptom | Cause | Fix |
|---|---|---|
| Pod install fails | Stale cache or version conflict | rm -rf Pods Podfile.lock && pod install --repo-update |
| Camera/mic crash | Missing Info.plist permissions | Add NSCameraUsageDescription, NSMicrophoneUsageDescription — see Section 6.5 |
| Media not sending | File access or permission issue | Verify NSPhotoLibraryUsageDescription in Info.plist; check file picker permissions |
| App crash on iPhone 11 | Device-specific compatibility | Check iOS deployment target ≥ 13.0; verify no 32-bit dependencies |
| VoIP calls not received in background | Missing background modes | Add voip and remote-notification to UIBackgroundModes in Info.plist |
| Symptom | Cause | Fix |
|---|---|---|
| Runtime error on web | Platform-specific code without kIsWeb guard | Wrap platform-specific code with if (!kIsWeb) checks |
| Native plugins crash on web | Plugin not available on web | Use conditional imports or kIsWeb guards before calling native APIs |
| CORS errors | API calls blocked by browser | Ensure CometChat API endpoints are accessible; check proxy configuration |
// ✅ CORRECT — guard platform-specific code
import 'package:flutter/foundation.dart' show kIsWeb;
if (!kIsWeb) {
// Native-only code (e.g., push notifications, file system access)
setupPushNotifications();
}
// For conditional imports:
// lib/platform/native_service.dart — native implementation
// lib/platform/web_service.dart — web implementation| Error / Symptom | Section | One-Line Fix |
|---|---|---|
| "Authentication null" | 2.1 | Call CometChatUIKit.init() before any usage |
| "APP ID null" | 2.2 | Set ..appId = 'YOUR_APP_ID' in UIKitSettingsBuilder |
| ERR_ALREADY_LOGGED_IN | 2.3 | Check CometChatUIKit.loggedInUser before calling login |
| "Android internal error" | 2.4 | Verify credentials, UID existence, try stable SDK |
| Guard screen stuck on spinner | 2.5 | Use CometChatUIKit.loggedInUser synchronously after init |
| ERR_INVALID_REGION | 2.6 | Use lowercase: 'us', 'eu', 'in' |
| StateError: not initialized | 2.7 | Call ServiceLocator.instance.setup() before creating BLoC |
| Double keyboard compensation (pre-6.0.1) | 3.1 | Upgrade kit to ^6.0.1 (composer clamps to viewInsets, ENG-34434); keep resizeToAvoidBottomInset: true. false is only an old-kit stopgap |
| No typing indicators / presence | 3.3 | Set ..subscriptionType = CometChatSubscriptionType.allUsers |
| Theme jank during keyboard | 3.5 | Cache theme in didChangeDependencies(), not build() |
| Outgoing call screen never appears | 4.7 | Wire navigatorKey: CallNavigationContext.navigatorKey on MaterialApp |
| Stuck on "Calling…" after peer accepts | 4.8 | Upgrade cometchat_chat_uikit from ^6.0.0-beta2 to ^6.0.1 |
| Duplicate events | 5.1 | Use unique listener ID per widget instance |
| Listener leak | 5.2 | Remove listener in dispose() with same ID |
| ClassNotFoundException (release) | 6.1 | Add ProGuard keep rules for com.cometchat.** |
| minSdk too low | 6.2 | Set minSdk = 26 |
| Jetifier missing | 6.3 | Add android.enableJetifier=true |
| Pod install failure | 6.4 | Delete Pods + Podfile.lock, pod install --repo-update |
| Missing iOS permissions | 6.5 | Add camera/mic/photo descriptions to Info.plist |
Use this checklist to verify your integration is correct:
CometChatUIKit.init() called and awaited before any usageCometChatUIKit.loggedInUser after init (not CometChat.getLoggedInUser())subscriptionType set in UIKitSettingsBuilderregion is lowercase ('us', 'eu', 'in')CometChatMessageComposer uses resizeToAvoidBottomInset: true (or omits it) on ^6.0.1 — composer clamps to viewInsets (ENG-34434); false is only the pre-6.0.1 stopgapdidChangeDependencies(), not build()dispose()CometChatThemeHelper, never hardcodedTranslations.of(context), never hardcodedMaterialApp wires navigatorKey: CallNavigationContext.navigatorKey (required for V6 calls, including 6.0.1)cometchat_chat_uikit ^6.0.1 (fixes outgoing → in-call BLoC transition)kIsWeb guards on platform-specific code~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.