Desktop support allows you to compile Flutter source code to a native Windows, macOS, or Linux desktop app. Flutter’s desktop support also extends to plugins—you can install existing plugins that support the Windows, macOS, or Linux platforms, or you can create your own.
Requirements
To create a Flutter app with desktop support, you need the following software:
- Flutter SDK. See the Flutter SDK installation instructions.
- Optional: An IDE that supports Flutter. You can install Android Studio, IntelliJ IDEA, or Visual Studio Code and install the Flutter and Dart plugins to enable language support and tools for refactoring, running, debugging, and reloading your desktop app within an editor. See setting up an editor for more details.
Additional Windows requirements
For Windows desktop development, you need the following in addition to the Flutter SDK:
- Visual Studio 2019 (not to be confused with Visual Studio Code) with the “Desktop development with C++” workload installed, including all of its default components
Additional macOS requirements
For macOS desktop development, you need the following in addition to the Flutter SDK:
Additional Linux requirements
For Linux desktop development, you need the following in addition to the Flutter SDK:
- Clang
- CMake
- GTK development headers
- Ninja build
- pkg-config
- libblkid
- liblzma
The easiest way to install the Flutter SDK along with these dependencies is by using snapd. For more information, see Installing snapd.
Once you have snapd
, you can install Flutter using the Snap Store, or at the command line:
$ sudo snap install flutter --classic
If snapd
is unavailable on the Linux distro you’re using, you might use the following command:
$ sudo apt-get install clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev
Create a new project
You can use the following steps to create a new project with desktop support.
Set up
At the command line, perform the following commands to make sure that you have the latest desktop support and that it’s enabled. If you see “flutter: command not found”, then make sure that you have installed the Flutter SDK and that it’s in your path.
$ flutter channel dev
$ flutter upgrade
$ flutter config --enable-<platform>-desktop
Where <platform> is windows
, macos
, or linux
:
$ flutter config --enable-windows-desktop
$ flutter config --enable-macos-desktop
$ flutter config --enable-linux-desktop
To ensure that desktop is installed, list the devices available. You should see something like the following (you’ll see Windows, macOS, or Linux, depending on which platforms you’ve enabled):
$ flutter devices
1 connected device:
Windows (desktop) • windows • windows-x64 • Microsoft Windows [Version 10.0.18362.1082]
macOS (desktop) • macos • darwin-x64 • macOS 11.2 20D64 darwin-x64
Linux (desktop) • linux • linux-x64 • Linux
You might also run flutter doctor
to see if there are any unresolved issues. It should look something like the following on Windows:
PS > flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel dev, 1.27.0-1.0.pre, on Microsoft Windows [Version 10.0.19042.782], locale en-AU)
[√] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[√] Chrome - develop for the web
[√] Visual Studio - develop for Windows (Visual Studio Community 2019 16.7.7)
[√] Android Studio (version 4.1.0)
[√] VS Code (version 1.51.1)
[√] Connected device (3 available)
On macOS, you might see something like the following:
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel dev, 1.27.0-1.0.pre, on macOS 11.2.1 20D74 darwin-x64, locale en)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[✓] Xcode - develop for iOS and macOS
[✓] Chrome - develop for the web
[✓] Android Studio (version 4.1)
[✓] VS Code (version 1.53.2)
[✓] Connected device (3 available)
On Linux, you might see something like the following:
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel dev, 1.27.0-1.0.pre, on Linux, locale en_AU.UTF-8)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[✓] Chrome - develop for the web
[✓] Linux toolchain - develop for Linux desktop
[✓] Android Studio
[✓] Connected device (2 available)
If flutter doctor
finds problems for a platform you don’t want to develop for, you can ignore those warnings. You don’t have to install Android Studio and the Android SDK, for example, if you’re writing a Linux desktop app.
After enabling desktop support, restart your IDE. You should now see windows (desktop), macOS (desktop), or linux (desktop) in the device pulldown.
Create and run
Creating a new project with desktop support is no different than creating a new Flutter project for other platforms.
Once you’ve configured your environment for desktop support, you can create and run a desktop app either in the IDE or from the command line.
IDE
After you’ve configured your environment to support desktop, make sure you restart the IDE if it was already running.
Create a new app in your IDE and it automatically creates iOS, Android, and desktop versions of your app. (And web, too, if you’ve enabled web support.) From the device pulldown, select windows (desktop), macOS (desktop), or linux (desktop) and run your app to see it launch on the desktop.
Command line
To create a new app that includes desktop support (in addition to mobile support), run the following commands, substituting myapp
with the name of your project:
$ flutter create myapp
$ cd myapp
To launch your app from the command line, enter one of the following commands from the top of the package:
$ flutter run -d windows
$ flutter run -d macos
$ flutter run -d linux
Build a release app
To generate a release build run one of the following commands:
$ flutter build windows
$ flutter build macos
$ flutter build linux
Distribution
In general, we don’t recommend releasing a desktop app until desktop support is stable. There are not yet full instructions, or tooling support, for making distributable applications. However, here is some information about how to use the current build output on other machines for testing purposes.
Windows
For building Windows executables, you can either use tooling to construct an MSIX installer, or you can build your own zip file that collects the components together.
MSIX Packaging
MSIX is Microsoft’s Windows app package format that provides a modern packaging experience to all Windows apps. This format can either be used to ship applications to Microsoft’s Windows Apps store, or distribute application installers directly.
The easiest way to create an MSIX distribution for a Flutter project is to use the msix
pub package. For an example of using the msix
package from a Flutter desktop app, see the Desktop Photo Search sample.
Building your own zip file for Windows
The executable can be found in your project under build\windows\runner\<build mode>\
. In addition to that executable, you need the following:
- From the same directory:
- all the
.dll
files - the
data
directory
- all the
- The Visual C++ redistributables. You can use any of the methods shown in the deployment example walkthroughs on the Microsoft site. If you use the
application-local
option, you need to copy:msvcp140.dll
vcruntime140.dll
vcruntime140_1.dll
Place the DLL files in a directory next to the executable and the other DLLs, and bundle them together in a zip file.
macOS
To distribute your macOS application, you can either distribute your app via the macOS App Store, or alternatively you can distribute the .app
itself, for example on your own website.
However, as of macOS 14.5 you need to notarize your macOS application before distributing it outside of the macOS App Store.
The first step in both of the above processes involves working with your app inside of Xcode. To be able to compile your app from inside of Xcode you first need to build the app for release using the flutter build
command, then open the Flutter macOS Runner application.
$ flutter build macos
$ open macos/Runner.xcworkspace
Once inside of Xcode, follow either Apple’s documentation on notarizing macOS Applications, or on distributing an application via the App Store. You should also read through the macOS-specific support section below to understand how entitlements, the App Sandbox, and the Hardened Runtime impact your distributable application.
Linux
For information on publishing a Linux app to the Snap Store, see Build and release a Linux desktop app.
As the tooling solidifies, stay tuned for updates on other ways to distribute a Linux desktop app.
Add desktop support to an existing Flutter app
To add desktop support to an existing Flutter project, run the following command in a terminal from the root project directory:
$ flutter create --platforms=windows,macos,linux .
This adds the necessary desktop files and directories to your existing Flutter project. To add only specific desktop platforms, change the platforms
list to include only the platform(s) you want to add.
macOS-specific support
The following information applies only to macOS development.
Entitlements and the App Sandbox
macOS builds are configured by default to be signed, and sandboxed with App Sandbox. This means that if you want to confer specific capabilities or services on your macOS app, such as the following:
- Accessing the internet
- Capturing movies and images from the built-in camera
- Accessing files
Then you must set up specific entitlements in Xcode. The following section tells you how to do this.
Setting up entitlements
Managing sandbox settings is done in the macos/Runner/*.entitlements
files. When editing these files, you shouldn’t remove the original Runner-DebugProfile.entitlements
exceptions (that support incoming network connections and JIT), as they’re necessary for the debug
and profile
modes to function correctly.
If you’re used to managing entitlement files through the Xcode capabilities UI, be aware that the capabilities editor updates only one of the two files or, in some cases, it creates a whole new entitlements file and switches the project to use it for all configurations. Either scenario causes issues. We recommend that you edit the files directly. Unless you have a very specific reason, you should always make identical changes to both files.
If you keep the App Sandbox enabled (which is required if you plan to distribute your app in the App Store), you need to manage entitlements for your application when you add certain plugins or other native functionality. For instance, using the file_chooser
plugin requires adding either the com.apple.security.files.user-selected.read-only
or com.apple.security.files.user-selected.read-write
entitlement. Another common entitlement is com.apple.security.network.client
, which you must add if you make any network requests.
Without the com.apple.security.network.client
entitlement, for example, network requests will fail with a message such as:
flutter: SocketException: Connection failed
(OS Error: Operation not permitted, errno = 1),
address = example.com, port = 443
For more information on these topics, see App Sandbox and Entitlements on the Apple Developer site.
Hardened runtime
If you choose to distribute your application outside of the App Store, you need to notarize your application for compatibility with macOS 10.15+. This requires enabling the Hardened Runtime option. Once you have enabled it, you need a valid signing certificate in order to build.
By default, the entitlements file allows JIT for debug builds but, as with App Sandbox, you may need to manage other entitlements. If you have both App Sandbox and Hardened Runtime enabled, you may need to add multiple entitlements for the same resource. For instance, microphone access would require both com.apple.security.device.audio-input
(for Hardened Runtime) and com.apple.security.device.microphone
(for App Sandbox).
For more information on this topic, see Hardened Runtime on the Apple Developer site.
Plugin support
Flutter on the desktop supports using and creating plugins.
Using a plugin
To use a plugin that supports desktop, follow the steps for plugins in using packages. Flutter automatically adds the necessary native code to your project, as with iOS or Android.
We recommend the following plugins, which have been updated to work for desktop apps:
Use the following links to find all packages on pub.dev that support desktop apps. These links lists all packages, not just plugin packages. (Remember that plugin packages, or plugins, provide an interface to platform-specific services.)
Writing a plugin
When you start building your own plugins, you’ll want to keep federation in mind. Federation is the ability to define several different packages, each targeted at a different set of platforms, brought together into a single plugin for ease of use by developers. For example, the Windows implementation of the url_launcher
is really url_launcher_windows
, but a Flutter developer can simply add the url_launcher
package to their pubspec.yaml
as a dependency and the build process pulls in the correct implementation based on the target platform. Federation is handy because different teams with different expertise can build plugin implementations for different platforms. You can add a new platform implementation to any endorsed federated plugin on pub.dev, so long as you coordinate this effort with the original plugin author.
For more information, including information about endorsed plugins, see the following resources:
- Developing packages and plugins, particularly the Federated plugins section.
- How to write a Flutter web plugin, part 2, covers the structure of federated plugins and contains information applicable to desktop plugins.
- Modern Flutter Plugin Development covers recent enhancements to Flutter’s plugin support.
- Federated Plugin proposal
Samples and codelabs
- Write a Flutter desktop application
- A codelab that walks you through building a desktop app that integrates the GitHub GraphQL API with your Flutter app.
You can run the following samples as desktop apps, as well as download and inspect the source code to learn more about Flutter desktop support.
- Flutter Gallery running web app, repo
- A samples project hosted on GitHub to help developers evaluate and use Flutter. The Gallery consists of a collection of Material design widgets, behaviors, and vignettes implemented with Flutter. You can clone the project and run Gallery as a desktop app by following the instructions provided in the README.
- Photo Search app
- A sample app built as a desktop application that uses the following desktop-supported plugins:
Comments
Post a Comment