Flutter, UI ve is mantiginin büyük bolumunu Dart ile yazsa da gerçek cihaz yeteneklerine erismek icin platform channel koprusune ihtiyaç duyar. Kamera HAL'i, push notification token'i, OEM'e özel SDK'lar veya performans kritik native kod bu kanal uzerinden cagrilir. Yanlış tasarlanmis channel katmanı crash, ANR ve sürdürülebilirlik sorunlarina yol acar.
MethodChannel temelleri
MethodChannel, adlandirilmis bir kanal uzerinden async mesajlasma sağlar. Dart tarafinda invokeMethod, native tarafta setMethodCallHandler ile karsilanir. Kanal adi benzersiz olmalidir; paket adi + özellik on eki kullanmak catismayi onler: com.sirket.app/biometrics.
class BatteryBridge {
static const _channel = MethodChannel('com.example.app/battery');
Future<int> level() async {
final result = await _channel.invokeMethod<int>('getBatteryLevel');
return result ?? -1;
}
}
Veri tipleri ve serilestirme
Platform channel yalnizca desteklenen tipleri tasir: null, bool, int, double, String, Uint8List, List ve Map. Karmaşık nesneler JSON Map'e donusturulmelidir. Büyük binary veri icin MethodChannel yerine BasicMessageChannel veya dosya tabanli paylaşım dusunun.
Android tarafinda implementasyon
Kotlin'de FlutterEngine uzerinden veya FlutterPlugin arayüzü ile kanal kaydedilir. UI thread dışında agir is yapiliyorsa coroutine veya executor kullanın; sonucu main thread'de result.success ile donun. result.notImplemented(), eslesmeyen metodlar icin açık sinyal verir.
- Activity lifecycle'a bağlı islemlerde
ActivityAwareplugin kullanın. - Permission isteklerini Activity context ile yapin.
- ProGuard/R8 kurallarinda plugin siniflarini koruyun.
- Background isolate'ten channel cagirmayin; main isolate uzerinden proxy kullanın.
iOS tarafinda implementasyon
Swift'te FlutterPlugin protokolu tercih edilir. Main thread gereksinimleri UIKit cagrilarinda kritiktir. Objective-C legacy SDK entegrasyonunda bridging header ve weak linking dikkat gerektirir. App Store review'da private API kullanimindan kacinın; channel yalnizca resmi framework'leri sarmlasin.
EventChannel ve akis verisi
Sürekli sensor okumasi, indirme ilerlemesi veya Bluetooth tarama gibi akislar icin EventChannel uygundur. Dart tarafinda receiveBroadcastStream(), native tarafta EventSink ile olay yayinlanir. Stream iptal edildiginde native kaynaklari serbest birakin; aksi halde bellek sizintisi olusur.
Backpressure ve frekans
Her accelerometer okumasini channel'dan gecirmek UI thread'i bogabilir. Native tarafta ornekleme veya esik filtreleme uygulayin; Dart tarafinda Stream transform ile debounce kullanın.
Pigeon ile tip güvenliği
Manuel Map serilestirme hataya açıktır. pigeon paketi Dart, Kotlin ve Swift arasinda otomatik mesaj siniflari üretir. Büyük ekiplerde API sozlesmesi netlesir ve refactor güvenli hale gelir. CI'da pigeon codegen calistirmak drift'i onler.
FFI alternatifi
C/C++ kutuphaneleri veya yüksek frekansli hesaplama icin dart:ffi düşük gecikme sağlar. Platform channel marshalling maliyeti yoktur; fakat bellek güvenliği ve çoklu platform derlemesi gelistiriciden daha fazla uzmanlik ister. FFmpeg, OpenCV gibi native stack'ler icin mantiklidir.
Hata yönetimi ve sözleşme
Native hatalari PlatformException ile code, message ve details alanlarina mapleyin. Dart tarafinda anlamli exception siniflarina donusturun. Timeout ve iptal senaryolarini test edin; kullanıcı ekrandan ciktiginda devam eden native işlem abort edilmelidir.
- Kanal metodlarini dokumante edin (girdi, çıktı, thread).
- Semantik versiyonlama: breaking native degisiklikte kanal adina sürüm ekleyin.
- Integration testte gerçek cihazda smoke test calistirin.
- Mock platform icin
TestDefaultBinaryMessengerBindingkullanın.
Güvenlik ve gizlilik
Channel uzerinden tasınan PII veriyi loglamayin. Android'de intent extra, iOS'ta keychain erisimi güvenli depolama icin native tarafta kalmalı; Dart'a yalnizca gerekli token verilmelidir. Jailbreak/root tespiti gibi kontroller native yapilip sonuç boolean dondurulebilir.
Federated plugin mimarisi
plugin_platform_interface ile arayüz Dart'ta tanimlanir, Android/iOS/macOS/web ayri paketlerde implement edilir. Bu yapı, ekip icinde paralel gelistirmeyi ve mock platform testlerini kolaylastirir. Kendi şirket icin SDK sarmalarken federated yapı uzun vadede bakimi azaltir.
BinaryMessenger ve mesaj dongusu
Platform channel'in altinda BinaryMessenger standard message codec ile çalışır. Dart ve native taraf ayni kanal adinda bulusmazsa sessiz hata yerine MissingPluginException alinir. Hot restart sonrasi plugin kaydinin tekrarlandigindan emin olun; add-to-app modulunde engine yeniden baslatildiginda handler'lar sifirlanabilir.
Main isolate kurali
MethodChannel cagrilari varsayilan olarak UI isolate uzerinden yapilmalidir. Compute isolate veya arka plan isinde native UI guncellemesi gerekiyorsa sonuç main isolate'e IsolateNameServer veya port ile tasinin. Android'de UI thread dışında View mutasyonu crash üretir.
BasicMessageChannel ve custom codec
Standart method invoke dışında sürekli karsilikli mesajlasma icin BasicMessageChannel kullanılır. Custom MessageCodec ile protobuf veya msgpack tasiyabilirsiniz; ancak debug kolayligi icin JSON genellikle yeterlidir. Codec uyumsuzlugunda garbled veri alinir; versiyon alanini payload basina ekleyin.
Platform channel, Flutter'in hibrit gucunu aciga cikaran mekanizmadir; ancak her sorunu channel ile cozmeye calismayin. Once pub.dev'de olgun plugin arayin, yoksa Pigeon ile tip güvenli sözleşme yazin, agir isleri doğru thread'de tutun ve stream kaynaklarini lifecycle'a baglayin. Bu disiplin ile native entegrasyon uretimde güvenilir kalir.
Add-to-app senaryolarinda mevcut native uygulamaya Flutter modulu gomuluyorsa channel kaydi her iki tarafta da engine baslatma sirasina baglidir. FlutterEngineCache ile on-isitma yapmak ilk channel cagrisindaki gecikmeyi azaltir.
Desktop ve embedded hedeflerde (Windows, Linux, embedded Linux) channel implementasyonu farklı API kullanır; cross-platform plugin yazarken her hedef icin conditional export planlayin.
Web'de dart:js_interop ve package:web ile benzer kopru kurulur; MethodChannel web'de yoktur. Cok platformlu paket yazarken bu ayrimi dokumante edin.
Unit testte platform channel mock'lamak icin ServicesBinding uzerinden BinaryMessenger handler kaydedin; boylece gerçek cihaz olmadan Dart mantigi test edilir.
Performans ölçümü: channel round-trip latency'yi profile modda olcun; saniyede yuzlerce küçük çağrı yerine batch API tasarlamak CPU ve pil omrunu korur.
Texture ve PlatformView entegrasyonu (harita, WebView) channel'dan farklı bir yol kullanır; hybrid composition modlari Android'de performans etkiler. Dokumantasyondaki PlatformViewLink orneklerini kendi cihaz matrisinizde test edin.
Native modül ile versiyon uyumsuzlugunda graceful degradation tasarlayin: Dart tarafinda capability probe metodu cagirarak ozelligin mevcut olup olmadigini kontrol edin, yoksa alternatif UI gosterin.
Crash raporlama araclarina (Firebase Crashlytics, Sentry) native channel exception'larini anlamli etiketlerle gonderin; stack trace tek basina yeterli degildir, kanal adi ve metod adi context'e eklenmelidir.
Plugin geliştirirken example uygulamasini gerçek cihazda sürekli calistirmak emulator'de gorulmeyen izin ve lifecycle bug'larini erken aciga cikarir.
Native SDK guncellemelerinde breaking API degisikligi olduğunda Flutter paket surumunu semver major ile artirin; Dart tarafinda deprecated metod icin geçiş suresi tanimlayin.
Bluetooth ve NFC gibi uzun suren native oturumlar EventChannel ile yonetildiginde uygulama arka plana alindiginda stream'i pause edin; iOS/Android arka plan kisitlari farklidir.
Channel metod sayisini sinirli tutun; onlarca ince metod yerine command pattern ile tek invokeMethod ve action parametresi bakimi kolaylastirir.
Dart 3 pattern matching ile platform cevaplarini switch expression ile ayristirmak okunabilirligi artirir; bilinmeyen action icin exhaustive olmayan dal crash yerine kontrollu hata üretir.
Entegrasyon testlerinde gerçek kanal yerine fake handler kullanmak hızlı geri bildirim sağlar; CI pipeline'ina en az bir native instrumented test job'u eklemek regresyonlari azaltir.
Kanal tasarımını ekip wiki'sinde sequence diagram ile belgeleyin; yeni gelen geliştirici hangi thread'de ne cagrildigini tek bakista gorsun.