terminate_restart 1.0.10
terminate_restart: ^1.0.10 copied to clipboard
A Flutter plugin for app termination and restart with data clearing options.
Terminate Restart #
A robust Flutter plugin for terminating and restarting your app with extensive customization options. Perfect for implementing dynamic updates, clearing app state, or refreshing your app's UI.
Demo #
Plugin in Action
Clean & Simple Interface
Features #
-
Three Restart Modes:
-
UI-only Restart: (~200ms)
- Recreates activities/views while maintaining connections
- Perfect for theme changes, language switches
- Preserves network connections and background tasks
- Faster execution with minimal disruption
-
Full Process Restart: (~800ms)
- Complete app termination and restart
- Ideal for updates, security-related changes
- Cleans up all resources and states
- Ensures fresh start with no residual state
-
With Confirmation Dialog: (+50ms)
- Shows a customizable confirmation dialog
- User can choose to proceed or cancel
- Supports both UI-only and full restart
- Perfect for user-initiated actions
-
-
Smart Data Management:
- Configurable data clearing during restart
- Granular control over data preservation
- Secure handling of sensitive information
-
Security Features:
- Optional keychain data preservation
- Secure user defaults handling
- Clean process termination
-
Platform Support:
- Android: Full support with activity recreation
- iOS: Compliant with App Store guidelines
-
User Experience:
- Built-in confirmation dialogs
- Customizable messages and buttons
- Smooth transitions and animations
Installation #
dependencies:
terminate_restart: ^1.0.10
Quick Start #
Get up and running with Terminate Restart in minutes:
- Add Dependency
dependencies:
terminate_restart: ^1.0.10
- Import Package
import 'package:terminate_restart/terminate_restart.dart';
- Initialize the Plugin
void main() {
WidgetsFlutterBinding.ensureInitialized();
TerminateRestart.instance.initialize();
runApp(MyApp());
}
- Basic Usage
// Quick UI refresh
await TerminateRestart.instance.restartApp(
options: const TerminateRestartOptions(
terminate: false,
),
);
// Full app restart
await TerminateRestart.instance.restartApp(
options: const TerminateRestartOptions(
terminate: true,
),
);
// With confirmation dialog
await TerminateRestart.instance.restartAppWithConfirmation(
context,
title: 'Restart App',
message: 'Do you want to restart the app?',
terminate: true,
);
Feature Comparison #
Feature | Description |
---|---|
UI Restart | Quick UI refresh without app termination |
Full Restart | Complete app termination and restart |
Data Clearing | Optional storage clearing with keychain preservation |
Confirmation | Optional user confirmation before restart |
iOS Compliance | System-approved methods for App Store compliance |
iOS App Store Compliance #
This plugin follows Apple's App Store guidelines regarding app termination:
-
User-Initiated Actions: The plugin only performs termination in response to explicit user actions.
-
Graceful Shutdown: On iOS, the plugin uses approved APIs to ensure graceful app termination:
- Uses
exit(0)
for clean termination - Properly saves state and closes resources
- Follows iOS application lifecycle
- Uses
-
Restart Mechanism: The restart functionality complies with iOS guidelines by:
- Using approved launch mechanisms
- Preserving user preferences when requested
- Maintaining system integrity
-
Data Handling: When clearing data:
- Respects iOS data protection
- Properly handles keychain items
- Maintains necessary system files
Note: While Android allows direct app termination, iOS termination is handled through system-approved methods.
Common Use Cases #
-
After Dynamic Updates
// After downloading new assets/code await TerminateRestart.instance.restartAppWithConfirmation( context, title: 'Update Ready', message: 'Restart to apply updates?', terminate: true, );
-
Clearing Cache
// Clear app data but preserve important settings await TerminateRestart.instance.restartApp( options: const TerminateRestartOptions( terminate: true, clearData: true, preserveKeychain: true, preserveUserDefaults: true, ), );
-
Quick UI Refresh
// Refresh UI without full restart await TerminateRestart.instance.restartApp( options: const TerminateRestartOptions( terminate: false, ), );
-
With Confirmation Dialog
// Show confirmation dialog before restart await TerminateRestart.instance.restartAppWithConfirmation( context, title: 'Restart Required', message: 'Do you want to restart the app?', terminate: true, clearData: false, preserveKeychain: true, );
Performance Metrics #
Operation | Average Time |
---|---|
UI-only Restart | ~300ms |
Full Termination | ~800ms |
Data Clearing | ~200ms |
With Dialog | +100ms |
Security Considerations #
-
Sensitive Data
- Use
preserveKeychain
for credentials - Clear data on logout
- Handle biometric authentication state
- Use
-
State Management
- Clear sensitive data before restart
- Implement proper authentication state handling
- Use secure storage for critical information
-
Platform Security
- Proper permission handling
- Secure data clearing
- Protected file access
Contributing #
Contributions are welcome! Please read our contributing guidelines before submitting PRs.
License #
This project is licensed under the MIT License - see the LICENSE file for details.
Support #
If you have any questions or need help, you can:
- Open an issue
- Check our example for more usage examples
- Read our API documentation
Complete Example #
Check out our example app for a full demonstration of all features, including:
- Basic UI/Process restart
- Data clearing with preservation options
- Custom confirmation dialogs
- Error handling
- State management
- Platform-specific features
Demo #
Quick Preview #
Platform-Specific Details #
Android Implementation #
The Android implementation uses a combination of techniques to ensure reliable app restart:
// Activity recreation (UI-only restart)
currentActivity.recreate()
// Full process termination
Process.killProcess(Process.myPid())
exitProcess(0)
// Smart Intent handling
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
iOS Implementation #
The iOS implementation provides:
- Clean process termination
- State preservation options
- Keychain data handling
- User defaults management
Author #
Created by Ahmed Sleem GitHub • pub.dev • LinkedIn
iOS Configuration #
For the restart functionality to work properly on iOS, you need to add URL scheme entries to your Info.plist
file:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
</array>
</dict>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
</array>
</dict>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
</array>
<key>CFBundleURLName</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
</dict>
</array>
This configuration allows the plugin to restart your app by opening a URL with your app's bundle identifier.
Configuration Options #
Core Parameters #
Parameter | Type | Default | Description |
---|---|---|---|
terminate |
bool |
true |
Whether to fully terminate the app process or just restart the UI |
clearData |
bool |
false |
Whether to clear app data during restart |
preserveKeychain |
bool |
false |
Whether to preserve keychain data when clearing app data |
preserveUserDefaults |
bool |
false |
Whether to preserve user defaults when clearing app data |
API Methods #
restartApp
Future<bool> restartApp({
required TerminateRestartOptions options,
})
Restarts the app immediately without user confirmation. Returns true
if the restart was successful.
Parameters:
options
: ATerminateRestartOptions
object that configures the restart behavior.
restartAppWithConfirmation
Future<bool> restartAppWithConfirmation(
BuildContext context, {
String title = 'Restart Required',
String message = 'The app needs to restart to apply changes.',
String confirmText = 'Restart Now',
String cancelText = 'Later',
bool clearData = false,
bool preserveKeychain = false,
bool preserveUserDefaults = false,
bool terminate = true,
})
Shows a confirmation dialog before restarting the app. Returns true
if the user confirmed and the restart was successful, or false
if the user canceled.
Parameters:
context
: The BuildContext used to show the dialog.title
: The title of the confirmation dialog.message
: The message shown in the confirmation dialog.confirmText
: The text for the confirm button.cancelText
: The text for the cancel button.clearData
: Whether to clear app data during restart.preserveKeychain
: Whether to preserve keychain data when clearing app data.preserveUserDefaults
: Whether to preserve user defaults when clearing app data.terminate
: Whether to fully terminate the app process or just restart the UI.
Frequently Asked Questions #
1. What's the difference between UI-only and Full restart? #
- UI-only Restart: Only recreates the UI components while keeping the app process alive. Perfect for theme changes or language switches.
- Full Restart: Completely terminates the app process and starts fresh. Ideal for updates or when you need a clean state.
2. When should I use confirmation dialog? #
Use confirmation dialog when:
- User needs to be aware of the restart
- Data might be lost during restart
- Action is user-initiated
- Critical operations are in progress
3. Will my app data be preserved? #
- By default, all app data is preserved
- Use
clearData: true
to clear app data - Use
preserveKeychain
andpreserveUserDefaults
to selectively preserve data
4. Is it safe to use in production? #
Yes! The plugin:
- Uses official platform APIs
- Follows platform guidelines
- Handles errors gracefully
- Has no special permission requirements
Advanced Use Cases #
1. Language Change with Data Preservation #
Future<void> changeLanguage(String newLocale) async {
// Save new locale
await prefs.setString('locale', newLocale);
// Restart UI only with confirmation
await TerminateRestart.instance.restartAppWithConfirmation(
context,
title: 'Language Change',
message: 'Restart app to apply new language?',
terminate: false,
preserveUserDefaults: true,
);
}
2. Update Installation with Progress #
Future<void> installUpdate() async {
try {
// Download update
await downloadUpdate();
// Apply update with confirmation
final confirmed = await TerminateRestart.instance.restartAppWithConfirmation(
context,
title: 'Update Ready',
message: 'Install update and restart?',
terminate: true,
);
if (!confirmed) {
scheduleUpdateReminder();
}
} catch (e) {
handleUpdateError(e);
}
}
3. Secure Logout with Data Clearing #
Future<void> secureLogout() async {
// Clear sensitive data
await TerminateRestart.instance.restartApp(
options: const TerminateRestartOptions(
terminate: true,
clearData: true,
preserveUserDefaults: true, // Keep app settings
preserveKeychain: false, // Clear credentials
),
);
}
How It Works #
graph TD
A[Start] --> B{Restart Type}
B -->|UI-only| C[Recreation Mode]
B -->|Full| D[Termination Mode]
C --> E{Show Dialog?}
D --> E
E -->|Yes| F[Show Confirmation]
E -->|No| G[Process Restart]
F -->|Confirmed| G
F -->|Cancelled| H[Cancel Operation]
G --> I{Clear Data?}
I -->|Yes| J[Clear App Data]
I -->|No| K[Preserve Data]
J --> L[Restart App]
K --> L
L --> M[End]
Flow Explanation: #
-
Restart Type Selection:
- Choose between UI-only or Full restart
- Each type optimized for specific use cases
-
Confirmation Dialog (Optional):
- Can be added to any restart type
- Fully customizable UI
- User can cancel operation
-
Data Management:
- Optional data clearing
- Selective data preservation
- Secure handling of sensitive data
-
Platform-Specific Implementation:
- Android: Activity/Process management
- iOS: UIApplication handling
- Error handling and recovery