restart_app 包提供了一种简单的方法,可在原生平台行为下重启或重新启动 Flutter 应用程序。它使开发者能够以编程方式在 Android、iOS、Web、macOS、Windows 和 Linux 上重启应用,确保跨平台的一致用户体验。该插件利用平台特定的重启机制,例如系统级应用重新启动或浏览器刷新,非常适合主题切换、语言更改或配置更新等需要完全刷新应用的场景。该插件轻量且易于集成到现有项目中。
适合场景
应用主题重新加载
语言更改需要重启
配置更新处理
用户会话已重置
调试和开发工作流程
主要特点
跨平台重启支持
原生平台行为
简单的 API 集成
无需额外权限
适用于移动设备、桌面端和网页
适合对象
需要应用重启功能的开发者
具有动态UI设置的应用程序
多语言应用程序
开发工具和调试实用程序
使用建议
在所有网页环境中可能无法正常工作
需要正确处理状态持久化
不适用于即时状态转换
对重启时间的控制有限
平台特定的限制可能适用
原始 README
以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。
restart_app
Restart or relaunch your Flutter app from Dart with one call.
Each platform uses the safest supported restart path available to Flutter apps. See the published docs for guides, reference, and deployment details. The platform behavior guide covers the exact native mechanism on each target.
final result = awaitRestart.restartApp();
if (!result.success) {
// Show or log result.code and result.message.
}
Restart.restartApp() is the restart API. It returns a RestartResult with success, the resolved mode, and platform error details when the restart cannot be started.
Customization
Default behavior works for normal app restart flows. Pass options only when your app needs a specific platform behavior.
awaitRestart.restartApp(
mode: RestartMode.platformDefault,
webOrigin: '#/home',
forceKill: false,
notificationTitle: 'Restart',
notificationBody: 'Tap to reopen the app.',
);
Parameters
Parameter
Platform
Description
mode
All
Requested restart behavior: platformDefault, flutterEngine, process, or notificationFallback.
webOrigin
Web
Custom URL for the reload. When null, the current page reloads and keeps its route. Supports hash strategy (e.g. '#/home').
notificationTitle
iOS
Title of the local notification shown only when mode is notificationFallback. Defaults to Restart.
notificationBody
iOS
Body of the local notification shown only when mode is notificationFallback. Defaults to Tap to reopen the app.
forceKill
Android
When true, fully terminates the process after launching the new activity. Defaults to false. RestartMode.process enables this path automatically on Android.
Platform behavior
Platform
Mechanism
Limitations
Android
Relaunches the main activity via PackageManager. Supports Android TV and Fire TV via leanback launcher fallback. RestartMode.process and forceKill: true kill the process after launch for a clean cold start.
None
iOS
Recommended: opt-in Flutter engine restart that creates a new FlutterEngine, runs Dart again, re-registers plugins, and replaces the root FlutterViewController in the same iOS process. Legacy: local notification + exit(0) + user tap.
iOS has no public API for automatic full process restart. Engine restart is not a process restart and cannot reset native singleton state. Legacy fallback requires notification permission and user action.
Web
Reloads the page using window.location.
None
macOS
Launches a new instance via NSWorkspace and terminates the current process.
Sandboxed (Mac App Store) builds cannot launch new instances of themselves. Returns a failed result in this case.
Linux
Replaces the current process via execv. Fully automatic.
None
Windows
Launches a new instance via CreateProcess and terminates the current process.
MSIX-packaged (Microsoft Store) apps cannot be relaunched via CreateProcess.
iOS
iOS does not provide a public API for an app to terminate itself and automatically launch a fresh process of the same app. Android-style full process restart is not available on iOS with public APIs.
restart_app supports two iOS behaviors:
Flutter engine restart, recommended. This keeps the iOS process alive, creates a new FlutterEngine, runs the Dart entrypoint again, re-registers plugins through the host app's GeneratedPluginRegistrant, creates a new FlutterViewController, replaces the active root view controller, and destroys the old engine context.
Notification fallback, legacy and explicit only. This schedules a local notification, calls exit(0), and requires the user to tap the notification to reopen the app. This is not a true restart and is not recommended as normal product behavior.
Configure Flutter engine restart
The host app owns GeneratedPluginRegistrant, so iOS engine restart requires one app-side setup step.
Choose the snippet that matches your iOS lifecycle.
Flutter 3.41+ UIScene apps
Use this shape when your app has migrated to Flutter's UIScene lifecycle and your delegate already looks like @objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate.
Keep the normal plugin registration for the implicit app engine in didInitializeImplicitFlutterEngine. Add RestartAppPlugin.configureEngineRestart in application(_:didFinishLaunchingWithOptions:) so restart_app can register plugins on each newly created engine:
This follows Flutter's UIScene migration model: the initial engine is registered through didInitializeImplicitFlutterEngine, and restarted engines are registered through the restart_app callback above.
restart_app automatically looks for the active foreground UIWindowScene and replaces that scene's key window root FlutterViewController. If your app has multiple scenes or a custom native shell, pass a windowProvider or viewControllerInstaller to configureEngineRestart so the plugin targets the correct window.
If you implement your own SceneDelegate, keep Flutter's scene lifecycle wiring there too: subclass FlutterSceneDelegate or conform to FlutterSceneLifeCycleProvider, as described in Flutter's UISceneDelegate migration guide.
Classic AppDelegate apps
Use this shape only when your app still registers plugins from application(_:didFinishLaunchingWithOptions:).
RestartMode.platformDefault uses Flutter engine restart on iOS when this setup is present.
If this setup is missing, platformDefault fails cleanly on iOS instead of falling back to notification + exit(0).
To request the engine path explicitly:
final result = awaitRestart.restartApp(
mode: RestartMode.flutterEngine,
);
iOS capabilities
final capability = awaitRestart.restartCapability();
if (capability.flutterEngineRestart) {
awaitRestart.restartApp(mode: RestartMode.flutterEngine);
}
What iOS engine restart resets
It resets:
Dart root isolate
Flutter widget tree
Flutter engine-owned platform channels
Flutter plugin registrations for the new engine
Platform-view factory registrations for the new engine
It does not reset:
The iOS process
Swift, Objective-C, C, or C++ static/global state
Native singleton state
Native resources retained by plugins
Unrelated Flutter engines or background isolates
Native app launch lifecycle callbacks from a real process launch
For code-push systems and plugins with heavy native state, verify behavior in a real release build. Same-process engine restart is not equivalent to full process restart.
Legacy notification fallback
Use the notification fallback only when the tradeoff is acceptable:
Restart.restartApp(
mode: RestartMode.notificationFallback,
notificationTitle: 'Update applied',
notificationBody: 'Tap to reopen the app.',
);
The plugin requests notification permission at the moment of restart. If not already granted, iOS shows the system prompt right before exit, which feels abrupt.
Request permission earlier in your app's lifecycle. The permission_handler package works well for this.
If notification permission has been denied, restartApp() returns a failed result.
Provisioning profiles
restart_app uses local notifications only, not push notifications. It adds no push-related entitlements to your app.
If you see "requires a provisioning profile with the Push Notifications feature" when exporting an IPA, another dependency is the cause (commonly firebase_messaging). Add the Push Notifications capability to your distribution provisioning profile.
Linux
Command-line arguments
By default, the restarted process launches without the original command-line arguments. To preserve them, call restart_app_plugin_store_argv in your linux/main.cc before running the Flutter engine:
Most Flutter apps don't rely on command-line arguments, so this step is optional.
Background isolates
Restart.restartApp() uses a platform channel and must run on the main isolate. Calling it from a background isolate throws:
Bad state: TheBackgroundIsolateBinaryMessenger.instance value is invalid
until BackgroundIsolateBinaryMessenger.ensureInitialized is executed.
Send a message from your isolate to the main isolate instead:
// Main isolate: listen for restart signalsfinal receivePort = ReceivePort();
receivePort.listen((message) {
if (message == 'restart') {
Restart.restartApp();
}
});
// Spawn the isolate with the SendPortawaitIsolate.spawn(myIsolateFunction, receivePort.sendPort);
// Background isolate: signal instead of calling restartApp() directlyvoidmyIsolateFunction(SendPort sendPort) {
// ... your background work ...
sendPort.send('restart');
}
Requirements
Dart SDK:>=3.4.0 · Flutter:>=3.22.0
Platform
Minimum
Android
minSdk 21, Java 17, Android Gradle Plugin 8 or 9
iOS
12.0
macOS
10.15
The Android module builds on Android Gradle Plugin 8 and 9. It applies the Kotlin Gradle Plugin only when nothing else has already provided Kotlin, so it builds on both AGP majors with the Flutter template default android.builtInKotlin=false. Turning built-in Kotlin on is a separate Flutter migration that needs Flutter 3.47 or later; on earlier Flutter releases it fails for every plugin, including Flutter's own plugin template.