Platform Channel: nədir, növləri və mobil inkişafda işləməsi

Müəllif: IT Sectr Dərc olunub: 2026-06-03 Oxuma vaxtı: 12 dəq

Dart kodu ilə native platformalar arasında qarşılıqlı əlaqə — cihaz imkanlarına giriş tələb edən Flutter tətbiqlərinin hazırlanmasında əsas vəzifədir. Flutter Team, 2026-ya görə, Platform Channel bu inteqrasiya üçün əsas mexanizm olaraq qalır, Dart və Android və iOS-un native kodu arasında mesajların ötürülməsini əlavə native kitabxanalar cəlb etmədən təmin edir.

Əsas məqamlar

  • Platform Channel — Dart ilə Android və iOS-un native kodu arasında ikitərəfli əlaqə üçün Flutter mexanizmi.
  • MethodChannel Dart-dan native metodları çağırmağa və nəticəni Future şəklində almağa imkan verir.
  • EventChannel native tərəfdən hadisə axınlarını Dart-a Stream mexanizmi vasitəsilə ötürür.
  • BasicMessageChannel ixtiyari formatda sərbəst asinxron mesaj mübadiləsini təmin edir.
  • Serializasiya StandardMethodCodec və StandardMessageCodec-dən istifadə edərək məlumatların avtomatik qablaşdırılmasını həyata keçirir.

Flutter-də Platform Channel nədir?

Platform Channel — Flutter texnologiyası olub, tətbiqin Dart kodu ilə Android və iOS əməliyyat sistemlərinin native kodu arasında ikitərəfli əlaqəni təmin edir. Platform Channel olmadan Flutter tətbiqi framework tərəfindən təqdim edilən imkanlarla məhdudlaşır və kamera API, sensorlar, Bluetooth, fayl sistemi və digər aşağı səviyyəli cihaz funksiyalarına birbaşa daxil ola bilməz.

Platform Channel arxitekturası asinxron mesaj mübadiləsi prinsipi üzərində qurulub. Dart tərəfi kanal vasitəsilə sorğu göndərir, native tərəf onu emal edir və nəticəni qaytarır. Bütün mesajlar ikili formata serializasiya olunur və Flutter Engine mesaj buferi vasitəsilə ötürülür, bu da icra mühitləri arasında məlumat ötürülməsində minimal gecikməni təmin edir.

Hər bir Platform Channel unikal məntiqi adla identifikasiya olunur — mesajların marşrutlaşdırılması üçün ünvan rolunu oynayan sətir. Dart və native tərəf əlaqənin düzgün qurulması üçün eyni kanal adından istifadə etməlidir. Flutter bir tətbiqdə istənilən sayda kanalı dəstəkləyir və hər bir kanal digərlərindən asılı olmayaraq işləyir.

Flutter-in rəsmi sənədlərinə görə, Platform Channel mesajları göndərildiyi ardıcıllıqda emal edir, bu da çağırış ardıcıllığının proqnozlaşdırıla bilməsini təmin edir. Bu, emal sırasının işin düzgünlüyünə təsir etdiyi ssenarilərdə — məsələn, native modulların ardıcıl başlanğıcında və ya asılı əməliyyatlar zəncirində — kritik əhəmiyyət daşıyır.

Platform Channel necə işləyir: mesaj ötürmə arxitekturası

Platform Channel vasitəsilə mesaj ötürmə mexanizmi üç əsas təbəqədən ibarətdir: Dart tərəfi invokeMethod vasitəsilə Map və ya List şəklində mesaj göndərir, Flutter Engine onu StandardMethodCodec ilə serializasiya edir və native tərəf öz handlerində çağırışı qəbul edir. Nəticə eyni yolla əks istiqamətdə qayıdır.

Serializasiya prosesi avtomatik olaraq Dart məlumat tiplərini native platformaların ekvivalentlərinə çevirir. Rəqəmlər, sətirlər, boolean dəyərlər, siyahılar və lüğətlər əlavə konfiqurasiya tələb olunmadan dəstəklənir. Fərdi məlumat tipləri kanal vasitəsilə göndərilməzdən əvvəl əl ilə serializasiya edilməlidir, məsələn JSON sətrinə.

Flutter Engine tərəfində mesaj native platformanın əsas axın növbəsinə düşür. Android-də bu tətbiqin əsas axını, iOS-da — əsas işləmə dövrüdür. Bu o deməkdir ki, kanal handlerində uzunmüddətli əməliyyatlar istifadəçi interfeysini bloklayır və donmalara səbəb olur. Tərtibatçılara ağır tapşırıqları fon axınlarında yerinə yetirmək və nəticəni callback vasitəsilə asinxron qaytarmaq tövsiyə olunur.

Platform Channel-ın performansı əksər istifadə ssenariləri üçün kifayət qədər yüksəkdir: bir mesajın ötürülmə vaxtı müasir cihazlarda 1 millisaniyədən azdır. Lakin real vaxtda video axınının emalı kimi yüksək yüklü əməliyyatlar üçün Dart FFI və ya cihaz yaddaşına birbaşa girişi olan native plaginlərdən istifadə etmək tövsiyə olunur.

Arxitekturanın əsas məhdudiyyəti: Platform Channel fayl deskriptorlarının, yaddaş göstəricilərinin və ya native obyektlərin ötürülməsini dəstəkləmir. Bütün məlumatlar ikili formata serializasiya oluna bilməlidir. Meqabayt həcmində böyük verilənlərin ötürülməsi üçün kanal vasitəsilə onlara yol ötürülməklə müvəqqəti fayllardan istifadə edin.

Flutter inkişafında üç növ Platform Channel

Flutter üç növ Platform Channel təqdim edir, hər biri müəyyən qarşılıqlı əlaqə ssenarisi üçün nəzərdə tutulub. Düzgün kanal növünün seçilməsi inteqrasiya arxitekturasını və hər iki tərəfdə — Dart və native tərəfdə — kodun saxlanma rahatlığını müəyyən edir, buna görə də MethodChannel, EventChannel və BasicMessageChannel arasındakı fərqləri başa düşmək vacibdir.

MethodChannel — native tərəfdə metodların çağırılması

MethodChannel — uzaq prosedur çağırışı nümunəsini həyata keçirən ən geniş yayılmış Platform Channel növüdür. Dart metod adı və arqumentlər göndərir, native tərəf əməliyyatı yerinə yetirir və nəticəni qaytarır. Hər bir çağırış Future qaytarır, bu da rahat asinxron iş üçün Dart kodunda async və await konstruksiyalarından istifadə etməyə imkan verir.

Bu kanal növü sorğu-cavab tipli əməliyyatlar üçün uyğundur: batareya səviyyəsinin alınması, sensor göstəricilərinin oxunması, native tərəfdə hesablamaların aparılması və ya sistem xidmətlərindən məlumat tələbi. MethodChannel StandardMethodCodec vasitəsilə standart məlumat tiplərini, o cümlədən müasir Dart-da Null safety dəstəyi sayəsində null dəyərləri dəstəkləyir.

Real layihələrdə MethodChannel rəsmi Flutter plaginlərinin əksəriyyətində istifadə olunur. Məsələn, camera, battery və path_provider paketləri məhz bu kanal növü vasitəsilə işləyir, hər platforma üçün öz inteqrasiya kodunu yazmağa ehtiyac olmadan native API-lərə girişi təmin edir.

EventChannel — hadisə axınlarına abunəlik

EventChannel native tərəfin zamanla fasiləsiz hadisə axını yaratdığı ssenarilər üçün nəzərdə tutulub. Məlumatlar Dart-a Stream vasitəsilə ötürülür, real vaxt rejimində yenilənmələrə abunə olmağa imkan verir. Tipik istifadə nümunələri: akselerometr göstəriciləri, GPS koordinatları, Bluetooth vəziyyətinin dəyişməsi və sistem xidmətlərindən bildirişlər.

MethodChannel-dən fərqli olaraq, EventChannel nəşr-abunəlik modelindən istifadə edir. Native tərəf hadisələri Dart kodundan açıq sorğu olmadan, onlar yarandıqca göndərir. Dart tərəfində abunəçi hər bir hadisəni axının ayrıca elementində alır və interfeysdə istifadə etməzdən əvvəl alınan məlumatları filtrləyə və ya çevirə bilər.

EventChannel-dan istifadə edərkən abunəlikləri və onların ləğvini düzgün idarə etmək lazımdır. Hər bir StreamSubscription çağırışı kanalla iş bitdikdə ləğv edilməlidir ki, native tərəfdə yaddaş sızmasının qarşısı alınsın. Flutter platforması vidcet məhv edildikdə axını avtomatik ləğv edir, lakin abunəliklərin açıq idarə edilməsi uzunmüddətli ssenarilərdə tətbiqin etibarlılığını artırır.

BasicMessageChannel — sərbəst mesaj mübadiləsi

BasicMessageChannel — ixtiyari asinxron mesaj mübadiləsi üçün nəzərdə tutulmuş ən çevik Platform Channel növüdür. MethodChannel-dən fərqli olaraq, hər bir mesaj metod adı və arqumentlər ehtiva edir, BasicMessageChannel isə daxili marşrutlaşdırma olmadan yalnız faydalı yükü ötürür. Göndərən tərəf mesaj göndərir, qəbul edən tərəf onu emal edir və cavab qaytarır.

Bu kanal növü fərdi qarşılıqlı əlaqə protokolları üçün əlverişlidir, burada mesaj strukturu tətbiqin vəziyyətindən asılı olaraq dinamik dəyişə bilər. BasicMessageChannel standart olaraq StandardMessageCodec-dən istifadə edir, lakin qeyri-standart məlumat serializasiya formatları üçün ixtiyari MessageCodec-in əvəz edilməsini dəstəkləyir.

Praktikada BasicMessageChannel MethodChannel-dən daha az istifadə olunur, çünki daxili adlandırma nümunəsi olmadan mesaj marşrutlaşdırmasının əl ilə işlənməsini tələb edir. Bununla belə, MethodChannel-də tətbiq olunan standart sorğu-cavab nümunəsindən fərqli, müəyyən mesaj formatını gözləyən native kitabxanalarla inteqrasiya zamanı əvəzolunmazdır.

Platform Channel-ın tətbiqi: Dart və native platformalarda kod nümunəsi

Cihazın batareya səviyyəsinin alınması nümunəsində Platform Channel-ın praktik tətbiqini nəzərdən keçirək. Bu nümunə işin tam dövrünü göstərir: Dart tərəfində MethodChannel-ın elan edilməsi, Android və iOS-da handler-in tətbiqi, həmçinin məlumatın əlçatan olmaması və ya lazımi icazələrin olmaması zamanı xətaların düzgün idarə edilməsi.

Dart tərəfində MethodChannel

Dart tərəfində unikal sətir kanal adı ilə MethodChannel nümunəsi yaradılır. invokeMethod metodu native tərəfə sorğu göndərir və nəticəni Future şəklində gözləyir. Xətaların idarə edilməsi PlatformException-ın tutulması ilə həyata keçirilir, native tərəf sorğunun emalı zamanı istisna yaranarsa onu qaytarır.

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 tərəfində Kotlin-də emal

Android tərəfində handler MainActivity-də configureFlutterEngine metodu vasitəsilə qeydiyyatdan keçirilir. setMethodCallHandler daxilində daxil olan metodun adı yoxlanılır, batareya səviyyəsini əldə etmək üçün BatteryManager-ə native çağırış yerinə yetirilir və nəticə result obyekti vasitəsilə qaytarılır. Kanal tərəfindən dəstəklənməyən metodlar üçün result.notImplemented çağırılır.

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 tərəfində Swift-də emal

iOS platformasında handler AppDelegate sinfində FlutterMethodChannel vasitəsilə qeydiyyatdan keçirilir. Swift kodu daxil olan çağırışı qəbul edir, batareya səviyyəsini əldə etmək üçün UIDevice sistem API-nə müraciət edir və nəticəni Flutter-ə qaytarır. weak self ilə asinxron emal yaddaşda güclü istinad dövrü saxlama riski olmadan sorğuları yerinə yetirməyə imkan verir.

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 layihələrində nə vaxt zəruridir

Platform Channel Flutter tətbiqinin standart paketlərdə tətbiq olunmayan cihaz imkanlarına giriş tələb etdiyi hər bir halda zəruridir. Tərtibatçı kamera, biometriya, NFC, Bluetooth Low Energy üçün native SDK-larla inteqrasiya edərkən və ya tətbiqin sandbox-indan kənar fayl sistemi ilə işləyərkən öz kanalını yaratmalıdır.

Birinci tipik ssenari — native API-lərdən istifadə, onlara Dart-dan birbaşa giriş yoxdur. Buraya Android və iOS-un sistem xidmətləri, qeyri-standart məlumat ötürmə protokolları olan aparat sensorları, fərdi emal məntiqi ilə push bildirişləri və açarların təhlükəsiz saxlanması üçün Hardware Security Module tələb edən kriptoqrafik əməliyyatlar daxildir.

İkinci ssenari — mövcud native kodun Flutter layihəsinə inteqrasiyası. Əgər şirkət artıq Android və ya iOS üçün native kitabxana hazırlayıbsa, Platform Channel onu Dart-a port etmədən təkrar istifadə etməyə imkan verir. Bu, hibrid tətbiqlərin Flutter-ə miqrasiyasını sürətləndirir və mövcud native koda və toplanmış biznes məntiqinə qoyulmuş investisiyaları qoruyur.

Üçüncü ssenari — öz Flutter plagininin pub.dev-də nəşri. Bütün məşhur plaginlər Dart-da vahid API təqdim etmək üçün Platform Channel-dan istifadə edir, bu API pərdəarxası hər platformanın native kodunu çağırır. Bu, hər iki mobil platformanı dəstəkləyən təkrar istifadə olunan paketlər yaratmaq üçün Flutter komandası tərəfindən tövsiyə edilən standart yanaşmadır.

Öz Platform Channel-ınızı yaratmaq və pub.dev-dən hazır paket istifadə etmək arasında seçim edərkən əvvəlcə hazır həllin mövcudluğunu yoxlamaq tövsiyə olunur. camera, geolocator, shared_preferences və path_provider paketləri tipik ehtiyacların əksəriyyətini əhatə edir. Öz Platform Channel-ınız yalnız uyğun paket olmadıqda və ya mövcud həllin təmin etmədiyi dərin native davranış fərdiləşdirməsinə ehtiyac olduqda əsaslandırılır.

Tez-tez verilən suallar

Flutter-də MethodChannel EventChannel-dan nə ilə fərqlənir?

MethodChannel sorğu-cavab nümunəsini həyata keçirir, metodun bir dəfə çağırılması və nəticənin Future vasitəsilə qaytarılması ilə. EventChannel axın modelindən istifadə edir: native tərəf hadisələri yarandıqca göndərir, Dart isə onları Stream vasitəsilə qəbul edir. MethodChannel nəticənin gözlənildiyi birdəfəlik əməliyyatlar üçün, EventChannel isə real vaxtda fasiləsiz məlumat axınları üçün uyğundur.

Platform Channel vasitəsilə hansı məlumat tiplərini ötürmək olar?

Platform Channel əsas Dart tiplərini dəstəkləyir: int, double, bool, String, List və Map. Bu tiplər avtomatik olaraq StandardMethodCodec və StandardMessageCodec vasitəsilə native ekvivalentlərə serializasiya olunur. Fərdi obyektlərin ötürülməsi üçün JSON-a əl ilə serializasiya və ya qeyri-standart formatları dəstəkləyən ixtiyari MessageCodec-dən istifadə tələb olunur.

Bir tətbiqdə bir neçə Platform Channel istifadə etmək olarmı?

Bəli, Flutter bir tətbiqdə məhdudiyyətsiz sayda Platform Channel-ı dəstəkləyir. Hər bir kanal unikal sətir adı ilə identifikasiya olunur, bu ad Dart və native platforma tərəfində uyğun olmalıdır. Müxtəlif modullar üçün ayrıca kanallar yaradıla bilər: biri kamera üçün, digəri Bluetooth üçün, üçüncüsü sensorlar üçün — hamısı müstəqil işləyir və bir-birinin performansına təsir etmir.

Platform Channel vasitəsilə çağırış zamanı xətaları necə idarə etmək olar?

Dart tərəfində xətalar PlatformException vasitəsilə idarə olunur, native tərəf istisna yarandıqda onu qaytarır. try-catch bloku istisnanı tutur və xətanın koduna, mesajına və detallarına giriş təmin edir. Native tərəfdə result.error çağırışı xətanı Dart-a geri göndərir. Kanal tərəfindən dəstəklənməyən metodlar üçün result.notImplemented metodu da mövcuddur.

Platform Channel tətbiqin əsas axınını bloklayırmı?

Bəli, Platform Channel handler-i native platformanın əsas axınında icra olunur. Əgər handler uzunmüddətli əməliyyat — şəbəkə sorğusu, diskdən oxuma və ya ağır hesablamalar yerinə yetirirsə, istifadəçi interfeysi dona bilər. Ağır tapşırıqları native tərəfdə fon axınında işə salmaq və nəticəni yalnız tamamlandıqdan sonra çağırmaq tövsiyə olunur. Dart tərəfi isə invokeMethod-un asinxron təbiəti sayəsində bloklanmır.

Nəticə

  • Platform Channel — Dart kodunun Android və iOS native platformaları ilə qarşılıqlı əlaqəsi üçün əsas Flutter mexanizmi, asinxron mesaj mübadiləsinə əsaslanır.
  • MethodChannel native metodların birdəfəlik çağırışı üçün sorğu-cavab nümunəsini həyata keçirir, nəticə Future vasitəsilə qaytarılır.
  • EventChannel native tərəfdən fasiləsiz hadisələri qəbul etmək üçün Stream mexanizmi vasitəsilə axın modelindən istifadə edir.
  • BasicMessageChannel metod adları ilə daxili marşrutlaşdırma olmadan ixtiyari mesajların sərbəst asinxron mübadiləsini təmin edir.
  • Serializasiya StandardMethodCodec və StandardMessageCodec vasitəsilə əsas Dart tiplərini dəstəkləyir və fərdi obyektlər üçün əl ilə çevirmə tələb edir.
  • Performans Platform Channel əksər tapşırıqlar üçün kifayətdir: mesajın ötürülmə vaxtı 1 ms-dən azdır, lakin axın məlumatları üçün Dart FFI tövsiyə olunur.
  • Tövsiyə: öz kanalınızı yaratmamışdan əvvəl pub.dev-də hazır paketin mövcudluğunu yoxlayın — tipik native funksiyaların əksəriyyəti artıq icma tərəfindən tətbiq edilib və rəsmi plaginlər vasitəsilə əlçatandır.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et