Platform Channel: bu nima, turlari va mobil ishlanmada ishlashi

Muallif: IT Sectr Nashr etilgan: 2026-06-03 O'qish vaqti: 12 daq

Dart kodi va native platformalar o'rtasidagi o'zaro aloqa — qurilma imkoniyatlariga kirishni talab qiladigan Flutter ilovalarini ishlab chiqishdagi asosiy vazifadir. Flutter Team, 2026 ma'lumotlariga ko'ra, Platform Channel bunday integratsiya uchun asosiy mexanizm bo'lib qoladi, Dart va Android hamda iOS-ning native kodi o'rtasida xabarlarni uzatishni qo'shimcha native kutubxonalarni jalb qilmasdan ta'minlaydi.

Asosiy fikrlar

  • Platform Channel — Dart va Android hamda iOS-ning native kodi o'rtasida ikki tomonlama aloqa uchun Flutter mexanizmi.
  • MethodChannel Dart-dan native metodlarni chaqirish va natijani Future shaklida olish imkonini beradi.
  • EventChannel native tomondan hodisa oqimlarini Dart-ga Stream mexanizmi orqali uzatadi.
  • BasicMessageChannel ixtiyoriy formatda erkin asinxron xabar almashinuvini ta'minlaydi.
  • Serializatsiya StandardMethodCodec va StandardMessageCodec yordamida ma'lumotlarni avtomatik paketlashni amalga oshiradi.

Flutter-da Platform Channel nima?

Platform Channel — bu Flutter texnologiyasi bo'lib, ilovaning Dart kodi bilan Android va iOS operatsion tizimlarining native kodi o'rtasida ikki tomonlama aloqani ta'minlaydi. Platform Channel bo'lmasa, Flutter ilovasi framework tomonidan taqdim etilgan imkoniyatlar bilan cheklanadi va kamera API-si, sensorlar, Bluetooth, fayl tizimi va boshqa past darajadagi qurilma funksiyalariga to'g'ridan-to'g'ri kira olmaydi.

Platform Channel arxitekturasi asinxron xabar almashinuvi printsipi asosida qurilgan. Dart tomoni kanal orqali so'rov yuboradi, native tomon uni qayta ishlaydi va natijani qaytaradi. Barcha xabarlar ikkilik formatga serializatsiya qilinadi va Flutter Engine xabar buferi orqali uzatiladi, bu esa ijro muhitlari o'rtasida ma'lumot uzatishda minimal kechikishni ta'minlaydi.

Har bir Platform Channel noyob mantiqiy nom bilan identifikatsiya qilinadi — xabarlarni marshrutlash uchun manzil bo'lib xizmat qiladigan satr. Dart tomoni va native tomon aloqaning to'g'ri o'rnatilishi uchun bir xil kanal nomidan foydalanishi kerak. Flutter bitta ilovada istalgan miqdordagi kanallarni qo'llab-quvvatlaydi va har bir kanal boshqalardan mustaqil ishlaydi.

Flutter-ning rasmiy hujjatlariga ko'ra, Platform Channel xabarlarni ular yuborilgan tartibda qayta ishlaydi, bu esa chaqiruvlar ketma-ketligining bashorat qilinishini ta'minlaydi. Bu, qayta ishlash tartibi ishning to'g'riligiga ta'sir qiladigan stsenariylarda — masalan, native modullarning ketma-ket ishga tushirilishida yoki bog'liq operatsiyalar zanjirida — muhim ahamiyatga ega.

Platform Channel qanday ishlaydi: xabar uzatish arxitekturasi

Platform Channel orqali xabar uzatish mexanizmi uchta asosiy qatlamdan iborat: Dart tomoni invokeMethod orqali Map yoki List shaklida xabar yuboradi, Flutter Engine uni StandardMethodCodec yordamida serializatsiya qiladi va native tomon o'z handlerida chaqiruvni qabul qiladi. Natija xuddi shu yo'l bilan teskari yo'nalishda qaytadi.

Serializatsiya jarayoni avtomatik ravishda Dart ma'lumot turlarini native platformalardagi ekvivalentlarga aylantiradi. Raqamlar, satrlar, mantiqiy qiymatlar, ro'yxatlar va lug'atlar qo'shimcha konfiguratsiyasiz qo'llab-quvvatlanadi. Shaxsiy ma'lumot turlari kanal orqali yuborilishdan oldin qo'lda serializatsiya qilinishi kerak, masalan JSON satriga.

Flutter Engine tomonida xabar native platformaning asosiy oqim navbatiga tushadi. Android-da bu ilovaning asosiy oqimi, iOS-da — asosiy bajarish siklidir. Bu shuni anglatadiki, kanal handleridagi uzoq muddatli operatsiyalar foydalanuvchi interfeysini bloklaydi va muzlashlarga olib keladi. Dasturchilarga og'ir vazifalarni fon oqimlarida bajarish va natijani callback orqali asinxron qaytarish tavsiya etiladi.

Platform Channel-ning ishlashi ko'pchilik foydalanish stsenariylari uchun yetarli darajada yuqori: zamonaviy qurilmalarda bitta xabarni uzatish vaqti 1 millisekunddan kam. Biroq, real vaqtda video oqimini qayta ishlash kabi yuqori yuklangan operatsiyalar uchun Dart FFI yoki qurilma xotirasiga to'g'ridan-to'g'ri kirish imkoniyatiga ega native plaginlardan foydalanish tavsiya etiladi.

Arxitekturaning asosiy cheklovi: Platform Channel fayl deskriptorlari, xotira ko'rsatkichlari yoki native obyektlarni uzatishni qo'llab-quvvatlamaydi. Barcha ma'lumotlar ikkilik formatga serializatsiya qilinishi mumkin bo'lishi kerak. Megabayt hajmidagi katta ma'lumotlarni uzatish uchun kanal orqali ularga yo'lni uzatish bilan vaqtinchalik fayllardan foydalaning.

Flutter ishlanmasida uch turdagi Platform Channel

Flutter uch turdagi Platform Channel-ni taqdim etadi, ularning har biri muayyan o'zaro aloqa stsenariysi uchun mo'ljallangan. To'g'ri kanal turini tanlash integratsiya arxitekturasini va ikkala tomonda — Dart va native tomonda — kodni saqlash qulayligini belgilaydi, shuning uchun MethodChannel, EventChannel va BasicMessageChannel o'rtasidagi farqlarni tushunish muhimdir.

MethodChannel — native tomonda metodlarni chaqirish

MethodChannel — eng keng tarqalgan Platform Channel turi bo'lib, masofaviy protsedura chaqiruvi namunasini amalga oshiradi. Dart metod nomi va argumentlarni yuboradi, native tomon operatsiyani bajaradi va natijani qaytaradi. Har bir chaqiruv Future qaytaradi, bu esa qulay asinxron ish uchun Dart kodida async va await konstruksiyalaridan foydalanish imkonini beradi.

Ushbu kanal turi so'rov-javob tipidagi operatsiyalar uchun mos keladi: batareya darajasini olish, sensor ko'rsatkichlarini o'qish, native tomonda hisob-kitoblarni amalga oshirish yoki tizim xizmatlaridan ma'lumot so'rash. MethodChannel StandardMethodCodec orqali standart ma'lumot turlarini, jumladan, zamonaviy Dart-da Null safety qo'llab-quvvatlashi tufayli null qiymatlarni ham qo'llab-quvvatlaydi.

Haqiqiy loyihalarda MethodChannel rasmiy Flutter plaginlarining aksariyatida qo'llaniladi. Masalan, camera, battery va path_provider paketlari aynan shu kanal turi orqali ishlaydi, har bir platforma uchun o'z integratsiya kodini yozishga hojat qoldirmasdan native API-larga kirishni ta'minlaydi.

EventChannel — hodisa oqimlariga obuna bo'lish

EventChannel native tomon vaqt davomida uzluksiz hodisa oqimini yaratadigan stsenariylar uchun mo'ljallangan. Ma'lumotlar Dart-ga Stream orqali uzatiladi, real vaqt rejimida yangilanishlarga obuna bo'lish imkonini beradi. Odatiy foydalanish namunalari: akselerometr ko'rsatkichlari, GPS koordinatalari, Bluetooth holatining o'zgarishi va tizim xizmatlaridan bildirishnomalar.

MethodChannel-dan farqli o'laroq, EventChannel nashr-obuna modelidan foydalanadi. Native tomon hodisalarni Dart kodidan aniq so'rovsiz, ular yuzaga kelganida yuboradi. Dart tomonidagi obunachi har bir hodisani oqimning alohida elementida oladi va interfeysda ishlatishdan oldin olingan ma'lumotlarni filtrlashi yoki o'zgartirishi mumkin.

EventChannel-dan foydalanishda obunalar va ularni bekor qilishni to'g'ri boshqarish kerak. Har bir StreamSubscription chaqiruvi kanal bilan ish tugagandan so'ng bekor qilinishi kerak, bu native tomonda xotira oqishining oldini oladi. Flutter platformasi vidjet yo'q qilinganda oqimni avtomatik bekor qiladi, ammo obunalarni aniq boshqarish uzoq muddatli stsenariylarda ilovaning ishonchliligini oshiradi.

BasicMessageChannel — erkin xabar almashinuvi

BasicMessageChannel — eng moslashuvchan Platform Channel turi bo'lib, ixtiyoriy asinxron xabar almashinuvi uchun mo'ljallangan. MethodChannel-dan farqli o'laroq, har bir xabar metod nomi va argumentlarni o'z ichiga oladi, BasicMessageChannel esa ichki marshrutlashsiz faqat foydali yukni uzatadi. Jo'natuvchi tomon xabar yuboradi, qabul qiluvchi tomon uni qayta ishlaydi va javob qaytaradi.

Ushbu kanal turi shaxsiy o'zaro aloqa protokollari uchun qulaydir, bunda xabar tuzilishi ilova holatiga qarab dinamik o'zgarishi mumkin. BasicMessageChannel standart sifatida StandardMessageCodec-dan foydalanadi, ammo nostandart ma'lumot serializatsiya formatlari uchun ixtiyoriy MessageCodec-ni almashtirishni qo'llab-quvvatlaydi.

Amalda BasicMessageChannel MethodChannel-dan kamroq qo'llaniladi, chunki ichki nomlash namunasiz xabar marshrutlashni qo'lda qayta ishlashni talab qiladi. Biroq, MethodChannel-da amalga oshirilgan standart so'rov-javob namunasidan farqli, ma'lum xabar formatini kutadigan native kutubxonalar bilan integratsiya qilishda almashtirib bo'lmaydi.

Platform Channel-ni amalga oshirish: Dart va native platformalarda kod namunasi

Qurilmaning batareya darajasini olish misolida Platform Channel-ni amaliy amalga oshirishni ko'rib chiqamiz. Ushbu misol ishning to'liq siklini ko'rsatadi: Dart tomonida MethodChannel-ni e'lon qilish, Android va iOS-da handlerni amalga oshirish, shuningdek ma'lumot mavjud bo'lmaganda yoki kerakli ruxsatlar yo'q bo'lganda xatolarni to'g'ri boshqarish.

Dart tomonida MethodChannel

Dart tomonida noyob satr kanal nomi bilan MethodChannel namunasi yaratiladi. invokeMethod metodi native tomonga so'rov yuboradi va natijani Future shaklida kutadi. Xatolarni boshqarish PlatformException-ni ushlash orqali amalga oshiriladi, native tomon so'rovni qayta ishlashda istisno yuzaga kelganda uni qaytaradi.

dart
import 'package:flutter/services.dart';

class BatteryPlugin {
  static const _channel = MethodChannel(
    'samples.flutter.dev/battery',
  );

  Future<String> getBatteryLevel() async {
    try {
      final result = await _channel.invokeMethod<int>(
        'getBatteryLevel',
      );
      return 'Battery level: $result%';
    } on PlatformException catch (e) {
      return 'Failed: ${e.message}';
    }
  }
}

Android tomonida Kotlin-da qayta ishlash

Android tomonida handler MainActivity-da configureFlutterEngine metodi orqali ro'yxatdan o'tkaziladi. setMethodCallHandler ichida kiruvchi metodning nomi tekshiriladi, batareya darajasini olish uchun BatteryManager-ga native chaqiruv amalga oshiriladi va natija result obyekti orqali qaytariladi. Kanal tomonidan qo'llab-quvvatlanmaydigan metodlar uchun result.notImplemented chaqiriladi.

kotlin
import android.os.BatteryManager
import io.flutter.embedding.android.FlutterActivity
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
  private val CHANNEL = "samples.flutter.dev/battery"

  override fun configureFlutterEngine(
    flutterEngine: FlutterEngine
  ) {
    super.configureFlutterEngine(flutterEngine)
    MethodChannel(
      flutterEngine.dartExecutor.binaryMessenger,
      CHANNEL
    ).setMethodCallHandler { call, result ->
      if (call.method == "getBatteryLevel") {
        val level = getBatteryLevel()
        if (level != -1) {
          result.success(level)
        } else {
          result.error(
            "UNAVAILABLE",
            "Battery level not available",
            null
          )
        }
      } else {
        result.notImplemented()
      }
    }
  }

  private fun getBatteryLevel(): Int {
    val manager = getSystemService(BATTERY_SERVICE) as BatteryManager
    return manager.getIntProperty(
      BatteryManager.BATTERY_PROPERTY_CAPACITY
    )
  }
}

iOS tomonida Swift-da qayta ishlash

iOS platformasida handler AppDelegate sinfida FlutterMethodChannel orqali ro'yxatdan o'tkaziladi. Swift kodi kiruvchi chaqiruvni qabul qiladi, batareya darajasini olish uchun UIDevice tizim API-siga murojaat qiladi va natijani Flutter-ga qaytaradi. weak self bilan asinxron qayta ishlash xotirada kuchli havola siklini saqlash xavfisiz so'rovlarni bajarish imkonini beradi.

swift
import UIKit
import Flutter

@UIApplicationMain
class AppDelegate: FlutterAppDelegate {
  override func application(
    application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    let controller = window?.rootViewController as! FlutterViewController
    let channel = FlutterMethodChannel(
      name: "samples.flutter.dev/battery",
      binaryMessenger: controller.binaryMessenger
    )
    channel.setMethodCallHandler { [weak self] call, result in
      if call.method == "getBatteryLevel" {
        let level = self?.getBatteryLevel() ?? -1
        if level >= 0 {
          result(level)
        } else {
          result(FlutterError(
            code: "UNAVAILABLE",
            message: "Battery level not available",
            details: nil
          ))
        }
      } else {
        result(FlutterMethodNotImplemented)
      }
    }
    return super.application(
      application: application,
      didFinishLaunchingWithOptions: launchOptions
    )
  }

  private func getBatteryLevel() -> Int {
    let device = UIDevice.current
    device.isBatteryMonitoringEnabled = true
    return Int(device.batteryLevel * 100)
  }
}

Platform Channel Flutter loyihalarida qachon zarur

Platform Channel Flutter ilovasi standart paketlarda amalga oshirilmagan qurilma imkoniyatlariga kirishni talab qilgan har bir holatda zarurdir. Dasturchi kamera, biometriya, NFC, Bluetooth Low Energy uchun native SDK-lar bilan integratsiya qilishda yoki ilova sandboxidan tashqaridagi fayl tizimi bilan ishlashda o'z kanalini yaratishi kerak.

Birinchi odatiy stsenariy — native API-lardan foydalanish, ularga Dart-dan to'g'ridan-to'g'ri kirish yo'q. Bunga Android va iOS-ning tizim xizmatlari, nostandart ma'lumot uzatish protokollariga ega apparat sensorlari, shaxsiy qayta ishlash mantiqiga ega push bildirishnomalari va kalitlarni xavfsiz saqlash uchun Hardware Security Module talab qiladigan kriptografik operatsiyalar kiradi.

Ikkinchi stsenariy — mavjud native kodni Flutter loyihasiga integratsiya qilish. Agar kompaniya allaqachon Android yoki iOS uchun native kutubxona ishlab chiqqan bo'lsa, Platform Channel uni Dart-ga port qilmasdan qayta ishlatish imkonini beradi. Bu gibrid ilovalarning Flutter-ga migratsiyasini tezlashtiradi va mavjud native kodga hamda to'plangan biznes mantiqiga kiritilgan investitsiyalarni saqlaydi.

Uchinchi stsenariy — o'z Flutter plaginini pub.dev-da nashr etish. Barcha mashhur plaginlar Dart-da yagona API taqdim etish uchun Platform Channel-dan foydalanadi, bu API parda ortida har bir platformaning native kodini chaqiradi. Bu ikkala mobil platformani qo'llab-quvvatlovchi qayta ishlatiladigan paketlar yaratish uchun Flutter jamoasi tomonidan tavsiya etilgan standart yondashuvdir.

O'z Platform Channel-ingizni yaratish va pub.dev-dan tayyor paketdan foydalanish o'rtasida tanlov qilishda avval tayyor yechim mavjudligini tekshirish tavsiya etiladi. camera, geolocator, shared_preferences va path_provider paketlari odatiy ehtiyojlarning aksariyatini qamrab oladi. O'z Platform Channel-ingiz faqat mos paket bo'lmaganda yoki mavjud yechim ta'minlay olmaydigan chuqur native xatti-harakatni sozlash zarur bo'lganda asoslanadi.

Tez-tez beriladigan savollar

Flutter-da MethodChannel EventChannel-dan qanday farq qiladi?

MethodChannel so'rov-javob namunasini amalga oshiradi, metodni bir marta chaqirish va natijani Future orqali qaytarish bilan. EventChannel oqim modelidan foydalanadi: native tomon hodisalarni yuzaga kelganda yuboradi, Dart esa ularni Stream orqali qabul qiladi. MethodChannel natija kutiladigan bir martalik operatsiyalar uchun, EventChannel esa real vaqtda uzluksiz ma'lumot oqimlari uchun mos keladi.

Platform Channel orqali qanday ma'lumot turlarini uzatish mumkin?

Platform Channel asosiy Dart turlarini qo'llab-quvvatlaydi: int, double, bool, String, List va Map. Bu turlar avtomatik ravishda StandardMethodCodec va StandardMessageCodec orqali native ekvivalentlarga serializatsiya qilinadi. Shaxsiy obyektlarni uzatish uchun JSON-ga qo'lda serializatsiya qilish yoki nostandart formatlarni qo'llab-quvvatlaydigan ixtiyoriy MessageCodec-dan foydalanish talab qilinadi.

Bitta ilovada bir nechta Platform Channel ishlatish mumkinmi?

Ha, Flutter bitta ilovada cheklanmagan miqdordagi Platform Channel-ni qo'llab-quvvatlaydi. Har bir kanal noyob satr nomi bilan identifikatsiya qilinadi, bu nom Dart va native platforma tomonida mos kelishi kerak. Turli modullar uchun alohida kanallar yaratilishi mumkin: biri kamera uchun, ikkinchisi Bluetooth uchun, uchinchisi sensorlar uchun — hammasi mustaqil ishlaydi va bir-birining ishlashiga ta'sir qilmaydi.

Platform Channel orqali chaqirishda xatolarni qanday boshqarish mumkin?

Dart tomonida xatolar PlatformException orqali boshqariladi, native tomon istisno yuzaga kelganda uni qaytaradi. try-catch bloki istisnoni ushlaydi va xato kodi, xabari hamda tafsilotlariga kirishni ta'minlaydi. Native tomonda result.error chaqiruvi xatoni Dart-ga qaytaradi. Kanal tomonidan qo'llab-quvvatlanmaydigan metodlar uchun result.notImplemented metodi ham mavjud.

Platform Channel ilovaning asosiy oqimini bloklaydimi?

Ha, Platform Channel handleri native platformaning asosiy oqimida bajariladi. Agar handler uzoq muddatli operatsiya — tarmoq so'rovi, diskdan o'qish yoki og'ir hisob-kitoblarni bajarayotgan bo'lsa, foydalanuvchi interfeysi muzlashi mumkin. Og'ir vazifalarni native tomonda fon oqimida ishga tushirish va natijani faqat tugagandan so'ng chaqirish tavsiya etiladi. Dart tomoni esa invokeMethod-ning asinxron tabiati tufayli bloklanmaydi.

Xulosa

  • Platform Channel — Dart kodining Android va iOS native platformalari bilan o'zaro aloqasi uchun asosiy Flutter mexanizmi, asinxron xabar almashinuviga asoslangan.
  • MethodChannel native metodlarni bir martalik chaqirish uchun so'rov-javob namunasini amalga oshiradi, natija Future orqali qaytariladi.
  • EventChannel native tomondan uzluksiz hodisalarni qabul qilish uchun Stream mexanizmi orqali oqim modelidan foydalanadi.
  • BasicMessageChannel metod nomlari bilan ichki marshrutlashsiz ixtiyoriy xabarlarning erkin asinxron almashinuvini ta'minlaydi.
  • Serializatsiya StandardMethodCodec va StandardMessageCodec orqali asosiy Dart turlarini qo'llab-quvvatlaydi va shaxsiy obyektlar uchun qo'lda konvertatsiya talab qiladi.
  • Ishlash Platform Channel ko'pchilik vazifalar uchun yetarli: xabar uzatish vaqti 1 ms dan kam, lekin oqim ma'lumotlari uchun Dart FFI tavsiya etiladi.
  • Tavsiya: o'z kanalingizni yaratishdan oldin pub.dev-da tayyor paket mavjudligini tekshiring — odatiy native funksiyalarning aksariyati allaqachon jamoa tomonidan amalga oshirilgan va rasmiy plaginlar orqali mavjud.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish