← Назад к вопросам

Что такое Platform Channel и какие виды бывают?

2.0 Middle🔥 182 комментариев
#Нативная интеграция

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Platform Channels в Flutter

Platform Channel — это механизм двусторонней коммуникации между кодом Dart (Flutter) и нативным кодом платформы (Java/Kotlin для Android, Swift/Objective-C для iOS). Они необходимы для доступа к функциям, которых нет в Flutter SDK или которые требуют работы с OS-специфичными API.

Зачем нужны Platform Channels?

Не весь функционал можно реализовать на Dart. Platform Channels позволяют:

  • Получить доступ к камере, микрофону, датчикам без готовых плагинов
  • Работать с нативными UI компонентами (например, нативные диалоги)
  • Использовать системные уведомления, батарею, местоположение
  • Интегрировать SDK третьих сторон (чаще всего на Java/Kotlin)
  • Обрабатывать специфичные для платформы события

Виды Platform Channels

1. MethodChannel — основной канал

Используется для синхронного вызова методов нативного кода из Dart.

// Flutter (Dart)
const platform = MethodChannel(com.example.app/native);

try {
  final result = await platform.invokeMethod<String>(getBatteryLevel);
  print(Батарея: $result%);
} catch (e) {
  print(Ошибка: $e);
}
// Android (Kotlin)
val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example.app/native")
channel.setMethodCallHandler { call, result ->
    when (call.method) {
        "getBatteryLevel" -> {
            val batteryLevel = // получить уровень батареи
            result.success(batteryLevel)
        }
        else -> result.notImplemented()
    }
}

2. EventChannel — потоковые события

Для получения потока событий от платформы в реальном времени (датчики, GPS, слушатели).

const eventChannel = EventChannel(com.example.app/location);

eventChannel.receiveBroadcastStream().listen((location) {
  print(Новая локация: $location);
});

3. BasicMessageChannel — простая передача сообщений

Для асинхронной двусторонней коммуникации с любыми данными (строки, maps, бинарные данные).

Используется реже, главно для специфичных кейсов.

Поток обмена данными

  1. Flutter отправляет вызов метода через MethodChannel
  2. Нативный код (Android/iOS) получает вызов
  3. Нативный код выполняет логику
  4. Нативный код отправляет результат обратно
  5. Flutter получает результат в виде Future

Обработка ошибок

try {
  final result = await platform.invokeMethod(someMethod);
} on PlatformException catch (e) {
  print(Платформа вернула ошибку: ${e.code}, ${e.message});
} on MissingPluginException {
  print(Плагин не реализован на этой платформе);
}

Platform Channel vs Plugins

Если функционал понадобится переиспользовать — оборачиваем Platform Channels в плагин (пакет с префиксом, например, battery_plus). Это позволяет:

  • Легко шарить код между проектами
  • Управлять версиями
  • Предоставлять API на Dart

Вывод: Platform Channels — это мост между Dart и нативным кодом. MethodChannel для вызовов, EventChannel для потоков событий. Это фундамент любой интеграции с OS-функциями.