6.8 KiB
Dart package
Пакеты написанные на Dart, например package path
. Они могут содержать специфичные для Flutter функции и иметь зависимость от инфраструктуры Flutter, ограничивая их использование только Flutter, например package fluro
.
Для демонстрации создания платформо-зависимого пакета для ОС Аврора типа "Dart package" был написан и опубликован проект "Demo Dart Packages" которые подробно описан в статье "Flutter на ОС Аврора".
Проект "Demo Dart Packages" содержит в себе пакет реализующий платформо-зависимый пакет для ОС Аврора типа "Dart package". Вообще этот тип пакета может быть как платформо-зависимым так и нет. Пакет "Flutter Device" из проекта Demo Dart Packages становится платформо-зависимым использую D-Bus ОС Аврора. Данный пакет использует API ОС Аврора - "Device Info API".
Пакет Dart в минимальном виде состоит из файла pubspec.yaml
, папки lib
с как минимум одним файлом <package-name>.dart
. Создать пакет можно командой:
$ flutter-aurora create --template=package <package-name>
Рассмотрим пакет "dart_package_device" из проекта Demo Dart Packages. dart_package_device - платформо-зависимая реализация плагина "Flutter Device" для ОС Аврора типа "Dart package". В основе пакета лежит пакет dbus
- нативная клиентская реализация D-Bus для Dart. С его помощью можно реализовать пакет Dart для ОС Аврора, ни строчки не написав на C++.
Структура пакета dart_package_device:
└── aurora
└── dart_package_device
├── lib
│ ├── dart_package_device.dart
│ └── ru_omp_device_info_features.dart
├── ru.omp.deviceinfo.Features.xml
└── pubspec.yaml
Пакет dbus
позволяет на основе xml-файла с интерфейсом D-Bus генерировать Dart-класс, который позволит выполнить доступные методы.
Файл packages/aurora/dart_package_device/ru.omp.deviceinfo.Features.xml
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="ru.omp.deviceinfo.Features">
<method name="getDeviceModel">
<arg type="s" direction="out"/>
</method>
</interface>
</node>
Выполнить генерацию можно командой:
$ dart-dbus generate-remote-object ./ru.omp.deviceinfo.Features.xml \
-o lib/ru_omp_device_info_features.dart
Результат генерации c файла ru.omp.deviceinfo.Features.xml
следует рассматривать, как отправную точку для реализации.
Файл packages/aurora/dart_package_device/lib/ru_omp_device_info_features.dart
class RuOmpDeviceinfoFeatures extends DBusRemoteObject {
RuOmpDeviceinfoFeatures(
DBusClient client, String destination, DBusObjectPath path)
: super(client, name: destination, path: path);
/// Вызов ru.omp.deviceinfo.Features.getDeviceModel()
Future<String> callGetDeviceModel(
{bool noAutoStart = false,
bool allowInteractiveAuthorization = false}) async {
var result = await callMethod(
'ru.omp.deviceinfo.Features', 'getDeviceModel', [],
replySignature: DBusSignature('s'),
noAutoStart: noAutoStart,
allowInteractiveAuthorization: allowInteractiveAuthorization);
return result.returnValues[0].asString();
}
}
Теперь можно реализовать интерфейс device_platform_interface и в методе registerWith
указать пакет dart_package_device, как платформо-зависимый плагин.
Файл packages/aurora/dart_package_device/lib/dart_package_device.dart
/// Метод, который выполнится при старте приложения
/// В этом методе можно установить платформо-зависимый плагин
static void registerWith() {
DevicePlatform.instance = DartPackageDevice();
}
/// Реализация метода интерфейса [DevicePlatform]
@override
Future<String?> get deviceName async {
// Инициализация клиента D-Bus
final client = DBusClient.session();
// Инициализация объекта
final features = RuOmpDeviceinfoFeatures(
client,
'ru.omp.deviceinfo',
DBusObjectPath('/ru/omp/deviceinfo/Features'),
);
// Выполнение метода
final deviceName = await features.callGetDeviceModel();
// Закрытие клиента D-Bus
await client.close();
// Возвращение результата
return deviceName == '' ? null : deviceName;
}
В pubspec.yaml
плагина dart_package_device следует указать dartPluginClass
для того, чтобы с помощью метода registerWith
прошла регистрация плагина в общем-плагине
flutter_device при старте приложения.
flutter:
plugin:
platforms:
aurora:
dartPluginClass: DartPackageDevice