Flutter#

Предварительные шаги#

Перед тем как устанавливать любые пакеты проверим подключение репозиториев Astra Linux командой в консоли:

cat /etc/apt/sources.list

Для Astra Linux 1.8 список возможных репозиториев будет таким:

# Основной репозиторий
deb https://dl.astralinux.ru/astra/stable/1.8_x86-64/main-repository/     1.8_x86-64 main contrib non-free non-free-firmware

# Расширенный репозиторий, включающий так же репозиторий для разработчиков
deb https://dl.astralinux.ru/astra/stable/1.8_x86-64/extended-repository/ 1.8_x86-64 main contrib non-free non-free-firmware

После проверки необходимо обновить список доступных пакетов командой в консоли:

sudo apt update

Совет

Подробнее о репозиториях можно прочесть в статьях Репозитории и Организация репозиториев

Установка#

Для установки необходимо в консоли ввести следующие команды (в зависимости от обновления):

sudo apt-get install -y curl git unzip xz-utils zip libglu1-mesa
#Astra Linux 1.8.x
sudo apt-get install clang cmake git ninja-build pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev
cd $HOME/Загрузки/
wget https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.24.3-stable.tar.xz
mkdir $HOME/development
tar -xf $HOME/Загрузки/flutter_linux_3.24.3-stable.tar.xz -C $HOME/development/
echo 'export PATH="$HOME/development/flutter/bin:$PATH"' >> $HOME/.bash_profile
export PATH="$HOME/development/flutter/bin:$PATH"
echo 'export CHROME_EXECUTABLE=/usr/lib/chromium/chromium' >> $HOME/.bash_profile
export CHROME_EXECUTABLE=/usr/lib/chromium/chromium

Результат вызова flutter doctor:

Doctor summary (to see all details, run flutter doctor -v):
[!] Flutter (Channel stable, 3.24.3, on Astra Linux 6.1.90-1-generic, locale ru_RU.UTF-8)
    ! The flutter binary is not on your path. Consider adding /home/administrator/development/flutter/bin to
    your path.
    ! The dart binary is not on your path. Consider adding /home/administrator/development/flutter/bin to your
    path.
[] Android toolchain - develop for Android devices
     Unable to locate Android SDK.
    Install Android Studio from: https://developer.android.com/studio/index.html
    On first launch it will assist you in installing the Android SDK components.
    (or visit https://flutter.dev/to/linux-android-setup for detailed instructions).
    If the Android SDK has been installed to a custom location, please use
    `flutter config --android-sdk` to update to that location.

[] Chrome - develop for the web
[] Linux toolchain - develop for Linux desktop
[!] Android Studio (not installed)
[] Connected device (2 available)
[] Network resources

! Doctor found issues in 3 categories.

Примечание

Issue по flutter path идёт из-за того, что мы прописали относительный путь в $PATH, если вы хотите убрать эту ошибку - пропишите в $HOME/.bash_profile абсолютный путь.

Примеры работы с пакетами#

Создадим директорию, где будем размещать проекты:

mkdir $HOME/projects/

battery_plus#

Плагин Flutter для доступа к различной информации о батарее устройства, на котором запущено приложение.

cd $HOME/projects/
flutter create battery
cd battery/
flutter pub add battery_plus
cd lib
rm main.dart
wget https://raw.githubusercontent.com/fluttercommunity/plus_plugins/refs/heads/main/packages/battery_plus/battery_plus/example/lib/main.dart
cd ../
flutter run
# выбираем linux

flutter_local_notifications#

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

cd $HOME/projects/
flutter create notifications
cd notifications
flutter pub add flutter_local_notifications device_info_plus http image path_provider flutter_timezone
cd lib
rm main.dart
wget https://raw.githubusercontent.com/MaikuB/flutter_local_notifications/refs/heads/master/flutter_local_notifications/example/lib/main.dart
cd ../
flutter run
# выбираем linux

Примечание

Если высветилась ошибка:

ERROR:  - 'List' is from 'dart:core'.
ERROR:  - 'Uint8List' is from 'dart:typed_data'.
ERROR:     assetIcon.buffer.asUint8List().toList(),
ERROR:                                    ^
ERROR: Target kernel_snapshot_program failed: Exception

Нужно убрать .toList() в файле lib/main.dart

network_info_plus#

Этот плагин позволяет приложениям Flutter находить информацию о сети и настраивать себя соответствующим образом.

cd $HOME/projects/
flutter create networkinfoplus
cd networkinfoplus
flutter pub add network_info_plus permission_handler
cd lib
rm main.dart
wget https://raw.githubusercontent.com/fluttercommunity/plus_plugins/refs/heads/main/packages/network_info_plus/network_info_plus/example/lib/main.dart
cd ../
flutter run
# выбираем linux

media_kit#

Кроссплатформенный видеоплеер и аудиоплеер для Flutter и Dart.

sudo apt install libmpv-dev -y
cd $HOME/projects/
flutter create videoplayer
cd videoplayer
flutter pub add media_kit_video media_kit_libs_linux
cd lib
rm main.dart

Необходимо создать файл командой:

echo """ \
import 'package:flutter/material.dart';

// Make sure to add following packages to pubspec.yaml:
// * media_kit
// * media_kit_video
// * media_kit_libs_video
import 'package:media_kit/media_kit.dart';                      // Provides [Player], [Media], [Playlist] etc.
import 'package:media_kit_video/media_kit_video.dart';          // Provides [VideoController] & [Video] etc.

void main() {
WidgetsFlutterBinding.ensureInitialized();
// Necessary initialization for package:media_kit.
MediaKit.ensureInitialized();
runApp(
    const MaterialApp(
    home: MyScreen(),
    ),
);
}

class MyScreen extends StatefulWidget {
const MyScreen({Key? key}) : super(key: key);
@override
State<MyScreen> createState() => MyScreenState();
}

class MyScreenState extends State<MyScreen> {
// Create a [Player] to control playback.
late final player = Player();
// Create a [VideoController] to handle video output from [Player].
late final controller = VideoController(player);

@override
void initState() {
    super.initState();
    // Play a [Media] or [Playlist].
    player.open(Media('https://user-images.githubusercontent.com/28951144/229373695-22f88f13-d18f-4288-9bf1-c3e078d83722.mp4'));
}

@override
void dispose() {
    player.dispose();
    super.dispose();
}

@override
Widget build(BuildContext context) {
    return Center(
    child: SizedBox(
        width: MediaQuery.of(context).size.width,
        height: MediaQuery.of(context).size.width * 9.0 / 16.0,
        // Use [Video] widget to display video output.
        child: Video(controller: controller),
    ),
    );
}
}
""" > main.dart
cd ../
flutter run
# выбираем linux

deb package#

Простое приложение командной строки, которое поможет вам легко объединить сборку приложения Flutter в пакет Debian.

cd $HOME/projects/
flutter create debpack
cd debpack
dart pub global activate flutter_to_debian
flutter build linux --release
export PATH=$HOME/.pub-cache/bin:$PATH
# если надо в последующем:
echo 'PATH=$HOME/.pub-cache/bin:$PATH' >> $HOME/.bash_profile
mkdir debian
flutter_to_debian create
# если ругается на dart - нужно сделать все абсолютные пути в $PATH
flutter_to_debian build
sudo apt install ./build/linux/x64/release/debian/debpack_1.0.0_amd64.deb
/opt/debpack/debpack

Примечание

При выполнении команды sudo apt install ./build/linux/x64/release/debian/debpack_1.0.0_amd64.deb

Задается вопрос: Sure you want to proceed with the installation of this package (yes/no) ?:

Нужно набрать yes и нажать Enter

Примечание

Более подробные настройки можно посмотреть на flutter_to_debian

Сборка проектов под arm64#

На arm64 устройстве достаточно взять сборку flutter для arm64 отсюда: containerbase/flutter-prebuild

Далее нужно выполнить те же пункты, что перечислены в разделе «Установка».

Проекты собираются тем же образом.

Использование C/C++ кода из flutter#

Автогенерация биндингов на Си#

Flutter предлагает разработчикам в первую очередь использовать C код

Пример можно получить при помощи:

cd $HOME/projects/
flutter create --template=plugin_ffi --platforms=linux ffigen_app
cd ffigen_app/example/
flutter run

C код находится в ffigen_app/src и можно автоматически перегенерировать dart автоген код при помощи:

cd $HOME/projects/ffigen_app/
# ffigen ругается на отсутствие ldconfig, который у нас лежит в /usr/sbin, самый простой способ - создать символическую ссылку
sudo ln -s /usr/sbin/ldconfig /usr/bin/
dart run ffigen --config ffigen.yaml

После чего будет перегенерирован файл ffigen_app/./lib/ffigen_app_bindings_generated.dart

Примечание

Более подробно: flutter-ffigen

Пример работы с GPS с использованием C++#

С/C++ кодом дела обстоят сложнее, так как биндинги нельзя автоматически сгенерировать, их нужно писать самому.

Пример плюсового кода, который был использован для получения gps координат: mapffi.zip

cd $HOME/projects/
sudo apt install libgps-dev
# скачиваем архив с проектом
unzip ./mapffi.zip
cd mapffi/
flutter pub get
cd example/
flutter pub get
flutter run

Биндинги dart’а в mapffi/lib, исходный код на C++ по получению координат в mapffi/src.

Примечание

Существуют альтернативные способы:

pigeon

Add a Linux platform-specific implementation

Дополнительная информация#

https://docs.flutter.dev

https://codelabs.developers.google.com/?product=flutter