Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
cometchat avatar

Cometchat Flutter V6 Migration

  • 5 installs
  • 70 repo stars
  • Updated June 23, 2026
  • cometchat/cometchat-skills

Migrate a CometChat Flutter app from UIKit v5 to v6, covering import changes, GetX removal, navigation rewrites, and notification service updates.

About

Provides a complete guide for migrating a consumer CometChat Flutter app from UIKit v5 to v6. A developer uses it when moving off the GetX-based two-package v5 to the unified Bloc-based v6.

  • Maps every v5-to-v6 change: packages, state, navigation, init, calls
  • Removes GetX, PageManager, BuilderSettings, and extra dependencies

Cometchat Flutter V6 Migration by the numbers

  • 5 all-time installs (skills.sh)
  • Ranked #828 of 1,039 Mobile Development skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cometchat/cometchat-skills --skill cometchat-flutter-v6-migration

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs5
repo stars70
Last updatedJune 23, 2026
Repositorycometchat/cometchat-skills

What it does

Migrate a CometChat Flutter app from UIKit v5 to v6, covering import changes, GetX removal, navigation rewrites, and notification service updates.

Files

SKILL.mdMarkdownGitHub ↗

CometChat Flutter — v5 to v6 Migration

Complete guide for migrating a consumer app from UIKit v5 to v6.

What Changed

Areav5v6
Packagescometchat_chat_uikit + cometchat_calls_uikit (separate)cometchat_chat_uikit only (calls bundled)
StateGetX (Get.put, GetBuilder, Obx, .obs, RxBool)Plain StatefulWidget + setState()
NavigationPageManager (GetxController singleton)Direct Navigator.push
InitInitializeCometChat.init() + CometChatCallingExtension() + extensions + aiFeatureInline CometChatUIKit.init() + enableCalls: true + CallingConfiguration()
Calls SDK initCometChatCallingExtension() in extensions listCallEventService.instance.init() after login
ScreensSeparate controller + widget files per screenSingle file, state in StatefulWidget
DashboardMyHomePage/MyPageView with GetX PageManagerHomeScreen with IndexedStack
MessagesMessagesSample + CometChatMessagesControllerMessagesScreen with listener mixins
Builder systemBuilderSettings, BuilderColor, BuilderTypographyRemoved — toggle features per-widget (e.g. disableReactions, hideReplyInThreadOption on CometChatMessageList) or via the relevant component's constructor params. There is no global ComponentToggles class.
NotificationsVoipNotificationHandler, APNSServiceVoipCallHandler, ApnsService
Extra depsget, google_sign_in, firebase_auth, bugsee_flutter, shared_preferences, toast, mobile_scanner, app_badge_plusNone of these
Localizationcc.Translations.delegate + GlobalMaterialLocalizations in MaterialAppHandled by UIKit internally
Call screencallMain() entry point + CallApp + CallScreen widgetCometChatOngoingCall widget for the in-call UI + CometChatDisplayIncomingCallOverlay for incoming-call presentation. No separate Dart entry point.
Android minSdk2426 (required by cometchat_calls_sdk)

Step 1: pubspec.yaml

# ❌ v5
dependencies:
  cometchat_chat_uikit:
    path: ../chat_uikit
  cometchat_calls_uikit:
    path: ../calls_uikit
  get: ^4.6.5
  google_sign_in: ^6.2.2
  firebase_auth: ^5.3.4
  bugsee_flutter: ^8.0.0
  permission_handler: ^11.3.1
  shared_preferences: ^2.2.1
  toast: ^0.3.0
  mobile_scanner: ^7.1.2
  app_badge_plus: ^1.2.6

# ✅ v6
dependencies:
  cometchat_chat_uikit:
    hosted: https://dart.cloudsmith.io/cometchat/cometchat/
    version: 6.0.0-beta2
  firebase_core: ^3.9.0
  firebase_crashlytics: ^4.1.3
  firebase_messaging: ^15.1.6
  flutter_local_notifications: ^18.0.0
  flutter_callkit_incoming: ^2.5.0
  http: ^1.2.0
  intl: ^0.20.2

Step 2: Fix All Imports

v5 Importv6 Import
package:cometchat_calls_uikit/cometchat_calls_uikit.dartpackage:cometchat_chat_uikit/cometchat_calls_uikit.dart
package:get/get.dartRemove entirely
builder/builder_settings.dartRemove — toggle features per-widget instead (no global toggle class in v6)
builder/builder_settings_helper.dartRemove
utils/page_manager.dartRemove — use Navigator.push
utils/initialize_cometchat.dartRemove — inline init
utils/bool_singleton.dartRemove
utils/text_constants.dartRemove
prefs/shared_preferences.dartRemove

Step 3: Rewrite Init

// ❌ v5 — helper class with CometChatCallingExtension + extensions + aiFeature
class InitializeCometChat {
  static Future<bool> init() async {
    final builder = UIKitSettingsBuilder()
      ..callingExtension = CometChatCallingExtension()  // REMOVED in v6
      ..extensions = CometChatUIKitChatExtensions.getDefaultExtensions()  // REMOVED
      ..aiFeature = CometChatUIKitChatAIFeatures.getDefaultAiFeatures();  // REMOVED
    // ...
  }
}

// ✅ v6 — inline, enableCalls + CallingConfiguration replace all three
final settings = (UIKitSettingsBuilder()
      ..subscriptionType = CometChatSubscriptionType.allUsers
      ..region = AppCredentials.region
      ..appId = AppCredentials.appId
      ..authKey = AppCredentials.authKey
      ..enableCalls = true
      ..callingConfiguration = CallingConfiguration())
    .build();

CometChatUIKit.init(uiKitSettings: settings, onSuccess: (_) { ... });

Removed v5 UIKitSettingsBuilder properties

  • callingExtension → replaced by enableCalls: true
  • extensions → removed (extensions auto-registered in v6)
  • aiFeature → removed (AI features auto-registered in v6)

Calls SDK Init for Cached Sessions

// ❌ v5 — CometChatCallingExtension handled it automatically

// ✅ v6 — explicit init needed when restoring cached session (no login call)
Future<void> _initCallsSdk() async {
  await CallEventService.instance.init(
    configuration: CallingConfiguration(),
  );
}
// Call after checking getLoggedInUser() returns non-null

Step 4: Remove GetX

PageManager → Navigator.push

// ❌ v5
Get.put(PageManager());
Get.find<PageManager>().navigateToMessages(context: context, user: user);

// ✅ v6
Navigator.push(context, MaterialPageRoute(
  builder: (_) => MessagesScreen(user: user),
));

GetBuilder → StatefulWidget with listener mixins

// ❌ v5
GetBuilder<CometChatMessagesController>(
  init: messagesController,
  tag: messagesController.tag,
  builder: (controller) => Scaffold(/* ... */),
)

// ✅ v6
class _MessagesScreenState extends State<MessagesScreen>
    with UserListener, CometChatUserEventListener,
         GroupListener, CometChatGroupEventListener {
  late User? _user;
  late Group? _group;
  // setState() instead of controller.update()
}

Rx variables → plain state

// ❌ v5
var isBlockLoading = false.obs;
// Usage: isBlockLoading.value = true;

// ✅ v6
bool _isUserBlocked = false;
// Usage: setState(() => _isUserBlocked = true);

Obx dialogs → StatefulBuilder

// ❌ v5 — Obx in dialog for loading indicator
Obx(() => isLoading.value ? CircularProgressIndicator() : Icon(Icons.check))

// ✅ v6 — StatefulBuilder in dialog
StatefulBuilder(builder: (context, setDialogState) {
  return isLoading ? CircularProgressIndicator() : Icon(Icons.check);
})

Step 5: Removed v5 APIs

These v5 widget parameters/classes don't exist in v6:

v5 APIStatus in v6
CometChatCompactMessageComposerRemoved — use CometChatMessageComposer
CometChatAIAssistantChatHistoryRemoved
CometChatMessageHeader options paramRemoved — use trailingView
CometChatMessageList messageId paramRemoved — use goToMessageId
CometChatMessageList hideFlagOptionRemoved
CometChatMessageList generateConversationSummaryRemoved
getDataSource() on message listRemoved
AssetConstants.conversationSummaryOutlinedRemoved
CometChatBannedMembers (standalone widget)Not exported in v6
CometChatCallLogParticipants (standalone)Not exported in v6
CometChatCallLogRecordings (standalone)Not exported in v6
CometChatCallLogHistory (standalone)Not exported in v6
CometChatCallingExtension()Replaced by enableCalls: true + CallingConfiguration()
CometChatUIKitChatExtensions.getDefaultExtensions()Removed — auto-registered
CometChatUIKitChatAIFeatures.getDefaultAiFeatures()Removed — auto-registered
CallSettingsBuilderReplaced by SessionSettingsBuilder
FormatPatterns.stripFormatting()Removed
CallStateController.instanceReplaced by CallStateService.instance

CallSettingsBuilder → SessionSettingsBuilder

// ❌ v5
CallSettingsBuilder()
  ..enableDefaultLayout = true

// ✅ v6
SessionSettingsBuilder()
  ..setLayout(LayoutType.tile)
  ..startVideoPaused(true)  // for audio calls
  ..hideSwitchCameraButton(true)
  ..hideToggleVideoButton(true)

Step 6: Flatten Screen Structure

# ❌ v5 — controller + widget per screen
messages/
├── messages.dart                    # MessagesSample widget
└── messages_controller.dart         # GetxController
group_info/
├── cometchat_group_info.dart
└── cometchat_group_info_controller.dart

# ✅ v6 — single file per screen
screens/
├── messages_screen.dart             # Widget + state + listeners
├── group_info_screen.dart
├── home_screen.dart
└── ...

Class Rename Map

v5 Classv6 Class
MyHomePage / MyPageViewHomeScreen
MessagesSampleMessagesScreen
GuardScreenGuardScreen (same name, rewritten)
LoginSampleUsersLoginScreen

Step 7: Update MaterialApp

// ❌ v5 — localization delegates, BuilderTypography, callMain entry point
MaterialApp(
  supportedLocales: const [Locale('en'), Locale('ar'), ...],
  localizationsDelegates: const [
    cc.Translations.delegate,
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
  ],
  theme: ThemeData(
    fontFamily: BuilderTypography.font,
    extensions: [CometChatColorPalette(primary: BuilderColor.brandColor)],
  ),
  navigatorKey: CallNavigationContext.navigatorKey,
)

// ✅ v6 — Material 3, no builder system, no localization delegates
MaterialApp(
  debugShowCheckedModeBanner: false,
  navigatorKey: LocalNotificationService.navigatorKey,
  theme: ThemeData(
    colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
    useMaterial3: true,
  ),
  darkTheme: ThemeData(
    colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple, brightness: Brightness.dark),
    useMaterial3: true,
    brightness: Brightness.dark,
  ),
  themeMode: ThemeMode.system,
)

Remove the callMain() entry point and CallApp/CallScreen widget entirely. V6 renders the in-call UI via the CometChatOngoingCall widget (placed in your widget tree once the call is active) and presents incoming calls via CometChatDisplayIncomingCallOverlay. There is no CallScreenOverlay.show() API.

Step 8: Update Notification Services

v5 Classv6 Class
VoipNotificationHandlerVoipCallHandler
APNSServiceApnsService
FirebaseServiceFirebaseService (same)

VoIP Cold Start

// ❌ v5 — handled in dashboard initState
VoipNotificationHandler.handleNativeCallIntent(context);

// ✅ v6 — init early in main(), markSdkReady after login
VoipCallHandler.instance.init();  // in main()
await VoipCallHandler.instance.markSdkReady();  // after login

Step 9: resizeToAvoidBottomInset

// ❌ v5 — default true, SafeArea wrapping
Scaffold(body: SafeArea(child: Column(children: [messageList, composer])))

// ✅ v6 — must be false, composer handles keyboard internally
Scaffold(
  resizeToAvoidBottomInset: false,
  body: Column(children: [Expanded(child: messageList), composer]),
)

Step 10: Android Build

In android/app/build.gradle(.kts):

defaultConfig {
    minSdk = 26  // Was 24 in v5, required by cometchat_calls_sdk in v6
}

In android/gradle.properties:

android.enableJetifier=true  // Required for support library conflicts

Step 11: Delete v5 Files

  • builder/ folder entirely
  • utils/page_manager.dart, initialize_cometchat.dart, bool_singleton.dart, text_constants.dart
  • prefs/shared_preferences.dart
  • services/bugsee_services.dart
  • qr_scanner/ folder
  • ai_agents/ folder
  • call_screen.dart
  • demo_meta_info_constants.dart (recreate minimal if needed)
  • All *_controller.dart files
  • auth/login_screen.dart (if it depended on google_sign_in/firebase_auth)

Gotchas

  • CometChatCallingExtension(), extensions, and aiFeature on UIKitSettingsBuilder don't exist in v6. Extensions and AI features are auto-registered. Only enableCalls: true + CallingConfiguration() is needed.
  • CallSettingsBuilder is renamed to SessionSettingsBuilder with different API: .setLayout(LayoutType.tile) instead of ..enableDefaultLayout = true.
  • v6 CometChatMessageList doesn't have messageId param — use goToMessageId instead.
  • CometChatBannedMembers, CometChatCallLogParticipants, CometChatCallLogRecordings, CometChatCallLogHistory are not exported as standalone widgets in v6.
  • The callMain() entry point pattern (separate Dart entry point for Android CallActivity) is gone. V6 renders the in-call UI via the CometChatOngoingCall widget within your existing app navigator + CometChatDisplayIncomingCallOverlay for incoming-call UI.
  • FormatPatterns.stripFormatting() doesn't exist in v6. Use MarkdownTextFormatter instead.

Checklist

  • [ ] pubspec.yaml — remove cometchat_calls_uikit, get, and all unused deps
  • [ ] All imports — cometchat_calls_uikitcometchat_chat_uikit/cometchat_calls_uikit.dart
  • [ ] All imports — remove get/get.dart
  • [ ] Init — remove CometChatCallingExtension, extensions, aiFeature; add enableCalls + CallingConfiguration
  • [ ] Add CallEventService.instance.init() for cached sessions
  • [ ] Remove PageManager — replace with Navigator.push
  • [ ] Remove all GetBuilder/Obx/Get.put/Get.find
  • [ ] Remove all *_controller.dart files
  • [ ] Flatten screens into screens/ folder
  • [ ] Remove BuilderSettings — toggle features per-widget (e.g. disableReactions, hideReplyInThreadOption) on the relevant CometChat widget instead
  • [ ] Update MaterialApp — remove localization delegates, remove BuilderTypography
  • [ ] Remove callMain() entry point and CallScreen widget
  • [ ] CallSettingsBuilderSessionSettingsBuilder
  • [ ] resizeToAvoidBottomInset: false on all Scaffolds with composer
  • [ ] Android minSdk = 26
  • [ ] Android enableJetifier = true
  • [ ] Delete all unused v5 files
  • [ ] Test: init → login → conversations → messages → calls → logout → re-login

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.