Что такое flutter windows

Flutter provides support for compiling 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.

Create a new project

#

You can use the following steps to create a new project with desktop support.

Set up desktop devtools

#

Consult the guide for your target desktop environment:

  • Install Linux desktop devtools
  • Install macOS desktop devtools
  • Install Windows desktop devtools

If flutter doctor finds problems or missing components for a platform that you don’t want to develop for, you can ignore those warnings. Or you can disable the platform altogether using the flutter config command, for example:

flutter config --no-enable-ios

Other available flags:

  • --no-enable-windows-desktop
  • --no-enable-linux-desktop
  • --no-enable-macos-desktop
  • --no-enable-web
  • --no-enable-android
  • --no-enable-ios

After enabling desktop support, restart your IDE so that it can detect the new device.

Create and run

#

Creating a new project with desktop support is no different from creating a new Flutter project for other platforms.

Once you’ve configured your environment for desktop support, you can create and run a desktop application either in the IDE or from the command line.

Using an IDE

#

After you’ve configured your environment to support desktop, make sure you restart the IDE if it was already running.

Create a new application in your IDE and it automatically creates iOS, Android, web, and desktop versions of your app. From the device pulldown, select windows (desktop), macOS (desktop), or linux (desktop) and run your application to see it launch on the desktop.

From the command line

#

To create a new application that includes desktop support (in addition to mobile and web support), run the following commands, substituting my_app with the name of your project:

flutter create my_app
cd my_app

To launch your application from the command line, enter one of the following commands from the top of the package:

C:\> 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:

PS C:\> flutter build windows
flutter build macos
flutter build linux

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.

Plugin support

#

Flutter on the desktop supports using and creating plugins. 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 any other platform.

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.

Samples and codelabs

#

Write a Flutter desktop application
A codelab that walks you through building a desktop application 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.

Wonderous app running app, repo
A showcase app that uses Flutter to create a highly expressive user interface. Wonderous focuses on delivering an accessible and high-quality user experience while including engaging interactions and novel animations. To run Wonderous as a desktop app, clone the project and follow the instructions provided in the README.
Flokk announcement blogpost, repo
A Google contacts manager that integrates with GitHub and Twitter. It syncs with your Google account, imports your contacts, and allows you to manage them.
Photo Search app
A sample application built as a desktop application that uses desktop-supported plugins.

Was this page’s content helpful?

Thank you for your feedback! Please let us know what we can do to improve.

Provide details

Unless stated otherwise, the documentation on this site reflects the latest stable version of Flutter. Page last updated on 2025-03-10. View source or report an issue.

Что такое Flutter. Установка

Последнее обновление: 23.02.2024

Flutter представляет фреймворк от компании Google, который позволяет создавать кроссплатформенные приложения, которые могут использовать однин и тот же код. Спектр платформ широк — это веб-приложения,
мобильные приложения под Android и iOS, графические приложения под настольные операционные системы Windows, MacOS, Linux, а также веб-приложения.

Особенностью работы с Flutter является то, что приложения под разные платформы могут иметь один и тот же код. Поскольку используемые платформы не эквиваленты, то какие-то отдельные части кода необходимо настраивать под определенную ОС, например, под iOS, но тем не менее
большая часть кода может совпадать. Это позволяет разработчикам существенно сэкономить время и ресурсы на создание приложений под все поддерживаемые платформы.

В качестве языка разработки используется язык программирования Dart.

При постороении приложения Flutter транслирует код на Dart в нативный код приложения с помощью Dart AOT (компиляция приложения перед его запуском), которое можно запускать на Android или iOS или
другой платформе. Однако при разработке приложения для ее ускорения Flutter использует JIT (компиляция приложения в процессе его запуска).

Надо отметить, что Flutter относительно новый фреймворк. Хотя прототип фреймворка появился еще в 2015 году, а первая альфа-версия вышла в мае 2017
года, но первый стабильный релиз — Flutter 1.0 увидел свет только в декабре 2018 года. Тем не менее регулярно с небольшой периодичностью ыходят подверсии,
добавляя новую функциональноть и исправляя имеющиеся баги. На момент публикации данной статьи последней стабильной версией является
Flutter 3, которая вышла в мае 2022 года, но постоянно выходят новые подверсии, которые также привносят нововведения во фреймворк (например, на момент
написания данной статьи последней подверсией является 3.19, которая вышла в феврале 2024 г.).

Что используется для разрабоки под Flutter? Прежде всего надо иметь базовые знания языка Dart. Для этого можно прочитать руководство на этом сайте https://metanit.com по адресу
Руководство по языку Dart

Для для написания кода программы можно использовать любой полюбившийся текстовый редактор и затем
с помощью утилит командной строки из Flutter SDK компилировать приложение. Однако для таких сред как Android Studio и IntelliJ IDEA, а также текстового редактора Visual Studio Code компания Google выпустила специальные
плагины, которые позволяют упростить разработку. Поэтому зачастую для разработки под Flutter используются именно Android Studio и IntelliJ IDEA.

Перед непосредственной установкой следует отметить, что Flutter зависит от множества компонентов. Так, если мы собираемся создавать приложения под Android (а это наиболее популярный сценарицй применения Flutter), то нам надо
установить Android SDK. Самый легкий способ установить Android SDK — сразу установить Android Studio, вместе с которой будут установлены все необходимые инструменты.
Процесс установки Android Studio описан в статье Установка Android Studio

Установка Flutter SDK

Чтобы начать разрабатывать приложения с помощью Flutter, необходимо установить SDK. На странице https://flutter.dev/docs/get-started/install/ можно найти ссылки на на загрузку SDK для разных операционных систем. Рассмотрим,
как установить Flutter SDK на Windows, MacOS и Linux.

Установка Flutter на Windows

Для работы Flutter SDK
в Windows в системе должен быть установлен Git for Windows, который можно найти по адресу https://git-scm.com/download/win.

Также на Windows следует установить пакет Microsoft C++ Build Tools. В программе установки надо выбрать пункт
«Разработка классических приложений на C++» (Desktop development with C++). Подробнее про установку можно посмотреть в статье
Установка Microsoft C++ Build Tools

Непосредственно для установки Flutter SDK перейдем на страницу https://docs.flutter.dev/get-started/install/windows/desktop?tab=download.
На этой странице найдем в секции Get the Flutter SDK ссылку на zip-архив с Flutter SDK и загрузим его:

Установка Flutter SDK на Windows

Далее распакуем архив, например, на диске С. Например, в моем случае архив распакован в папку C:\flutter.

В распакованном архиве в папке flutter\bin мы найдем инструменты для компиляции приложения. Например,
в моем случае полный путь к этой папке C:\flutter\bin:

Установка Flutter SDK на Windows

Если мы работаем в Windows, то для добавления переменной среды через поиск найдем найдем параметр «Изменение переменных среды текущего пользователя». Для этого введем в поле поиска «Изменение переменных»:

Добавление пути к Flutter SDK в Path на Windows

Выберем пункт «Изменение переменных среды текущего пользователя». Затем нам откроется окно, где мы можем увидеть все переменные среды. (Также можно перейти через Параметры и пункт Система ->Дополнительные параметры системы ->Переменные среды)

Здесь нам надо изменить переменную Path, добавив путь к папке bin в Flutter SDK. Для этого выберем пункт Path и нажмем на
кнопку «Изменить»:

Добавление пути к Flutter SDK в Path на Windows

Далее нажмем на кнопку «Создать» и появившееся поле ввода введем путь к папке bin из Flutter SDK:

Настройка Flutter SDK в Windows

Установка Flutter на MacOS

Для установки и обновления Flutter использует git, поэтому необходимо установить git.
Однако если установлен Xcode, то git устанавливать не надо, так как Xcode уже включает git. В качестве альтернытивного способа можно установить Git через пакетный менеджер Homebrew, выполнив команду:

brew install git

Для установки Flutter SDK перейдем на страницу https://docs.flutter.dev/get-started/install/macos/desktop?tab=download.
Здесь нам доступно два варианта исполнения Flutter SDK — для MacOS на архитектуре Intel x86-64 и для MacOS на ARM. Загрузим вариант, который соответствует нашей операционной
системе:

Установка Flutter SDK на MacOS

Далее распакуем архив и поместим распакованную папку с Flutter SDK где-нибудь на жестком диске. Например, поместим Flutter SDK в корневой папке текущего пользователя (папка $HOME).

Для использования Flutter SDK в терминале, необходимо добавить путь к папке bin в SDK в системные переменные. Добавление для текущего окна терминала:

Для этого откроем или создадим (при отстуствии) в корневой папке текущего пользователя файл .zshenv. Добавим в этот файл строку

export PATH=$HOME/flutter/bin:$PATH

Сохраним и закроем файл

Установка Flutter на Linux

Предварительным условием использования Flutter на Linux также является наличие в сиситеме Git. Поэтому прежде всего установим сам Git:

sudo apt install git

Для установки Flutter на Linux можно использовать два способа. Первый и самый простой способ — установка через менеджер snap с помощью следующей команды:

sudo snap install flutter --classic

Второй способ представляет ручную установку. В этом случае загружаем сам архив с файлами Flutter SDK со страницы
https://docs.flutter.dev/get-started/install/linux и
найдем на странице ссылку на Flutter SDK и загрузим его:

Установка Flutter SDK на Linux

Так, в моем случае это архивный пакет «flutter_linux_3.19.0-stable.tar.xz». Далее распакуем этот архив где-нибудь на жестком диске папку.
Например, в моем случае я распакую Flutter SDK в корневую папку текущего пользователя:

mkdir $HOME/flutter

Перейдем в консоли в эту папку и распакуем в нее загруженный архив

cd ~/
tar xf ~/Downloads/flutter_linux_3.19.0-stable.tar.xz

После распаковки компилятор языка Dart и утилита flutter окажутся в папке «/flutter/bin». И чтобы их использовать, внесем путь к этой папке
в переменные среды. Для этого добавим в конец файла $HOME/.profile или /etc/profile следующую строку

export PATH="$PATH:`pwd`/flutter/bin"

И для немедленного применения ее выполним команду

source $HOME/.profile

Для корректной работы Flutter на Linux также необходимо установить ря пакетов:

sudo apt install clang
sudo apt install cmake
sudo apt install ninja-build
sudo apt install libgtk-3-dev

Также необходимо установить пакет Android SDK Command Line Tools. Этот можно сделать, загрузив пакет с официального сайта с адреса
https://developer.android.com/studio#command-line-tools-only, либо через Android SDK Manager, который можно открыть в Android Studio:

Android SDK Command Line Tools for Flutter

Проверка установки

Чтобы проверить версию Flutter, откроем командную строку и введем команду flutter —version, которая выводит версию фреймворка:

C:\Users\eugen>flutter --version
Flutter 3.19.0 • channel stable • https://github.com/flutter/flutter.git
Framework • revision bae5e49bc2 (5 дней назад) • 2024-02-13 17:46:18 -0800
Engine • revision 04817c99c9
Tools • Dart 3.3.0 • DevTools 2.31.1

C:\Users\eugen>

Однако корректность установки Flutter еще не означает, что все будет работать, потому что Flutter зависит от множества компонентов. И чтобы проверить, что все установлено и настроено
правильно, надо ввести команду

flutter doctor

При корректной установке и настройке всех сопутствующих компонентов консоль отобразит ряд пунктов с зеленой галочкой для каждого пункта.

Настройка Flutter SDK в Windows

Если будут какие-то проблемы, то в сводке команды будет указано, каких компонентов не хватает или что еще надо сделать, чтобы установка Flutter была корректной.
Для разных систем этот набор может немного отличаться.

Обновление Flutter

Если впоследствии необходимо будет обновить Flutter, то для этого достаточно будет выполнить в командной строке команду

flutter upgrade

Поскольку Flutter активно развивается, то лучше обновляться регулярно.

Время на прочтение11 мин

Количество просмотров27K

Язык программирования Dart был изначально разработан как перспективная замена JavaScript в веб-приложениях (с поддержкой асинхронности, потоков, классической поддержки ООП и возможностью использования строгой типизации), но, к сожалению, в этом качестве он так и не достиг значительных успехов. Однако в дальнейшем компилятор Dart был доработан для других целевых платформ и наибольшего успеха достиг в сочетании с фреймворком Flutter как инструмент разработки высокопроизводительных мобильных приложений, создаваемых на основе реактивной модели. Но нужно отметить, что наряду с возможностями компиляции в целевые платформы Android и iOS (а также, разумеется, Web), Dart также может использоваться для создания приложений для операционных систем Windows, Linux и MacOS, что в сочетании с возможностями фреймворка Flutter и оптимизированных платформенных реализаций Flutter Engine и Embedder, представило новый путь к созданию нативных приложений с графическим интерфейсом. В этой статье мы рассмотрим возможности и особенности реализации desktop-приложений на Flutter и разберемся с механизмами интеграции внешних библиотек.

Проект на языке Dart представляет из себя один или несколько исходных файлов с расширением .dart (с явным указанием импорта используемых компонентов), файл описания проекта pubspec.yaml (описывает метаданные для компилятора, а также зависимости и используемые ресурсы), а также платформенные компоненты, которые могут быть интегрированы в финальный исполняемый артефакт на этапе сборки проекта. Во время сборки и компиляции исходные тексты проекта и подключенных компонентов, а также платформенные компоненты (при использовании плагинов) объединяются в единый исполняемый образ, который может выполняться как внутри специальной среды выполнения, так и являться полностью автономным исполняемым файлом. Любое приложение, даже если ничего не импортировано явно, интегрирует пакет dart:core, который содержит методы для работы со строками, коллекциями объектов, датой-временем, регулярными выражениями и сетевыми адресами, потоками и асинхронностью, что позволяет использовать базовую функциональность одинаковым образом, независимо от целевой платформы.

Компиляция проекта может происходить в одном из нескольких режимов и выполняется командой dart compile <subcommand>:

  • js – компиляция исходных кодов в код на JavaScript для запуска в браузере (например, используется в Flutter for Web или при разработке сайтов с использованием React или AngularDart, либо без использования фреймворка). При компиляции выполняется tree-shaking, в результате которого из кода удаляются все неиспользуемые функции и их зависимости.

  • jit-snapshot – создание промежуточного кода для выполнения на конкретной архитектуре (в дальнейшем может быть запущен через команду dart <name>.jit), выполняет тестовый прогон для сохранения состояния памяти и результата just-in-time компиляции для возможности быстрого повторного выполнения.

  • aot-snapshot – создание двоичного кода для текущей архитектуры, не включает в себя реализацию среды выполнения. Для запуска снимка можно использовать команду dartaotruntime <name>aot.

  • kernel – создание переносимого представления исходного кода (может быть запущено на любой поддерживаемой платформе), может быть в дальнейшем запущено через команду dart <name>.dill

  • exe – компиляция в выполняемый файл (включает в себя двоичный код, реализующий логику приложения, а также среду выполнения и связанные библиотеки, необходимые для работы приложения).

Для примера мы создадим простое приложение для вывода информации о зарегистрированных расходах и последовательно будем его дорабатывать и превратим в конечном итоге в полноценное приложение с графическим интерфейсом на Flutter. В качестве целевой платформы мы будем рассматривать Linux, но похожим образом может быть создано приложение и для Windows / MacOS (отличия будут только в способах подключения библиотек и алгоритме сборки финальных распространяемых артефактов). Начнем с простого консольного приложения, которое будет получать информацию о расходах из текстового файла.

import 'dart:io';
import 'dart:convert';

Stream<double> expenses() {
  return File("expenses.csv").openRead().map(utf8.decode).transform(LineSplitter()).map((l) => double.tryParse(l));
}

void main() {
  print("Expenses for period:");
  expenses().listen((a) {
    print("*$a");
  });
}

Создадим файл с величинами расходов (expenses.csv). Затем выполним компиляцию в исполняемый файл и проверим корректность работы скомпилированного приложения:

dart compile exe expenses.dart
./expenses.exe
*100.1
*10.99
*100.5

Заменим извлечение строк из файла на получение информации через сеть, для этого будем использовать возможности пакета http (поддерживается как на мобильных платформах, так и для Web и desktop-приложений).

import 'dart:io';
import 'dart:convert';
import 'package:http/http.dart' as http;

Stream<double> expenses() async* {
  final client = http.Client();
  final expenses = await client.get(Uri.parse('https://raw.githubusercontent.com/dzolotov/flutter-linux/main/expenses.csv'));
  for (final v in LineSplitter().convert(expenses.body).map((l) => double.tryParse(l))) {
    yield v;
  };
}

void main() async {
  print("Expenses for month:");
  (await expenses()).listen((a) {
    print("*$a");
  });
}

Мы должны увидеть в консоли список строк со значениями расходов, извлеченных из указанного сетевого расположения.

Следующим этапом добавим поддержку графического интерфейса в нативном приложении. На этапе мы попробуем реализовать поддержку графического интерфейса без использования Flutter, это возможно через связывание разрабатываемого приложения с библиотеками GTK. Dart представляет возможность обращаться к внешним загружаемым библиотекам (so/dll) через поддержку Foreign Function Interface (пакет dart:ffi). FFI представляет набор классов для описания типов данных C и указателей, а также способы определения внешних функций (NativeFunction), управления памятью (Allocator) и предоставляет механизмы для вызова функций Dart из внешней библиотеки на C (NativeApi). Также возможно загружать динамическую библиотеку (.so / .dll) и использовать экспортированные символы через конструкторы класса DynamicLibrary.

Для подключения библиотеки GTK мы будем использовать экспериментальные биндинги из проекта https://github.com/Kleak/gtk

apt-get install llvm-dev libclang1 libclang-cpp-dev clang-dev libclang1-dev 
dart pub get
dart pub run ffigen:setup -I/usr/lib/llvm-13/include -L/usr/lib/llvm-13/lib
dart compile exe example/counter.dart

после успешной сборки можно запустить example/counter.exe и получить gtk-вариант приложения со счетчиком.

Hidden text

Если возникает ошибка при запуске, нужно создать символическую ссылку на gtk (sudo ln -s /usr/lib/x86_64-linux-gnu/libgtk-3.so.0 /usr/lib/x86_64-linux-gnu/libgtk-3.so), либо изменить путь к динамической библиотеки в gtk/lib/src/init.dart.

По аналогии можно было бы создать и наше приложения учета финансов, но в действительности задача не выглядит очень простой. Как минимум нужно будет реализовать подключения к функциям динамической библиотеки, поскольку в существующих биндингах их набор ограничен. Так, например, для создания контейнера необходимо создать определения типов и использовать механизмы для обнаружения экспорта динамической библиотеки, например так:

typedef gtk_container_new_func = Pointer<NativeGtkContainer> Function();
typedef GtkContainerNew = Pointer<NativeGtkContainer> Function();
Pointer<NativeGtkContainer> gtkContainerNew() {
  final f = gtk.lookupFunction<gtk_container_new_func, GtkContainerNew>('gtk_container_new');
  return f();
}

Для создания графических приложений более удобным способом будет применение фреймворка Flutter, который использует Dart как основную технологию разработки и предоставляет удобные механизмы связывания с графическими библиотеками для нативных платформ (на Linux используется GTK). При этом фреймворк реализует функциональность визуальной компоновки и отслеживания изменений дерева виджетов и позволяет создавать приложения в реактивном стиле с возможностью декларативного связывания конфигурации интерфейса и состояния (которое может быть связано с виджетами, либо храниться отдельно и распространяться с использованием подписки на изменения).

Поскольку на текущий момент поддержка Linux и MacOS находится в стадии эксперимента, ее необходимо явным образом разрешать. Для настройки дополнительных целевых платформ будем использовать команду flutter config --enable-linux-desktop (или flutter config --enable-macos-desktop). Для корректной сборки также необходимо установить зависимости для компиляции:

sudo apt-get install clang cmake ninja-build pkg-config libgtk-3-dev

Теперь создадим новый проект приложения flutter create –t app expenses

Перейдем в каталог проекта и убедимся, что среди каталогов есть linux (или macos, в зависимости от выбранной целевой платформы). Точкой входа в приложение на Flutter, как и для любого приложения на Dart, является функция main, по умолчанию расположенная в файле lib/main.dart.

Запуск приложения начинается с вызова функции runApp (экспортирован из пакета material/widgets.dart, либо платформенных material.dart / cupertino.dart), которому передается экземпляр корневого виджета. В большинстве случаях для корневого используются виджеты MaterialApp (или CupertionApp для iOS), которые создают необходимый контекст приложения, регистрируют навигацию и тему оформления, а также отвечают за корректную локализацию и иные аспекты взаимодействия с платформой.

Запустим наше приложение: flutter run –d linux.Результатом выполнения будет демонстрационное приложение в стиле Material Design с кнопкой и счетчиком нажатий (запущенное в виде отдельного окна). Как можно увидеть, заголовок окна повторяет название приложения, что не всегда совпадает с ожиданиями. Кроме того нет возможности изменить размеры окна при запуске. Давайте исправим это и добавим в наше приложение плагин window_manager, для этого необходимо в секцию dependencies в pubspec.yaml вписать название плагина и его версию (window_manager: ^0.2.1) и установить необходимые зависимости (flutter pub get)

Теперь мы можем изменить заголовок и конфигурацию окна до его создания (до запуска runApp). Для этого необходимо убедиться, что необходимый контекст выполнения был инициализирован и окно отображено:

import 'package:window_manager/window_manager.dart';
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await windowManager.ensureInitialized();
  windowManager.waitUntilReadyToShow().then((_) async {
    // Hide window title bar
    await windowManager.setTitleBarStyle(TitleBarStyle.normal);
    await windowManager.setTitle("Expenses Tracker");
    await windowManager.setSize(Size(400, 400));
    await windowManager.center();
    await windowManager.show();
  });
  runApp(const MyApp());
}

Также можно подписаться на события жизненного цикла окна для отслеживания закрытия, уменьшения и увеличения размера, потери и возвращении фокуса, для этого к состоянию корневого виджета нужно добавить mixin WindowListener.

class _ExpensesState extends State<Expenses> with WindowListener {
...
}

Реализуем вывод полученных данных из сети в виде списка в окне и добавим кнопку для регистрации нового значения расхода. Для этого заменим тип результата и будем создавать ожидаемое значение (Future), вместо потока, чтобы можно было идентифицировать состояние ожидания (пока идет загрузка).

Future<Iterable<double>> expenses() async {
  final client = http.Client();
  final expenses = await client.get(Uri.parse('https://raw.githubusercontent.com/dzolotov/flutter-linux/main/expenses.csv'));
  return LineSplitter().convert(expenses.body).map((l) => (double.tryParse(l) ?? 0.0));
}

class _ExtensesState extends State<Expenses> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: FutureBuilder<Iterable<double>>(future: expenses(), builder: (context, snapshot) {
          if (snapshot.hasData) {
            return Column(
              mainAxisAlignment: MainAxisAlignment.center, 
              children: snapshot.requireData.map(
                (d) => Text(d.toString())).toList()
            	);
          } else if (snapshot.hasError) {
            return const Text('Error');
          } else {
            return const CircularProgressIndicator();
          }
        }),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {},
        tooltip: 'Add expenses',
        child: const Icon(Icons.add),
      ),
    );
  }
}

Разработка графических приложений для Desktop ничем принципиально не отличается от создания мобильных приложений на Flutter (нужно только убедиться, что используемые плагины поддерживают конкретную целевую платформу). Важно задать граничные значения для размера окна (через плагины window_manager или window_size), чтобы сохранять верстку, а также использовать возможности определения размеров контейнеров (например, через LayoutBuilder) для создания адаптивной верстки. Дополнительно можно отключить отображение всплывающих подсказок при наведении, для этого часть дерева может быть обернута в виджет TooltipVisibility со значением visible в false.

Важным аспектом разработки приложений, ориентированных на запуск в Windows/Linux/MacOS является регистрация комбинаций клавиш и их связывание с действиями. Одним из вариантов может быть виджет RawKeyboardListener (определяет события нажатия и отпускания клавиши) или более высокоуровневый FocusableActionDetector, который связывает между собой LogicalKeySet и Intent (в shortcuts), а также Intent и функцию (в actions).

Также для desktop-приложений возможно получать доступ к нативным API операционной системы через ffi (аналогично тому, как ранее мы рассматривали подключение к gtk), для большинства задач существуют готовые плагины (например, win32 для доступа к Win32 API, win32_registry для получения доступа к реестру Windows, win32_gamepad для подключения к геймпаду, posix для доступа к POSIX API на всех операционных системах и др.)

Частый сценарий в desktop-приложениях – необходимость отправить информацию (например, отчет о расходах) на печать или в PDF-документ. Здесь может быть полезной библиотека printing, которая работает на всех платформах и может создавать форматированные PDF-документы. Документация и примеры использования библиотеки могут быть найдены на официальной странице.

Последний вопрос, который мы разберем сегодня – сборка приложения в устанавливаемый артефакт. Алгоритм сборки зависит от выбранной платформы и пошагово описан в официальной документации, мы рассмотрим только сборку приложения в snap для установки на Linux с использованием snapd.

Для сборки snap будет необходимо установить инструментальную поддержку:

snap install snapcraft —classic
snap install multipass —classic

Опционально можно установить поддержку сборку с использованием контейнеризации на основе lxd:

snap install lxd
sudo lxd init
(оставим все ответы по умолчанию)

Создадим файл описания приложения snapcraft.yml

name: expenses
version: 0.0.1
summary: Expenses Tracker
description: Take control on your expenses!

confinement: strict
base: core18
grade: stable

slots:
  dbus-expenses: 
    interface: dbus
    bus: session
    name: tech.dzolotov.expenses
    
apps:
  expenses:
    command: expenses
    extensions: [flutter-master] # здесь можно поставить экспериментальную ветку
    plugs:
    - network
    slots:
      - dbus-expenses
parts:
  expenses:
    source: .
    plugin: flutter
    flutter-target: lib/main.dart	# файл, содержащий точку входа (функцию main)

Создадим файл с описанием ярлыка в файле /snap/gui/expenses.desktop

[Desktop Entry]
Name=Expenses
Comment=Take control on your expenses
Exec=expenses 
Icon=${SNAP}/meta/gui/expenses.png
Terminal=false
Type=Application
Categories=Education; 

И также нужно добавить пиктограмму (в том же расположении expenses.png)

Теперь можно выполнить сборку:

snapcraft (для использования виртуальной машины через multipass) или snapcraft —lxd (для использования контейнеризации lxd)

Разработанное приложение может быть загружено (для этого необходимо зарегистрироваться на snapcraft.io, затем войти в учетную запись snapcraft login, зарегистрировать приложение snapcraft register и загрузить snap-файл через snapcraft upload —release=track expenses.snap)

Локально установить приложение можно из созданного snap-файла:

sudo snap install expenses_0.0.1_amd64.snap --dangerous

После чего можно его запустить через /snap/bin/expenses (или через созданный ярлык, зарегистрированный в графической оболочке Linux).

Таким образом мы разработали простой прототип, который может быть доработан с использованием всех доступных возможностей Flutter Framework и библиотек, доступных на pub.dev, что предоставляет качественно новые возможности создания адаптивных пользовательских интерфейсов (с использованием реактивной модели), которое также может использовать существующие библиотеки и компоненты бизнес-логики.

Все исходные тексты приложения размещены в GitHub: ссылка на GitHub.


Как протестировать приложение с информацией из сети? Об этом расскажу уже завтра на бесплатном открытом уроке. В рамках урока мы разберемся как создать тесты для сетевых приложений на Flutter и проверим работу простого клиента для отображения мероприятий из публичного API на всех уровнях (модульные тесты, тесты виджетов, интеграционные тесты). Созданные тесты будут интегрированы в единый сценарий сборки в конвейере CI.

Регистрация на бесплатный урок.

Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку

  1. Заметки
  2. Flutter для Windows

Егор Долгов

За все время: 1041 просмотр, 652 посетителя.
За последние 30 дней: 14 просмотров, 13 посетителей.

Flutter для Windows

Для создания качественных приложений Windows, работающих также и на мобильных платформах и для WEB.

Перевод статьи Announcing Flutter for Windows

С самого запуска Flutter, одной из наших основных задач стало предоставление кросс-платформенного решения для красивых, адаптированных приложений, скомпилированных в машинный код и в полной мере использующих основное графическое оборудование вашего устройства. Сегодня мы значительно приблизились к этой цели с первым релизом поддержки операционной системы Windows в качестве платформы, что позволяет разработчикам для Windows быть продуктивными и использовать всю мощь Flutter, как и мобильные разработчики.

Flutter должен дать своим пользователям все необходимые инструменты для создания отличного приложения, вне зависимости от того, на какую операционную систему оно будет ориентированно. Поэтому мы хотим использовать одни и те же инструменты и базовый фреймворк во всех местах, где вы, возможно, захотите рисовать пиксели. Flutter дает возможность создавать красивое впечатление от использования, где ваш бренд и дизайн выходят на первый план. Он работает быстро — компилируется непосредственно в машинный код; с поддержкой горячей перезагрузки с отслеживанием состояния вы получаете производительность интерактивной среды, которая позволяет вносить изменения во время работы приложения и сразу же видеть результаты. И Flutter открыт, тысячи контрибьюторов расширяют основной фреймворк с помощью экосистемы пакетов.

Flutter использует уже примерно пол миллиона приложений.

До сих пор мы наблюдали динамику, которая превзошла все ожидания: сейчас выпущено почти полмиллиона приложений, использующих Flutter, включая крупные приложения от таких компаний, как Betterment, BMW и ByteDance, а также приложения от тридцати команд Google. По данным таких аналитиков, как Statista и SlashData, в 2021 году Flutter стал самым популярным кроссплатформенным набором инструментов пользовательского интерфейса:

Данные нашей команды это подтверждают: во всех ежеквартальных опросах за 2021 год 92% разработчиков Flutter получили положительное впечатление об инструментах Flutter. (Конечно же, мы прислушиваемся к отзывам и мнениям остальных 8%).

Одним из самых популярных запросов была поддержка Windows.

И сегодня мы рады объявить о полной доступности приложений Windows для Flutter в стабильных сборках.

Windows и Flutter

Несколько лет назад команда Flutter изложила амбициозную концепцию по расширению от мобильных приложений для iOS и Android до других платформ, включая WEB и десктоп.

Основа Flutter распространяется на разные платформы: от портативного графического движка Skia с аппаратным ускорением до системы рендеринга Flutter; основные примитивы, такие как анимация, тематика, ввод текста и интернационализация; и сотни виджетов, которые предлагает Flutter.

Однако, приложения на компьютере — это не просто мобильные приложеня, запущенные на большом экране. Они спроектированы для различных устройств ввода, к примеру, мышь и клавиатура; они обладают различными оконными режимами; у них существуют разные конвенции для критичных вещей, таких как специальные возможности, редакторы методов ввода и визуальные стили: а также они взаимодействуют в различными API в основной операционной системе — приложения для ПК поддерживают все, от средств выбора файловой системы до оборудования устройства и хранилищ данных, таких как реестр Windows.

Так что было бы недостаточным просто перенести Flutter на Windows, необходимо было адаптировать его.

Как и с поддержкой Android и iOS, имплементация Flutter для Windows сочетает в себе фреймворк Dart и движок C++. Windows и Flutter взаимодействуют через встраиваемый слой, на котором размещен механизм Flutter и который отвечает за перевод и отправку сообщений Windows. Flutter координируется с операционной системой, чтобы отобразить ваш пользовательский интерфейс на экране, обрабатывает такие события как изменение размера окна и изменения DPI и работает с существующими модальностями Windows для интернационализации, такими как редакторы методов ввода.

В Windows Flutter использует точно такой же код Dart, но использует нативные API-интерфейсы Windows.

Ваше приложение может использовать каждую часть фреймворка Flutter,а при работе с Windows оно также может общаться с API Win32, COM и Windows Runtime либо напрямую через уровень взаимодействия Dart С, либо при помощи платформенного плагина, написанного на C++. Мы также адаптировали для работы с Windows несколько популярных плагинов, в том числе camera, file_picker и shared_preferences. Что более важно, сообщество уже добавило поддержку Windows широкому спектру других пакетов, начиная с интеграции с панелью задач Windows и до доступа к последовательному порту.

Уже существуют сотни пакетов, адаптированных для поддержки приложений Flutter, созданных для Windows.

Для полностью адаптированного пользовательского интерфейса Windows вы также можете использовать такие пакеты, как fluent_ui и flutter_acrylic, чтобы создать приложение, которое соответствующе выражает систему дизайна Microsoft Fluent. А с помощью инструмента msix вы можете обернуть свое приложение установщиком, который можно загрузить в Microsoft Store в Windows.

В совокупности это помогает создать приложения, которые отлично выглядят в Windows, быстро работают и при этом имеют возможность переноса на другие настольные или мобильные устройства, а также в Интернет. Вот несколько ранних примеров:

Примеры приложений Windows, созданных при помощи Flutter, в том числе Harmonoid и Rows.

Microsoft and Flutter

Команда Windows не осталась в стороне и поделилась своим мнением о поддержке Flutter. Вот что говорит Кевин Галло, корпоративный вице-президент по центру разработки Windows в Microsoft:

«Мы рады видеть, что Flutter добавляет поддержку создания приложений для Windows. Windows — открытая платформа, и мы приветствуем всех разработчиков. Мы рады видеть, что разработчики Flutter привносят свой опыт в Windows, а также публикуют его в Microsoft Store. Поддержка Flutter для Windows — это большой шаг для сообщества, и нам не терпится увидеть, что вы принесете в Windows!»

Действительно, несколько команд из Microsoft внесли свой вклад в сегодняшнее объявление. В частности, мы хотели бы выразить благодарность команде дизайнеров Fluent за их вклад в создание иконок для приложений Flutter в Windows. Их пакет fluentui_system_icons был удостоен статуса Flutter Favorite, что свидетельствует о его качестве.

Мы также были впечатлены вкладом Microsoft в обеспечение специальных возможностей для Windows, и мы благодарны этой команде за помощь в обеспечении того, чтобы Flutter поддерживал программы чтения с экрана. Было бы ошибкой отвергать доступность как необходимое требование. Как показано на этой диаграмме из набора инструментов Microsoft для инклюзивного дизайна, у всех нас есть причины заботиться о предоставлении возможностей, которые адаптируются к различным постоянным, временным или ситуативным потребностям.

На видео ниже показано, как Flutter интегрирует с Windows Narrator. Мы намеренно сделали экран размытым, чтобы дать вам представление о том, насколько ценна эта функция для пользователей, которым она нужна.

Работа приложения для чтения с экрана Narrator с приложениями Flutter.

Экосистема инструментов для разработки приложений под Windows

Наши партнеры по инструментам также добавляют поддержку Windows. Вот несколько:

  • FlutterFlow, инструмент разработки приложений Flutter с low-code, объявил о поддержке Windows, а также о функциях, которые помогут разработчикам Flutter создавать приложения, адаптированные для использования на персональном компьютере.
  • Realm —быстрое локальное хранилище данных. Недавно выпущенная последняя версия теперь поддерживает создание приложений Windows с помощью Flutter с быстрым доступом к основной базе данных с помощью Dart FFI.
  • Nevercode обновил инструмент Codemagic CI/CD, и теперь вы можете создавать и тестировать приложения Windows в облаке, а развертывание вашего приложения в Microsoft Store стало автоматическим.
  • Syncfusion обновил свой набор виджетов, чтобы в полной мере использовать возможности Windows. Если вы подпишетесь на их набор инструментов, вы найдете компоненты визуализации данных, такие как древовидные карты и диаграммы, виджет с богатой сеткой данных, календари и даже поддержку создания PDF и таблиц Excel.
  • Наконец, Rive анонсировали грядущую версию своего популярного набора графических инструментов для Windows, позволяющую дизайнерам и разработчикам создавать интерактивные векторные анимации, которые могут реагировать на код в режиме реального времени с помощью стейт-машины. Предстоящая версия их приложения для Windows предлагает невероятно высокую производительность и меньший объем потребляемой памяти и скоро будет доступна для загрузки в Microsoft Store.

Нам очень приятно видеть сформировавшуюся экосистему, построенную вокруг Flutter, и мы рекомендуем вам ознакомиться с каждым из этих партнеров, когда вы начнете создавать приложения для Windows с помощью Flutter.

Поддержка Windows появилась во Flutter 2.10

Стабильная поддержка производственного качества для создания приложений Windows доступна как часть Flutter 2.10. Эта версия также включает множество других функций, улучшений производительности и исправлений ошибок, которые более подробно описаны в отдельном посте.

В ближайшем будущем мы планируем улучшить стабильную поддержку macOS и Linux, что сделает ваши приложения Flutter доступными для любых платформ: веб, мобильных и десктопных.

Благодарим за поддержку Flutter и с нетерпением ждем ваших приложений для Windows!

Подборка заметок

  • Flutter 2.2: что нового?
  • Анонс Flutter 1.22
  • Список ресурсов по Dart и Flutter
  • Flutter команды
  • Представляем Вам Flutter 1.17!

Contents
  • Beta Snapshot in stable channel
  • Requirements
    • Additional Windows requirements
    • Additional macOS requirements
    • Additional Linux requirements
  • Create a new project
    • Set up
    • Create and run
      • Using an IDE
      • From the command line
  • Windows UWP
  • Build a release app
  • Distribution
    • Windows
      • MSIX packaging
      • Building your own zip file for Windows
    • macOS
    • Linux
  • Add desktop support to an existing Flutter app
  • macOS-specific support
    • Entitlements and the App Sandbox
      • Setting up entitlements
    • Hardened Runtime
  • Plugin support
    • Using a plugin
    • Writing a plugin
  • Samples and codelabs

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.

Beta Snapshot in stable channel

To make it easier to try out desktop support for
Flutter, we are shipping a snapshot of Flutter’s
desktop beta on the stable channel.
This means that you can easily try desktop support
without needing to switch to the Flutter beta channel.
However, the snapshot included in the stable channel
won’t be updated until the next Flutter stable release.
If you want the latest version of desktop support,
you must switch to the Flutter beta channel.

Requirements

To create a Flutter application 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). For Win32 you need the
    “Desktop development with C++” workload installed,
    including all of its default components. For UWP
    you need the “Universal Windows Platform development”
    workload installed, with the optional UWP C++ tools.

Additional macOS requirements

For macOS desktop development,
you need the following in addition to the Flutter SDK:

  • Xcode
  • CocoaPods if you use plugins

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

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

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 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

For Windows UWP desktop support perform the following commands to switch to
the dev channel, upgrade Flutter, and enable UWP.

$ flutter channel dev
$ flutter upgrade
$ flutter config --enable-windows-uwp-desktop

To ensure that desktop is enabled,
list the devices available.
You should see something like the following
(you’ll see Windows, macOS, or Linux,
depending on which platform you are running on):

$ 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 C:\> flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, 2.0.6, on Microsoft Windows [Version 10.0.19042.804], 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.9.5)
[√] Android Studio (version 4.1.0)
[√] VS Code (version 1.56.2)
[√] Connected device (3 available)

! No issues found!

On macOS, you might see something like the following:

$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 2.0.6, on macOS 11.3.1 20E241 darwin-x64, locale en)
[✓] Android toolchain - develop for Android devices (Android SDK version 30.0.0)
[✓] Xcode - develop for iOS and macOS
[✓] Chrome - develop for the web
[✓] Android Studio (version 4.0)
[✓] VS Code (version 1.56.2)
[✓] Connected device (3 available)

• No issues found!

On Linux, you might see something like the following:

$ flutter doctor 
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel beta, 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 that
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 application
either in the IDE or from the command line.

Using an IDE

After you’ve configured your environment to support
desktop, make sure you restart the IDE if it was
already running.

Create a new application in your IDE and it automatically
creates iOS, Android, web, and desktop versions of your app.
From the device pulldown, select windows (desktop),
macOS (desktop), or linux (desktop)
and run your application to see it launch on the desktop.

From the command line

To create a new application that includes desktop support
(in addition to mobile and web support), run the following commands,
substituting myapp with the name of your project:

$ flutter create myapp
$ cd myapp

To launch your application from the command line,
enter one of the following commands from the top
of the package:

PS C:\> flutter run -d windows
$ flutter run -d macos
$ flutter run -d linux

Windows UWP

To get started with Windows UWP you need to be using Windows 10.
You need to install Visual Studio (not Visual Studio Code) with the
“Universal Windows Platform development” workload and the optional
Windows UWP C++ tools.

To configure Flutter for Windows UWP development,
perform the following commands to switch to
the dev channel, upgrade Flutter, and enable
Windows UWP desktop support.

PS C:\> flutter channel dev
PS C:\> flutter upgrade
PS C:\> flutter config --enable-windows-uwp-desktop

To create a new application, run the following commands:

PS C:\> flutter create myapp
PS C:\> cd myapp

Running Flutter with Windows UWP is complicated due to UWP’s
sandboxed runtime. You need to run an override for the sandbox
to enable the injection of Dart code into the running UWP
process to enable debugging and Hot Reload.

The suggested approach during development is to first run
flutter run -d winuwp from the command line, which will
give you a command that you need to run from a PowerShell
with Administrator privileges.

PS C:\myapp> flutter run -d winuwp
Launching lib\main.dart on Windows (UWP) in debug mode...
LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:ICF' specification [C:\src\flutter-projects\myapp\build\winuwp\runner_uwp\app.vcxproj]
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VisualStudio\v16.0\AppxPackage\Microsoft.AppXPackage.Targets(3327,5): warning : APPX4001: Build property AppxBundlePlatforms is not explicitly set and is calculated based on currently building architecture. Use 'Create App Package' wizard or edit project file to set it. [C:\src\flutter-projects\myapp\build\winuwp\runner_uwp\app.vcxproj]
Building Windows UWP application...
Enable Flutter debugging from localhost.

Windows UWP apps run in a sandboxed environment. To enable Flutter debugging
and hot reload, you will need to enable inbound connections to the app from the
Flutter tool running on your machine. To do so:
  1. Launch PowerShell as an Administrator
  2. Enter the following command:
     checknetisolation loopbackexempt -is -n=[APP_CONTAINER_NAME]

Press "Y" once this is complete, or "N" to abort.:

Run this checknetisolation command as shown in a PowerShell
as Administrator. You can then leave this process running for
the length of your development session, restarting your UWP app
as required.

PS C:\> checknetisolation loopbackexempt -is -n=[APP_CONTAINER_NAME]

Network Isolation Debug Session started.
Reproduce your scenario, then press Ctrl-C when done.

Once you have this process running, you can deploy to
Windows UWP from within your IDE as normal, or run from
the command line as follows:

PS C:\myapp> flutter run -d winuwp

Build a release app

To generate a release build,
run one of the following commands:

PS C:\> flutter build windows
$ flutter build macos
$ flutter build linux

Distribution

We don’t recommend releasing a desktop
application until desktop support is stable,

however, here is some information that you
might still find useful.

Windows

There are various approaches you can use for
distributing your Windows application.
Here are some options:

  • Use tooling to construct an MSIX installer
    (described in the next section)
    for your application and distribute it through
    the Microsoft Windows App Store.
    You don’t need to manually create a signing
    certificate for this option as it is
    handled for you.
  • Construct an MSIX installer and distribute
    it through your own website. For this
    option, you need to to give your application a
    digital signature in the form of a
    .pfx certificate.
  • Collect all of the necessary pieces
    and build your own zip file.

MSIX packaging

MSIX, Microsoft Windows’ application package format,
provides a modern packaging experience to all Windows apps.
This format can either be used to ship applications
to Microsoft Windows’ Apps store, or you can
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.

Create a self-signed .pfx certificate for local testing

For private deployment and testing with the help
of the MSIX installer, you need to give your application a
digital signature in the form of a .pfx certificate.

For deployment through the Windows Store,
generating a .pfx certificate is not required.
The Windows Store handles creation and management
of certificates for applications
distributed through its store.

Distributing your application by self hosting it on a
website requires a certificate signed by a
Certificate Authority known to Windows.

Use the following instructions to generate a
self-signed .pfx certificate.

  1. If you haven’t already, download the OpenSSL
    toolkit to generate your certificates.
  2. Go to where you installed OpenSSL, for example,
    C:\Program Files\OpenSSL-Win64\bin.
  3. Set an environment variable so that you can access
    OpenSSL from anywhere:
    "C:\Program Files\OpenSSL-Win64\bin"
  4. Generate a private key as follows:
    openssl genrsa -out mykeyname.key 2048
  5. Generate a certificate signing request (CSR)
    file using the private key:
    openssl req -new -key mykeyname.key -out mycsrname.csr
  6. Generate the signed certificate (CRT) file using
    the private key and CSR file:
    openssl x509 -in mycsrname.csr -out mycrtname.crt -req -signkey mykeyname.key -days 10000
  7. Generate the .pfx file using the private key and
    CRT file:
    openssl pkcs12 -export -out CERTIFICATE.pfx -inkey mykeyname.key -in mycrtname.crt
  8. Install the .pfx certificate first on the local machine
    in Certificate store as
    Trusted Root Certification Authorities
    before installing the app.

Building your own zip file for Windows

The Flutter executable, .exe, 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
  • The Visual C++ redistributables.
    You can use any of the methods shown in the
    deployment example walkthroughs on the Microsoft site
    to ensure that end users have the C++ redistributables.
    If you use the application-local option, you need to copy:

    • msvcp140.dll
    • vcruntime140.dll
    • vcruntime140_1.dll

    These 3 files can be found in C:\Windows\System32 if installed on your PC.
    Place the DLL files in the directory next to the executable
    and the other DLLs, and bundle them together in a zip file.
    The resulting structure will look something a little like this:

    Release
    │   flutter_windows.dll
    │   msvcp140.dll
    │   myapp.exe
    │   vcruntime140.dll
    │   vcruntime140_1.dll
    │
    └───data
    │   │   app.so
    │   │   icudtl.dat
    
    ...
    

At this point if desired it would be relatively simple to
add this folder to a Windows installer such as Inno Setup, WiX, etc.

macOS

To distribute your macOS application, you can either
distribute it through the macOS App Store,
or you can distribute the .app itself,
perhaps from your own website.
As of macOS 10.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 application inside of Xcode.
To be able to compile your application from inside of
Xcode you first need to build the application 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 through 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

The executable binary can be found in your project under
build/linux/<build mode>/bundle/. Alongside your
executable binary in the bundle directory there are
two directories:

  • lib contains the required .so library files
  • data contains the application’s data assets,
    such as fonts or images

In addition to these files, your application also
relies on various operating system libraries that
it’s been compiled against.
You can see the full list by running ldd
against your application. For example,
assuming you have a Flutter desktop application
called linux_desktop_test you could inspect
the system libraries it depends upon as follows:

$ flutter build linux --release
$ ldd build/linux/release/bundle/linux_desktop_test

To wrap up this application for distribution
you need to include everything in the bundle directory,
and make sure the Linux system you are installing
it upon has all of the system libraries required.
This may be as simple as:

$ sudo apt-get install libgtk-3-0 libblkid1 liblzma5

For information on publishing a Linux application
to the Snap Store, see
Build and release a Linux application to the Snap Store.

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 application 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:

  • url_launcher
  • shared_preferences
  • path_provider

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.)

  • Windows packages
  • macOS packages
  • Linux packages

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 application 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.
Flokk announcement blogpost, repo
A Google contacts manager that integrates with GitHub and Twitter.
It syncs with your Google account, imports your contacts,
and allows you to manage them.
Photo Search app
A sample application built as a desktop application that
uses the following desktop-supported plugins:

  • file_chooser
  • menubar
  • url_launcher

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • При загрузке windows 10 не загружается рабочий стол
  • Intel widi download windows 10
  • Windows 8 consumer preview key
  • Компьютер не видит сеть интернет через кабель windows 10
  • Программа для трансляции экрана компьютера на телевизор через wifi windows 10