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.