mafulechka23 июня 2020 г. 6:09

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

Содержание

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

Ни для кого не секрет, что миссия разработчиков 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 - приложение для студентов, преподавателей и родителей, чтобы отслеживать домашние задания, учебные группы и расписание.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Поддержать автора Donate

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг
k
  • knobu
  • 23 сентября 2020 г. 2:34

C++ - Тест 006. Перечисления

  • Результат:60баллов,
  • Очки рейтинга-1
k
  • knobu
  • 23 сентября 2020 г. 2:21

C++ - Тест 005. Структуры и Классы

  • Результат:91баллов,
  • Очки рейтинга8
k
  • knobu
  • 23 сентября 2020 г. 2:16

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
Последние комментарии

QCheckBox в качестве делегата QTableView

До тех пор, пока у вас проект содержит только одну таблицу, или несколько то может быть. Когда их будет 1000 и чекбоксы в разных колонках, то без делегатов и переопределения возвращаемых ре…
D
  • Damir
  • 20 сентября 2020 г. 15:34

QCheckBox в качестве делегата QTableView

bool Node::setData(const QModelIndex& index, const QVariant& value, int role){ switch (index.column()) { case 0: switch (role) { case Qt::CheckStateRole:// <- т…
VB

Qt/C++ - Урок 004. QSqlTableModel или Как представить таблицу из БД в Qt?

Почему-то такой метод для обновления не работает, который можно было бы применить в данном примере. То есть в представлении данные удаляются и обновляются, а в базе данных изменений не происходи…
ДИ

Qt/C++ - Урок 015. QTableWidget или Как сделать таблицу с чекбоксами

Кажется я понял в чем ошибка - я вручную создал таблицу Device в базе данных DataBase.db через DB Browser for SQLite в корне проекта с соответствующими типами данных и по какой-то причине insert…
ДИ

Qt/C++ - Урок 015. QTableWidget или Как сделать таблицу с чекбоксами

Да, у меня тоже такая мысль возникла, но я просто скопипастил этот код из статьи, ничего в нем не меняя.
Сейчас обсуждают на форуме

Как в Qt в QTableView получить правильный индекс

Добрый день. Пытаюсь получить в QTableView правильный индекс если делаю так tableViewTab3Hosts.currentIndex() то выдает строки таблицы, но при этом строка модели н…
U

Как в qml работать с динамически созданными потомками?

Я извиняюсь, что задаю такие глупые вопросы((( Но в документации написано void removeItem(item) Removes and destroys the specified item. Написал своему TabBar`у remove…

MyForm(forms.Form): - непонятка

1) Почитайте про формы - многое, что у вас в шалобне определено, можно решить с помощью определения класса формы: class MyPasswordChangeForm(forms.Form): old_password = forms.CharField(wi…

Siganal slot в ui

Добрый день, Не совсем понял, какой код должен находиться в слоте, но можно подключиться через лямбда функцию. connect(timer, &QTimer::timeout, this, [](){ ui->scrollArea-&g;…
KM

не знаю что писать в cpp

еще лучше сначала идет QWidget потом meny element
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB