Skip to main content

Flutter SDK

If your app is using Flutter the SDK helps you to easily integrate appcockpit.dev.

Functionality​

Versions​

Whenever the SDK detects a new version it will show an alert or UI component informing the user and ask them to update. Optional updates can be dismissed — once dismissed, the same version won't be shown again (persisted via SharedPreferences).

Maintenance mode​

When maintenance mode is active, the SDK displays a full-screen overlay blocking access to the app and periodically re-checks until maintenance ends.

Installation​

Add to your pubspec.yaml:

dependencies:
appcockpit: ^1.0.0

Then run:

flutter pub get

Setup​

  • Make sure you followed the Getting started guide

  • Copy your API Token from the app settings

Quick Start​

import 'package:appcockpit/appcockpit.dart';

const appInfo = AppInfo(
platform: 'ios',
appId: '<appcockpit_app_id>',
appstoreId: '123456789',
appVersion: '2.5.0',
environment: 'production',
userId: '12345', // optional
);

const maintenanceInfo = MaintenanceInfo(
appId: '<appcockpit_app_id>',
environment: 'production',
);

class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MaintenanceWrapper(
info: maintenanceInfo,
apiToken: 'your-api-token',
child: AppUpdateWrapper(
info: appInfo,
apiToken: 'your-api-token',
child: const YourApp(),
),
),
);
}
}

Pre-built update version UI​

For a streamlined integration, you can use the pre-built update UI widget that handles version checking and update prompts automatically.

Parameters​

ParameterTypeRequiredDescription
infoAppInfoYesApp configuration
apiTokenStringYesAPI authentication token
childWidgetYesThe child widget to display
customUpdateScreenCustomUpdateScreenBuilderNoCustom update screen builder
languageKeyStringNoLanguage for localized strings (defaults to 'en')
buttonThemeUpdateButtonThemeNoTheme customization for the update button
import 'package:appcockpit/appcockpit.dart';

class MyApp extends StatelessWidget {
final info = const AppInfo(
platform: 'ios', // or 'android'
appId: '<appcockpit_app_id>',
appstoreId: '<app_store_id>',
appVersion: '1.0.0',
environment: 'production',
);

final apiToken = '<api_token>';

@override
Widget build(BuildContext context) {
return MaterialApp(
home: AppUpdateWrapper(
info: info,
apiToken: apiToken,
// Optional theme for the update button:
buttonTheme: const UpdateButtonTheme(
backgroundColor: Color(0xFFFF0000),
textColor: Color(0xFFFFFFFF),
),
child: const AppContent(),
),
);
}
}

The AppUpdateWrapper automatically handles:

  • Version checking on app startup
  • Displaying update prompts when needed
  • Managing force update scenarios (non-dismissible)
  • Redirecting to app stores for updates
  • Persisting dismissed optional updates via SharedPreferences

Custom update version UI​

You can customize the update screen by providing your own builder via the customUpdateScreen parameter, or omit it to use the default update UI.

import 'package:appcockpit/appcockpit.dart';

AppUpdateWrapper(
info: appInfo,
apiToken: 'your-api-token',
customUpdateScreen: (context, versionInfo, appInfo, onUpdate, onClose) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('New version: ${versionInfo.version}'),
ElevatedButton(onPressed: onUpdate, child: const Text('Update')),
if (!versionInfo.forceUpdate)
TextButton(onPressed: onClose, child: const Text('Later')),
],
),
),
);
},
child: const YourApp(),
)

Important callbacks:

  • onUpdate(): Call this when the user wants to update. The SDK will redirect to the app store.
  • onClose(): Call this when the user dismisses the update (only available for non-forced updates).

Standalone Version Check​

For cases where you don't want to use the AppUpdateWrapper widget (e.g., custom flows or triggered checks), you can use the checkVersionUpdate function directly. It checks for updates and shows a native AlertDialog instead of the full-screen modal.

import 'package:appcockpit/appcockpit.dart';

await checkVersionUpdate(
context,
appInfo,
'your-api-token',
languageKey: 'en',
);
  • Force updates show a non-dismissible alert that reopens after pressing "Update Now".
  • Optional updates can be dismissed. Dismissed versions are persisted via SharedPreferences.

Pre-built maintenance mode UI​

For a streamlined maintenance mode integration, you can use the pre-built maintenance UI widget that handles maintenance checking and display automatically.

Parameters​

ParameterTypeRequiredDescription
infoMaintenanceInfoYesApp ID and environment
apiTokenStringYesAPI authentication token
childWidgetYesThe child widget to display
customMaintenanceScreenCustomMaintenanceScreenBuilderNoCustom maintenance screen builder
themeMaintenanceThemeNoTheme customization
import 'package:appcockpit/appcockpit.dart';

class MyApp extends StatelessWidget {
final info = const MaintenanceInfo(
appId: '<appcockpit_app_id>',
environment: 'production',
);

final apiToken = '<api_token>';

@override
Widget build(BuildContext context) {
return MaterialApp(
home: MaintenanceWrapper(
info: info,
apiToken: apiToken,
// Optional theme for the maintenance screen:
theme: const MaintenanceTheme(
backgroundColor: Color(0xFF1a1a2e),
titleColor: Color(0xFFFFFFFF),
messageColor: Color(0xFFCCCCCC),
linkColor: Color(0xFF4ea8de),
),
child: const AppContent(),
),
);
}
}

The MaintenanceWrapper automatically handles:

  • Maintenance mode checking on app startup
  • Displaying maintenance screen when maintenance mode is active
  • Blocking app access during maintenance
  • Periodic re-checking until maintenance ends

The maintenance response may include links (e.g., status page, social media) that are rendered as tappable cards.

Custom maintenance mode UI​

You can customize the maintenance screen by providing your own customMaintenanceScreen builder, or omit it to use the default maintenance UI.

import 'package:appcockpit/appcockpit.dart';

MaintenanceWrapper(
info: maintenanceInfo,
apiToken: 'your-api-token',
customMaintenanceScreen: (context, maintenanceInfo) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(maintenanceInfo.title ?? 'Under Maintenance'),
Text(maintenanceInfo.description ?? 'Please check back soon.'),
],
),
),
);
},
child: const YourApp(),
)

Types​

AppInfo​

class AppInfo {
final String platform; // 'ios' or 'android'
final String appId; // Your app identifier (e.g., bundle ID)
final String appstoreId; // App Store ID (iOS) or package name (Android)
final String appVersion; // Current app version (e.g., '2.5.0')
final String environment; // Deployment environment (e.g., 'production')
final String? userId; // Optional user ID for tracking
}

MaintenanceInfo​

class MaintenanceInfo {
final String appId;
final String environment;
}

VersionResponse​

class VersionResponse {
final String version;
final String platform;
final bool forceUpdate;
final String? defaultUpdateMessage;
final Map<String, String>? updateMessages;
}

MaintenanceResponse​

class MaintenanceResponse {
final bool active;
final String? title;
final String? description;
final List<MaintenanceLink>? links;
}

class MaintenanceLink {
final String title;
final String url;
}

Language Support​

The SDK supports 20 languages for built-in update prompts. Pass a language key to AppUpdateWrapper or checkVersionUpdate:

AppUpdateWrapper(
info: appInfo,
apiToken: 'your-api-token',
languageKey: 'de',
child: const YourApp(),
)

If no language is specified, the SDK defaults to English.

The API can also return custom update_messages per language, which take priority over the built-in defaults.

KeyLanguage
'en'English
'es'Spanish
'fr'French
'de'German
'it'Italian
'pt'Portuguese
'ru'Russian
'ja'Japanese
'ko'Korean
'zh'Chinese
'ar'Arabic
'hi'Hindi
'nl'Dutch
'sv'Swedish
'da'Danish
'no'Norwegian
'fi'Finnish
'pl'Polish
'tr'Turkish
'he'Hebrew