mafulechkaJune 23, 2020, 6:09 a.m.

Flutter и настольные приложения

Content

Непрерывный прогресс в области компьютерных технологий

Ни для кого не секрет, что миссия разработчиков Flutter заключается в том, чтобы ориентироваться на широкий спектр устройств, включая iOS, Android, Windows, Linux, macOS и веб-сайты из единой кодовой базы, с нативной компиляцией и визуальным представлением на уровне качества игр. В Google Flutter используются проекты от Assistant до Stadia, от Cloud Search до Blogger. За пределами Google, Flutter был принят компаниями от ByteDance до Grab, от Nubank до MGM Resorts, которые извлекают выгоду из производительности и гибкости Flutter.

Многих из вас интересует прогресс в настольных операционных системах, включая Windows, macOS и Linux. В опросах и на GitHub, десктоп постоянно является одной из самых популярных новых функций. В ближайшие недели разработчики собираются показать больше своей работы, и начнут с обзора некоторых работ различных групп, которые вносят свой вклад в общий проект. Пока поддержка настольных систем является техническим предварительным обзором, работы впереди предстоит ещё много.

Режим выпуска (Release Mode)

Недавно разработчики проверили профиль и режим выпуска для Windows и Linux, в дополнение к существующей поддержке macOS. Например, если вы используете последние сборки Flutter, теперь вы можете скомпилировать приложение Flutter в исполняемый файл Windows с flutter build windows. Он использует производственный компилятор AOT для создания собственного машинного кода x64, который можно распространять на машину без установленного Flutter.

Десктоп

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

На уровне инфраструктуры разработчики внесли различные изменения во Flutter для поддержки взаимодействия с настольными компьютерами.

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

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

• Теперь вы можете запрашивать конкретную платформу (через класс Platform) и Windows, macOS и Linux предоставляют соответствующие результаты.

• В самом последнем выпуске разработчики добавили виджет NavigationRail, который специально разработан для настольных компьютеров и планшетов.

FFI

Команда Dart усердно работала над полировкой интерфейса внешних функций (FFI), который является отличным средством повышения скорости интеграции с платформой. Для API на основе библиотеки dart:ffi предоставляется прямой механизм привязки к нативному коду. Среда выполнения Dart предоставляет возможность выделить память в куче (heap), которая поддерживается объектом Dart, и выполнять вызовы динамически связанных библиотек.

Для простого примера из Windows, вот фрагмент кода для вызова традиционного API Win32 MessageBox()полностью с кодом Dart:

typedef MessageBoxNative = Int32 Function(
    IntPtr hWnd, Pointer<Utf16> lpText, Pointer<Utf16> lpCaption, Int32 uType);
typedef MessageBoxDart = int Function(
    int hWnd, Pointer<Utf16> lpText, Pointer<Utf16> lpCaption, int uType);

final user32 = DynamicLibrary.open('user32.dll');
final win32MessageBox =
    user32.lookupFunction<MessageBoxNative, MessageBoxDart>('MessageBoxW');

void showMessageBox(String message, String caption) => win32MessageBox(
    0,                      // No owner window
    Utf16.toUtf16(message), // Message
    Utf16.toUtf16(caption), // Window title
    0                       // OK button only
    );

…

showMessageBox('Test Message', 'Window Caption'); // call just like any other Dart function

Вызов Win32 MessageBox API из кода Dart.

В этом коде разработчики предоставляют typedef, который представляют сигнатуру метода как в его нативном, так и в Dart-представлении. Определив их, можно загрузить библиотеку динамической компоновки Windows (DLL), которая обеспечивает реализацию функции через метод lookupFunction(), который отображает сигнатуру функции Dart на базовую собственную точку входа. Наконец, необязательно добавляем простую идиоматическую оболочку, чтобы сделать ее легко доступной из другого кода Dart, что приводит к чему-то вроде этого:


Простой пример приложения для Windows, использующий Win32 MessageBox API

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

Обновление модели плагина

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

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

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

Также разработчики начали создавать некоторые из основных плагинов, используя эту модель, и вы найдете несколько ранних примеров интегрированной модели в репозитории flutter/plugins.

Обратите внимание, что API плагинов для Windows и Linux все еще находятся в движении, поэтому, хотя разработчики поощряют исследование, они не готовы к поддержке общего назначения в настоящее время. Также они работают над добавлением тегов платформы Desktop на pub.dev.

Работает на Windows: Win32 и UWP

Один интересный аспект работы, которую разработчики выполняют в Windows - это эксперименты с различными архитектурными подходами. На любой платформе Flutter встроен в небольшое приложение хост-контейнера (“embedder”), используя аналогичный подход к игровым движкам, таким как Unity. Этот встроенный в платформу механизм внедрения обеспечивает точку входа, координирует с базовой операционной системой доступ к таким службам, как поверхности рендеринга, доступность и ввод, и управляет циклом событий сообщения.

Windows предлагает два разных подхода для создания этого устройства для внедрения. Во-первых, зрелая модель программирования Win32 может использоваться для создания точки входа для содержимого Flutter - это обеспечивает максимальную обратную совместимость с платформами, такими как Windows 7 и создает стандартный EXE-файл, который ожидают многие разработчики. И наоборот, современная модель приложения UWP является рекомендуемым подходом для Windows 10 и предлагает интригующие возможности для расширения поддержки Flutter для таких устройств, как Xbox или будущая операционная система Windows 10X.

Разработчики неофициально работают с разными участниками, чтобы исследовать различные решения и с удовольствием поддерживают тесное сотрудничество с Microsoft для создания высококачественного решения. Они полагают, что семейство устройств Surface, включающее в себя Android и Windows, предлагает Microsoft замечательную платформу для создания прекрасных нативных приложений, охватывающих весь их портфолио.

Весело с рабочим столом

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

Если вы хотите попробовать это, вам нужно быть на канале разработки. Windows и Linux доступны только в ветке master, где происходит активная разработка Flutter. macOS доступен в ветке dev, которая немного более стабильна, но не рекомендуется для производственного использования. Вы можете переключать каналы с помощью flutter channel master или flutter channel dev, а затем использовать одну из следующих команд, чтобы включить поддержку используемой платформы:

C:\flutter> flutter config --enable-windows-desktop$ flutter config --enable-macos-desktop$ flutter config --enable-linux-desktop

Разработчики уже увидели, как некоторые авантюрные разработчики начинают использовать Flutter на рабочем столе для создания приложений. Одним из первых настольных приложений Flutter macOS, которое они увидели, является Sharezone. Студент-планировщик, ориентированный на образовательный рынок Германии, который начинал его как мобильное приложение, но недавно добавил веб-версии и версии для настольных компьютеров.

Sharezone Schulplan - приложение для студентов, преподавателей и родителей, чтобы отслеживать домашние задания, учебные группы и расписание.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
GI

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:60points,
  • Rating points-1
t

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:70points,
  • Rating points1
LD

C++ - Тест 003. Условия и циклы

  • Result:57points,
  • Rating points-2
Last comments
VR

QML - Lesson 016. SQLite database and the working with it in QML Qt

Помогите, пожалуйста. У меня похожая задача, но я в qml слой долен передать не чистый запрос, а со сложной обработкой, поэтому у меня в С++ слое есть иерархия классов, которая имитирует бд и зап…
e
  • eviza
  • Nov. 16, 2020, 4:32 a.m.

Qt/C++ - Tutorial 083. Creating a dynamic library and connecting it to another project

здравствуйте! при компиляции библиотеки выскакивает окно особая программа( не удалось найти программу, укажите путь к ней), и в папке debug создается файл .dll, а .lib нет. подскажите…
IB

Data encryption by RSA algorithm in Qt with public and private keys without binding to OpenSSL

Библиотека подключилась нормально, только на выводе из первого примера выходит пустое сообщение, вместо "test message" просто "". Никаких ошибок не выдает.
VS

Qt WinAPI - Lesson 002. How to make win installer for Qt apllication?

Можно ли как-то однозначно (не проверяя) выяснить, запустится ли программа в windows 7? И как быть с разрядностью уже и просто в w10 (32\64)?
DT

Django - Tutorial 036. How to add authentication through social networks. VKontakte

Возможно, автор прочитает. Делал авторизацию с помощью ВК по книге Дронова. Выдает ошибку "Backend not found". Стал гуглить, нашел вашу статью, вроде почти то же самое (оно и понятно, документа…
Now discuss on the forum
m

Отправка JSON

Спасибо!

Разный масштаб в формах и при запуске

Сврестайте все в один лэйаут (Выбирите окно и нажмити сверху на голубой квадратик из 9 голубфх квадратиков)

Обращение к ячейке таблицы

Вам нужно наследоваться от QAbstractTableModel, выбрать в каких контейнерах и как будите хранить данные и уже у них по индексу будите получать данные. Вот под рукой пример был на питоне, на…
DK

QTableView не становится в редактирование

балин, вот я, конечно, "молодец". минус 5 часов, из-за того, что не поставил в модели флаги. Qt::ItemFlags UserModel::flags(const QModelIndex &index) const{ Qt::ItemFlags flags = Tre…

QSqlTableModel - Как добавить картинки в таблицу, чтобы они отражались в диалоговом окне, но не были частью модели

Ну тогда в этом столбце указывайте пути на несколько картинок
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB