{"id":"d68ffdb9-2de6-427f-a777-d623ad362ae2","shortId":"XfrdE2","kind":"skill","title":"cometchat-flutter-v6","tagline":"Use when building chat with CometChat Flutter UIKit v6 (cometchat_chat_uikit). Triggers on CometChatUIKit, CometChatConversations, CometChatMessageList, CometChatMessageComposer, CometChatMessageHeader, CometChatUsers, CometChatGroups, UIKitSettings, CometChatThemeHelper, CometCh","description":"# CometChat Flutter UIKit v6 — Orchestrator\n\nEntry point skill for the `cometchat_chat_uikit` package. Routes to feature skills based on context.\n\n## Project Detection\n\nConfirm the project uses CometChat UIKit by checking `pubspec.yaml` for:\n```yaml\ndependencies:\n  cometchat_chat_uikit:\n    hosted: https://dart.cloudsmith.io/cometchat/cometchat/\n    version: 6.0.0-beta2\n```\n\nIf missing, install via:\n```bash\ndart pub add cometchat_chat_uikit:6.0.0-beta2 --hosted-url https://dart.cloudsmith.io/cometchat/cometchat/\n```\n\nCall functionality is built into `cometchat_chat_uikit` — no separate package needed. To use call-specific types, import the calls barrel:\n```dart\nimport 'package:cometchat_chat_uikit/cometchat_chat_uikit.dart';\nimport 'package:cometchat_chat_uikit/cometchat_calls_uikit.dart'; // For call types\n```\n\n## Skill Routing\n\n| User mentions | Route to skill |\n|---------------|---------------|\n| init, login, logout, UIKitSettings, setup, credentials, appId, region | `cometchat-flutter-v6-core` |\n| theme, colors, dark mode, styling, CometChatColorPalette, CometChatSpacing, typography, Style class | `cometchat-flutter-v6-theming` |\n| conversations, conversation list, recent chats, ConversationsBloc | `cometchat-flutter-v6-conversations` |\n| messages, message list, composer, header, keyboard, rich text, bubbles, send message | `cometchat-flutter-v6-messages` |\n| users, groups, group members, contacts, user list | `cometchat-flutter-v6-users-groups` |\n| events, listeners, real-time, typing indicator, online status, receipts, SDK listener | `cometchat-flutter-v6-events` |\n\n## Architecture Overview\n\nThe UIKit follows Clean Architecture + BLoC:\n```\n{component}/\n├── bloc/           # BLoC, Events, State (Equatable)\n├── domain/         # Use Cases, Repository interfaces\n├── data/           # Repository impl, DataSources\n├── di/             # ServiceLocator (singleton)\n├── widgets/        # UI components\n└── {component}.dart # Barrel export\n```\n\nAll components: conversations, message_list, message_composer, message_header, users, groups, group_members, search, threaded_header, message_information.\n\n## Package Structure\n\n```\nchat_uikit/lib/\n├── cometchat_chat_uikit.dart    # Main barrel export (chat components)\n├── cometchat_calls_uikit.dart   # Calls barrel export\n├── chat_ui/src/                 # Chat components (conversations, messages, users, groups, etc.)\n├── call_ui/src/                 # Call components (incoming, outgoing, ongoing, call_logs)\n└── shared_ui/                   # Shared utilities (theme, events, formatters, models, views)\n```\n\n## Rule: AUTH_CHECK_AFTER_INIT\n\nAfter `CometChatUIKit.init()` completes (in its `onSuccess`), the static field `CometChatUIKit.loggedInUser` is already populated if a cached session exists. Use this synchronous check — do NOT call `CometChat.getLoggedInUser()` separately.\n\n```dart\n// ✅ CORRECT — synchronous check after init completes\nCometChatUIKit.init(\n  uiKitSettings: settings,\n  onSuccess: (_) {\n    final hasUser = CometChatUIKit.loggedInUser != null;\n    // Route to home or login based on hasUser\n  },\n);\n\n// ❌ WRONG — separate async getLoggedInUser call after init\nCometChatUIKit.init(\n  uiKitSettings: settings,\n  onSuccess: (_) {\n    CometChat.getLoggedInUser(\n      onSuccess: (user) { ... },  // Unreliable when no session exists\n      onError: (e) { ... },\n    );\n  },\n);\n```\n\nThe `init()` method internally calls `getLoggedInUser()` and sets `CometChatUIKit.loggedInUser` before firing `onSuccess`. Calling it again is redundant and the callback-based version can silently fail when no session exists (the SDK logs \"Please log in to CometChat before calling this method\" and neither callback fires consistently).\n\nThis also applies to `login()` and `loginWithAuthToken()` — all three populate `CometChatUIKit.loggedInUser` before calling `onSuccess`.\n\n```dart\n// ❌ ALSO WRONG — async UIKit getLoggedInUser after init (redundant native bridge round-trip)\nCometChatUIKit.init(\n  uiKitSettings: settings,\n  onSuccess: (_) async {\n    final user = await CometChatUIKit.getLoggedInUser(); // Unnecessary!\n    if (user != null) { ... }\n  },\n);\n\n// ❌ ALSO WRONG — raw SDK getLoggedInUser (bypasses UIKit, unreliable)\nUser? existingUser = await CometChat.getLoggedInUser();\n```\n\n## Golden Path — Minimal Chat App\n\n```dart\nimport 'package:cometchat_chat_uikit/cometchat_chat_uikit.dart';\n\n// 1. Init (once, at app startup)\nfinal settings = (UIKitSettingsBuilder()\n      ..appId = 'YOUR_APP_ID'\n      ..region = 'us'\n      ..authKey = 'YOUR_AUTH_KEY'\n      ..subscriptionType = CometChatSubscriptionType.allUsers)\n    .build();\nawait CometChatUIKit.init(uiKitSettings: settings);\n\n// 2. Login\nawait CometChatUIKit.loginWithAuthToken('AUTH_TOKEN');\n\n// 3. Show conversations\nCometChatConversations(\n  onItemTap: (conversation) {\n    final user = conversation.conversationWith is User\n        ? conversation.conversationWith as User : null;\n    final group = conversation.conversationWith is Group\n        ? conversation.conversationWith as Group : null;\n    // Navigate to messages screen\n  },\n)\n\n// 4. Messages screen (MUST use resizeToAvoidBottomInset: false)\nScaffold(\n  resizeToAvoidBottomInset: false, // REQUIRED\n  appBar: CometChatMessageHeader(\n    user: user,\n    group: group,\n    onBack: () => Navigator.pop(context),\n  ),\n  body: Column(\n    children: [\n      Expanded(child: CometChatMessageList(user: user, group: group)),\n      CometChatMessageComposer(user: user, group: group),\n    ],\n  ),\n)\n```\n\n## Complete App Scaffold (main.dart)\n\nFull working app with init → auth guard → login → home → logout. Copy-paste ready.\n\n```dart\nimport 'package:flutter/material.dart';\nimport 'package:cometchat_chat_uikit/cometchat_chat_uikit.dart';\n\nconst String appId = 'YOUR_APP_ID';\nconst String region = 'us';\nconst String authKey = 'YOUR_AUTH_KEY';\n\nvoid main() => runApp(const MyApp());\n\nclass MyApp extends StatefulWidget {\n  const MyApp({super.key});\n  @override\n  State<MyApp> createState() => _MyAppState();\n}\n\nclass _MyAppState extends State<MyApp> {\n  bool _initializing = true;\n  bool _loggedIn = false;\n\n  @override\n  void initState() {\n    super.initState();\n    _initCometChat();\n  }\n\n  void _initCometChat() {\n    final settings = (UIKitSettingsBuilder()\n          ..appId = appId\n          ..region = region\n          ..authKey = authKey\n          ..subscriptionType = CometChatSubscriptionType.allUsers)\n        .build();\n\n    CometChatUIKit.init(\n      uiKitSettings: settings,\n      onSuccess: (_) {\n        // CometChatUIKit.loggedInUser is already set if a cached session exists\n        setState(() {\n          _loggedIn = CometChatUIKit.loggedInUser != null;\n          _initializing = false;\n        });\n      },\n      onError: (e) {\n        debugPrint('Init failed: ${e.message}');\n        setState(() => _initializing = false);\n      },\n    );\n  }\n\n  void _onLoginSuccess() => setState(() => _loggedIn = true);\n\n  void _onLogout() => setState(() => _loggedIn = false);\n\n  @override\n  Widget build(BuildContext context) {\n    return MaterialApp(\n      home: _initializing\n          ? const Scaffold(body: Center(child: CircularProgressIndicator()))\n          : _loggedIn\n              ? HomeScreen(onLogout: _onLogout)\n              : LoginScreen(onLoginSuccess: _onLoginSuccess),\n    );\n  }\n}\n\n// --- Login Screen ---\nclass LoginScreen extends StatefulWidget {\n  final VoidCallback onLoginSuccess;\n  const LoginScreen({super.key, required this.onLoginSuccess});\n  @override\n  State<LoginScreen> createState() => _LoginScreenState();\n}\n\nclass _LoginScreenState extends State<LoginScreen> {\n  final _uidController = TextEditingController();\n  bool _loggingIn = false;\n  String? _error;\n\n  void _login() {\n    final uid = _uidController.text.trim();\n    if (uid.isEmpty) return;\n    setState(() { _loggingIn = true; _error = null; });\n\n    CometChatUIKit.login(uid,\n      onSuccess: (_) {\n        if (mounted) widget.onLoginSuccess();\n      },\n      onError: (e) {\n        if (mounted) setState(() { _loggingIn = false; _error = e.message; });\n      },\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      body: Padding(\n        padding: const EdgeInsets.all(24),\n        child: Column(\n          mainAxisAlignment: MainAxisAlignment.center,\n          children: [\n            TextField(\n              controller: _uidController,\n              decoration: const InputDecoration(labelText: 'User ID'),\n            ),\n            const SizedBox(height: 16),\n            if (_error != null)\n              Text(_error!, style: const TextStyle(color: Colors.red)),\n            const SizedBox(height: 16),\n            ElevatedButton(\n              onPressed: _loggingIn ? null : _login,\n              child: _loggingIn\n                  ? const SizedBox(width: 20, height: 20, child: CircularProgressIndicator(strokeWidth: 2))\n                  : const Text('Login'),\n            ),\n          ],\n        ),\n      ),\n    );\n  }\n}\n\n// --- Home Screen (Conversations → Messages) ---\nclass HomeScreen extends StatelessWidget {\n  final VoidCallback onLogout;\n  const HomeScreen({super.key, required this.onLogout});\n\n  void _logout(BuildContext context) {\n    CometChatUIKit.logout(\n      onSuccess: (_) => onLogout(),\n      onError: (e) => debugPrint('Logout failed: ${e.message}'),\n    );\n  }\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      appBar: AppBar(\n        title: const Text('Conversations'),\n        actions: [\n          IconButton(icon: const Icon(Icons.logout), onPressed: () => _logout(context)),\n        ],\n      ),\n      body: CometChatConversations(\n        onItemTap: (conversation) {\n          final user = conversation.conversationWith is User\n              ? conversation.conversationWith as User : null;\n          final group = conversation.conversationWith is Group\n              ? conversation.conversationWith as Group : null;\n          Navigator.push(context, MaterialPageRoute(\n            builder: (_) => MessagesScreen(user: user, group: group),\n          ));\n        },\n      ),\n    );\n  }\n}\n\n// --- Messages Screen ---\nclass MessagesScreen extends StatelessWidget {\n  final User? user;\n  final Group? group;\n  const MessagesScreen({super.key, this.user, this.group});\n\n  @override\n  Widget build(BuildContext context) {\n    return Scaffold(\n      resizeToAvoidBottomInset: false, // REQUIRED — composer handles keyboard\n      appBar: CometChatMessageHeader(\n        user: user,\n        group: group,\n        onBack: () => Navigator.pop(context),\n      ),\n      body: Column(\n        children: [\n          Expanded(child: CometChatMessageList(user: user, group: group)),\n          CometChatMessageComposer(user: user, group: group),\n        ],\n      ),\n    );\n  }\n}\n```\n\nKey points in this scaffold:\n- `CometChatUIKit.loggedInUser` is checked synchronously after `init()` — no separate `getLoggedInUser()` call\n- State is managed at the `MyApp` level so login/logout transitions are clean\n- `LoginScreen` uses `CometChatUIKit.login(uid)` with auth key (set in UIKitSettings)\n- `MessagesScreen` has `resizeToAvoidBottomInset: false`\n- Logout calls `CometChatUIKit.logout()` and resets state\n\n## Top 10 Error Debugging\n\n| Symptom | Cause | Fix |\n|---------|-------|-----|\n| \"Authentication null\" | `CometChatUIKit.init()` not called | Call init before login/components |\n| \"APP ID null\" | appId not set in UIKitSettingsBuilder | Set `..appId = 'YOUR_APP_ID'` |\n| Double keyboard compensation | Scaffold `resizeToAvoidBottomInset` is true | Set to `false` when using composer |\n| No typing indicators / presence | `subscriptionType` not set | Set `..subscriptionType = CometChatSubscriptionType.allUsers` |\n| Theme jank during keyboard | Theme looked up in `build()` | Cache in `didChangeDependencies()` with `_themeInitialized` flag |\n| Listener leak / duplicate events | Listener not removed in `dispose()` | Always remove with same ID used to register |\n| \"ERR_ALREADY_LOGGED_IN\" | Calling login when session exists | Check `CometChatUIKit.getLoggedInUser()` first |\n| Messages not updating in real-time | SDK listener not registered | BLoC registers automatically; check component is mounted |\n| Stale user/group data | Passing widget params instead of mutable state | Keep mutable `_user`/`_group` in State, update from listeners |\n| Region error | Uppercase region string | Use lowercase: 'us', 'eu', 'in' |\n| `Android internal error` on login | SDK internal failure — often auth key issue, beta SDK bug, or network | Verify credentials are correct. Try `CometChat.login(uid, authKey)` directly instead of `CometChatUIKit.login(uid)`. Check CometChat dashboard for UID existence. If using beta SDK, try stable release. |\n| Guard screen stuck on spinner | Using `CometChat.getLoggedInUser()` callback API after init | Use `CometChatUIKit.loggedInUser` synchronously after `init()` completes — see AUTH_CHECK_AFTER_INIT rule |\n| Release build crash (ClassNotFoundException) | Missing ProGuard keep rules | Add `-keep class com.cometchat.** { *; }` to `proguard-rules.pro` |\n| Android build fails (minSdk) | minSdk too low | Set `minSdk = 26` in `android/app/build.gradle` |\n| Android build fails (support library) | Missing Jetifier | Add `android.enableJetifier=true` to `gradle.properties` |\n\n## Autonomous Mode\n\n- If `pubspec.yaml` has `cometchat_chat_uikit` → proceed without asking\n- If credentials exist in code → reuse them, don't ask\n- If user says \"messages screen\" → generate Scaffold + Header + List + Composer with `resizeToAvoidBottomInset: false`\n- Always add `subscriptionType` to UIKitSettingsBuilder\n- Always use `CometChatThemeHelper` for colors, never hardcode\n\n## Android Build Requirements\n\nThese are required in your Android project or the build/release will fail:\n\n### gradle.properties\n```properties\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n```\n`enableJetifier` resolves old Android Support Library conflicts from transitive dependencies.\n\n### minSdk 26\nIn `android/app/build.gradle` (or `.kts`):\n```kotlin\ndefaultConfig {\n    minSdk = 26  // Required by cometchat_calls_sdk\n}\n```\n\n### ProGuard / R8 Keep Rules\nCreate `android/app/proguard-rules.pro`:\n```\n# CometChat — prevent R8 from stripping SDK classes\n-keep class com.cometchat.** { *; }\n-keep interface com.cometchat.** { *; }\n\n# Suppress warnings for Calls SDK classes referenced cross-module\n-dontwarn com.cometchat.calls.CometChatRTCView$CometChatRTCViewBuilder\n-dontwarn com.cometchat.calls.CometChatRTCView\n-dontwarn com.cometchat.calls.CometChatRTCViewListener\n-dontwarn com.cometchat.calls.model.AnalyticsSettings\n-dontwarn com.cometchat.calls.model.RTCCallback\n-dontwarn com.cometchat.calls.model.RTCReceiver\n```\n\nReference it in `build.gradle`:\n```kotlin\nbuildTypes {\n    release {\n        isMinifyEnabled = true\n        isShrinkResources = true\n        proguardFiles(\n            getDefaultProguardFile(\"proguard-android-optimize.txt\"),\n            \"proguard-rules.pro\"\n        )\n    }\n}\n```\n\nWithout these rules, release builds crash with `ClassNotFoundException` for CometChat classes.","tags":["cometchat","flutter","skills","agent-skills","ai-agent","chat","claude-code","cursor","messaging","nextjs","react","react-native"],"capabilities":["skill","source-cometchat","skill-cometchat-flutter-v6","topic-agent-skills","topic-ai-agent","topic-chat","topic-claude-code","topic-cometchat","topic-cursor","topic-messaging","topic-nextjs","topic-react","topic-react-native","topic-ui-kit"],"categories":["cometchat-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/cometchat/cometchat-skills/cometchat-flutter-v6","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add cometchat/cometchat-skills","source_repo":"https://github.com/cometchat/cometchat-skills","install_from":"skills.sh"}},"qualityScore":"0.463","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 27 github stars · SKILL.md body (15,095 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:04:52.549Z","embedding":null,"createdAt":"2026-05-07T13:05:12.444Z","updatedAt":"2026-05-18T19:04:52.549Z","lastSeenAt":"2026-05-18T19:04:52.549Z","tsv":"'/cometchat/cometchat/':70,92 '1':500 '10':1050 '16':831,845 '2':526,862 '20':856,858 '24':813 '26':1281,1374,1382 '3':532 '4':560 '6.0.0':72,85 'action':908 'add':81,1266,1291,1331 'alreadi':329,689,1134 'also':437,451,477 'alway':1125,1330,1335 'android':1192,1272,1284,1342,1350,1366 'android.enablejetifier':1292,1361 'android.useandroidx':1359 'android/app/build.gradle':1283,1376 'android/app/proguard-rules.pro':1393 'api':1243 'app':493,504,511,596,601,626,1065,1076 'appbar':571,902,903,978 'appid':142,509,624,674,675,1068,1074 'appli':438 'architectur':221,227 'ask':1306,1316 'async':370,453,468 'auth':314,517,530,604,636,1034,1201,1253 'authent':1056 'authkey':515,634,678,679,1216 'automat':1158 'autonom':1296 'await':471,487,522,528 'barrel':114,252,278,284 'base':47,365,410 'bash':78 'beta':1204,1230 'beta2':73,86 'bloc':228,230,231,1156 'bodi':580,732,808,917,987 'bool':658,661,768 'bridg':460 'bubbl':183 'bug':1206 'build':7,521,682,723,803,897,967,1109,1259,1273,1285,1343,1449 'build.gradle':1433 'build/release':1354 'buildcontext':724,804,884,898,968 'builder':942 'buildtyp':1435 'built':96 'bypass':482 'cach':333,693,1110 'call':93,108,113,127,283,295,297,302,342,372,393,401,428,448,1016,1044,1060,1061,1137,1386,1410 'call-specif':107 'callback':409,433,1242 'callback-bas':408 'case':237 'caus':1054 'center':733 'chat':8,15,40,65,83,99,119,124,168,274,280,286,288,492,498,620,1302 'check':59,315,339,348,1009,1142,1159,1222,1254 'child':584,734,814,851,859,991 'children':582,818,989 'circularprogressind':735,860 'class':158,643,654,745,761,870,950,1268,1400,1402,1412,1455 'classnotfoundexcept':1261,1452 'clean':226,1028 'code':1311 'color':150,840,1339 'colors.red':841 'column':581,815,988 'com.cometchat':1269,1403,1406 'com.cometchat.calls.cometchatrtcview':1418,1421 'com.cometchat.calls.cometchatrtcviewlistener':1423 'com.cometchat.calls.model.analyticssettings':1425 'com.cometchat.calls.model.rtccallback':1427 'com.cometchat.calls.model.rtcreceiver':1429 'cometch':28 'cometchat':2,10,14,29,39,56,64,82,98,118,123,145,160,171,187,199,217,426,497,619,1223,1301,1385,1394,1454 'cometchat-flutter-v6':1 'cometchat-flutter-v6-conversations':170 'cometchat-flutter-v6-core':144 'cometchat-flutter-v6-events':216 'cometchat-flutter-v6-messages':186 'cometchat-flutter-v6-theming':159 'cometchat-flutter-v6-users-groups':198 'cometchat.getloggedinuser':343,379,488,1241 'cometchat.login':1214 'cometchat_calls_uikit.dart':282 'cometchat_chat_uikit.dart':276 'cometchatcolorpalett':154 'cometchatconvers':20,535,918 'cometchatgroup':25 'cometchatmessagecompos':22,590,997 'cometchatmessagehead':23,572,979 'cometchatmessagelist':21,585,992 'cometchatrtcviewbuild':1419 'cometchatspac':155 'cometchatsubscriptiontype.allusers':520,681,1100 'cometchatthemehelp':27,1337 'cometchatuikit':19 'cometchatuikit.getloggedinuser':472,1143 'cometchatuikit.init':319,352,375,464,523,683,1058 'cometchatuikit.loggedinuser':327,358,397,446,687,698,1007,1247 'cometchatuikit.login':786,1031,1220 'cometchatuikit.loginwithauthtoken':529 'cometchatuikit.logout':886,1045 'cometchatus':24 'compens':1080 'complet':320,351,595,1251 'compon':229,249,250,255,281,289,298,1160 'compos':178,260,975,1090,1326 'confirm':52 'conflict':1369 'consist':435 'const':622,628,632,641,647,730,752,811,823,828,838,842,853,863,877,905,911,960 'contact':195 'context':49,579,725,805,885,899,916,940,969,986 'control':820 'convers':164,165,174,256,290,534,537,868,907,920 'conversation.conversationwith':540,543,549,552,923,926,932,935 'conversationsbloc':169 'copi':610 'copy-past':609 'core':148 'correct':346,1212 'crash':1260,1450 'creat':1392 'createst':652,759 'credenti':141,1210,1308 'cross':1415 'cross-modul':1414 'dark':151 'dart':79,115,251,345,450,494,613 'dart.cloudsmith.io':69,91 'dart.cloudsmith.io/cometchat/cometchat/':68,90 'dashboard':1224 'data':240,1165 'datasourc':243 'debug':1052 'debugprint':704,891 'decor':822 'defaultconfig':1380 'depend':63,1372 'detect':51 'di':244 'didchangedepend':1112 'direct':1217 'dispos':1124 'domain':235 'dontwarn':1417,1420,1422,1424,1426,1428 'doubl':1078 'duplic':1118 'e':388,703,793,890 'e.message':707,800,894 'edgeinsets.all':812 'elevatedbutton':846 'enablejetifi':1363 'entri':34 'equat':234 'err':1133 'error':772,784,799,833,836,1051,1183,1194 'etc':294 'eu':1190 'event':204,220,232,309,1119 'exist':335,386,418,695,1141,1227,1309 'existingus':486 'expand':583,990 'export':253,279,285 'extend':645,656,747,763,872,952 'fail':414,706,893,1274,1286,1356 'failur':1199 'fals':566,569,663,701,710,720,770,798,973,1042,1087,1329 'featur':45 'field':326 'final':356,469,506,538,547,671,749,765,775,874,921,930,954,957 'fire':399,434 'first':1144 'fix':1055 'flag':1115 'flutter':3,11,30,146,161,172,188,200,218 'flutter/material.dart':616 'follow':225 'formatt':310 'full':599 'function':94 'generat':1322 'getdefaultproguardfil':1442 'getloggedinus':371,394,455,481,1015 'golden':489 'gradle.properties':1295,1357 'group':192,193,203,264,265,293,548,551,554,575,576,588,589,593,594,931,934,937,946,947,958,959,982,983,995,996,1000,1001,1176 'guard':605,1235 'handl':976 'hardcod':1341 'hasus':357,367 'header':179,262,269,1324 'height':830,844,857 'home':362,607,728,866 'homescreen':737,871,878 'host':67,88 'hosted-url':87 'icon':910,912 'iconbutton':909 'icons.logout':913 'id':512,627,827,1066,1077,1129 'impl':242 'import':111,116,121,495,614,617 'incom':299 'indic':210,1093 'inform':271 'init':136,317,350,374,390,457,501,603,705,1012,1062,1245,1250,1256 'initcometchat':668,670 'initi':659,700,709,729 'initst':666 'inputdecor':824 'instal':76 'instead':1169,1218 'interfac':239,1405 'intern':392,1193,1198 'isminifyen':1437 'isshrinkresourc':1439 'issu':1203 'jank':1102 'jetifi':1290 'keep':1173,1264,1267,1390,1401,1404 'key':518,637,1002,1035,1202 'keyboard':180,977,1079,1104 'kotlin':1379,1434 'kts':1378 'labeltext':825 'leak':1117 'level':1023 'librari':1288,1368 'list':166,177,197,258,1325 'listen':205,215,1116,1120,1153,1181 'log':303,421,423,1135 'loggedin':662,697,714,719,736 'loggingin':769,782,797,848,852 'login':137,364,440,527,606,743,774,850,865,1138,1196 'login/components':1064 'login/logout':1025 'loginscreen':740,746,753,1029 'loginscreenst':760,762 'loginwithauthtoken':442 'logout':138,608,883,892,915,1043 'look':1106 'low':1278 'lowercas':1188 'main':277,639 'main.dart':598 'mainaxisalign':816 'mainaxisalignment.center':817 'manag':1019 'materialapp':727 'materialpagerout':941 'member':194,266 'mention':132 'messag':175,176,185,190,257,259,261,270,291,558,561,869,948,1145,1320 'messagesscreen':943,951,961,1039 'method':391,430 'minim':491 'minsdk':1275,1276,1280,1373,1381 'miss':75,1262,1289 'mode':152,1297 'model':311 'modul':1416 'mount':790,795,1162 'must':563 'mutabl':1171,1174 'myapp':642,644,648,1022 'myappstat':653,655 'nativ':459 'navig':556 'navigator.pop':578,985 'navigator.push':939 'need':104 'neither':432 'network':1208 'never':1340 'null':359,476,546,555,699,785,834,849,929,938,1057,1067 'often':1200 'old':1365 'onback':577,984 'onerror':387,702,792,889 'ongo':301 'onitemtap':536,919 'onlin':211 'onloginsuccess':712,741,742,751 'onlogout':717,738,739,876,888 'onpress':847,914 'onsuccess':323,355,378,380,400,449,467,686,788,887 'orchestr':33 'outgo':300 'overrid':650,664,721,757,801,895,965 'overview':222 'packag':42,103,117,122,272,496,615,618 'pad':809,810 'param':1168 'pass':1166 'past':611 'path':490 'pleas':422 'point':35,1003 'popul':330,445 'presenc':1094 'prevent':1395 'proceed':1304 'proguard':1263,1388 'proguard-android-optimize.txt':1443 'proguard-rules.pro':1271,1444 'proguardfil':1441 'project':50,54,1351 'properti':1358 'pub':80 'pubspec.yaml':60,1299 'r8':1389,1396 'raw':479 'readi':612 'real':207,1150 'real-tim':206,1149 'receipt':213 'recent':167 'redund':405,458 'refer':1430 'referenc':1413 'region':143,513,630,676,677,1182,1185 'regist':1132,1155,1157 'releas':1234,1258,1436,1448 'remov':1122,1126 'repositori':238,241 'requir':570,755,880,974,1344,1347,1383 'reset':1047 'resizetoavoidbottominset':565,568,972,1041,1082,1328 'resolv':1364 'return':726,780,806,900,970 'reus':1312 'rich':181 'round':462 'round-trip':461 'rout':43,130,133,360 'rule':313,1257,1265,1391,1447 'runapp':640 'say':1319 'scaffold':567,597,731,807,901,971,1006,1081,1323 'screen':559,562,744,867,949,1236,1321 'sdk':214,420,480,1152,1197,1205,1231,1387,1399,1411 'search':267 'see':1252 'send':184 'separ':102,344,369,1014 'serviceloc':245 'session':334,385,417,694,1140 'set':354,377,396,466,507,525,672,685,690,1036,1070,1073,1085,1097,1098,1279 'setstat':696,708,713,718,781,796 'setup':140 'share':304,306 'show':533 'silent':413 'singleton':246 'sizedbox':829,843,854 'skill':36,46,129,135 'skill-cometchat-flutter-v6' 'source-cometchat' 'specif':109 'spinner':1239 'stabl':1233 'stale':1163 'startup':505 'state':233,651,657,758,764,1017,1048,1172,1178 'statefulwidget':646,748 'statelesswidget':873,953 'static':325 'status':212 'string':623,629,633,771,1186 'strip':1398 'strokewidth':861 'structur':273 'stuck':1237 'style':153,157,837 'subscriptiontyp':519,680,1095,1099,1332 'super.initstate':667 'super.key':649,754,879,962 'support':1287,1367 'suppress':1407 'symptom':1053 'synchron':338,347,1010,1248 'text':182,835,864,906 'texteditingcontrol':767 'textfield':819 'textstyl':839 'theme':149,163,308,1101,1105 'themeiniti':1114 'this.group':964 'this.onloginsuccess':756 'this.onlogout':881 'this.user':963 'thread':268 'three':444 'time':208,1151 'titl':904 'token':531 'top':1049 'topic-agent-skills' 'topic-ai-agent' 'topic-chat' 'topic-claude-code' 'topic-cometchat' 'topic-cursor' 'topic-messaging' 'topic-nextjs' 'topic-react' 'topic-react-native' 'topic-ui-kit' 'transit':1026,1371 'tri':1213,1232 'trigger':17 'trip':463 'true':660,715,783,1084,1293,1360,1362,1438,1440 'type':110,128,209,1092 'typographi':156 'ui':248,305 'ui/src':287,296 'uid':776,787,1032,1215,1221,1226 'uid.isempty':779 'uidcontrol':766,821 'uidcontroller.text.trim':777 'uikit':12,16,31,41,57,66,84,100,224,454,483,1303 'uikit/cometchat_calls_uikit.dart':125 'uikit/cometchat_chat_uikit.dart':120,499,621 'uikit/lib':275 'uikitset':26,139,353,376,465,524,684,1038 'uikitsettingsbuild':508,673,1072,1334 'unnecessari':473 'unreli':382,484 'updat':1147,1179 'uppercas':1184 'url':89 'us':514,631,1189 'use':5,55,106,236,336,564,1030,1089,1130,1187,1229,1240,1246,1336 'user':131,191,196,202,263,292,381,470,475,485,539,542,545,573,574,586,587,591,592,826,922,925,928,944,945,955,956,980,981,993,994,998,999,1175,1318 'user/group':1164 'util':307 'v6':4,13,32,147,162,173,189,201,219 'verifi':1209 'version':71,411 'via':77 'view':312 'void':638,665,669,711,716,773,882 'voidcallback':750,875 'warn':1408 'widget':247,722,802,896,966,1167 'widget.onloginsuccess':791 'width':855 'without':1305,1445 'work':600 'wrong':368,452,478 'yaml':62","prices":[{"id":"29f7f06c-1197-4f86-ad68-45994c32876e","listingId":"d68ffdb9-2de6-427f-a777-d623ad362ae2","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"cometchat","category":"cometchat-skills","install_from":"skills.sh"},"createdAt":"2026-05-07T13:05:12.444Z"}],"sources":[{"listingId":"d68ffdb9-2de6-427f-a777-d623ad362ae2","source":"github","sourceId":"cometchat/cometchat-skills/cometchat-flutter-v6","sourceUrl":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-flutter-v6","isPrimary":false,"firstSeenAt":"2026-05-07T13:05:12.444Z","lastSeenAt":"2026-05-18T19:04:52.549Z"}],"details":{"listingId":"d68ffdb9-2de6-427f-a777-d623ad362ae2","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"cometchat","slug":"cometchat-flutter-v6","github":{"repo":"cometchat/cometchat-skills","stars":27,"topics":["agent-skills","ai-agent","chat","claude-code","cometchat","cursor","messaging","nextjs","react","react-native","ui-kit"],"license":null,"html_url":"https://github.com/cometchat/cometchat-skills","pushed_at":"2026-05-18T05:04:24Z","description":"Add CometChat chat to any React, Next.js, React Native, Angular, Android, iOS, or Flutter project through your AI coding agent. Works with Claude Code, Cursor, Codex, VS Code Copilot, Windsurf, Cline, Kiro, and 50+ more agents.","skill_md_sha":"403633bcea096ec0deb5da1a67b20f676f1b1539","skill_md_path":"skills/cometchat-flutter-v6/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/cometchat/cometchat-skills/tree/main/skills/cometchat-flutter-v6"},"layout":"multi","source":"github","category":"cometchat-skills","frontmatter":{"name":"cometchat-flutter-v6","license":"MIT","description":"Use when building chat with CometChat Flutter UIKit v6 (cometchat_chat_uikit). Triggers on CometChatUIKit, CometChatConversations, CometChatMessageList, CometChatMessageComposer, CometChatMessageHeader, CometChatUsers, CometChatGroups, UIKitSettings, CometChatThemeHelper, CometChatColorPalette, ConversationsBloc, MessageListBloc, CometChatTextBubble, CometChatImageBubble, CometChatMessageBubble, CometChatMentionsFormatter, SliverSpacing, ERR_ALREADY_LOGGED_IN, ERR_INVALID_REGION, authentication null. Also for adding chat to Flutter, customizing bubbles, theming, real-time messages. Use whenever user mentions CometChat or says \"chat UI\".","compatibility":"flutter >=2.5.0; dart >=2.17.0; cometchat_chat_uikit 6.0.0-beta2"},"skills_sh_url":"https://skills.sh/cometchat/cometchat-skills/cometchat-flutter-v6"},"updatedAt":"2026-05-18T19:04:52.549Z"}}