Hola, Amigos! На связи Михаил Чернецов, Flutter dev в Amiga. Сегодня мы посмотрим на еще один способ интеграции нативного кода в Flutter - Pigeon.
Pigeon - инструмент, создающий интерфейсы для работы с нативным кодом при помощи кодогенерации. Это помогает нам не прописывать обработку Platform Channels напрямую.
-----------------------------------------------
Давайте посмотрим, как с ним работать. Для начала создадим в корне проекта папку pigeons, в которой будут находится необходимые шаблоны.
import 'package:pigeon/pigeon.dart';
@HostApi()
abstract class CalculateHostApi {
int calculate(int a, int b);
}
Стоит учитывать, как данные передаются в платформу и какие типы данных поддерживаются платформой. Это можно узнать по ссылке.
Для получения сообщений от платформы необходимо использовать аннотацию
@FlutterApi
.
Так же можем описать классы, которые будут использоваться, Pigeon также сгененирует платформенных код для них.
Создадим файл
generateCalculate.sh
для того, чтобы запускать Shell-скрипт.
flutter pub run pigeon \
--input "pigeons/calculate.dart" \
--dart_out "lib/calculate.g.dart" \
--kotlin_out "android/app/src/main/kotlin/com/example/pigeon_example/Calculate.g.kt" \
--swift_out "ios/Runner/Calculate.g.swift"
Здесь мы обозначаем директории, в которых будет генерироваться Pigeon-файлы.
Если их не добавить, то данные файлы не сгенерируются. Для использования плагина на уровне Flutter-приложения теперь вызываем сгенерированный класс:
await CalculateHostApi().calculate(3, 7);
-----------------------------------------------
Для настройки Pigeon на Android теперь необходимо сделать две вещи:
1️⃣ Создать файл
Calculate.kt
и реализовать код нашего плагина:
class Calculate : FlutterPlugin, CalculateHostApi{
// Функция которую мы реализуем
override fun calculate(a: Long, b: Long): Long {
return a + b
}
// Подключение плагина к движку
override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) {
CalculateHostApi.setUp(binding.binaryMessenger,this)
}
override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) {
CalculateHostApi.setUp(binding.binaryMessenger,null)
}
}
2️⃣ Добавить в плагины наш плагин в функции
configureFlutterEngine
в
MainActivity
:
flutterEngine.plugins.add(Calculate())
Для iOS необходимо внести изменения в файл
AppDelegate.swift
, проставить
CalculateHostAp
i в наследники и вызвать
CalculateHostApiSetup
в функции
application
:
let controller: FlutterViewController = window?.rootViewController as! FlutterViewController
CalculateHostApiSetup.setUp(
binaryMessenger: controller.binaryMessenger,
api: self
)
И в этом же классе реализуем функционал нашего плагина:
func calculate(a: Int64, b: Int64) -> Int64{
return a + b}
Тем самым мы реализовали Platform Channel с помощью Pigeon в нашем приложении.
Делитесь в чате, пробовали ли вы Pigeon для своих Platform Channels?