Platform Kanalları: Native Kodda Yaptığım 3 Kritik Hata
Platform kanalları (platform channels) Flutter ve React Native'de native kodla iletişim kurmak için vazgeçilmez. Ama ilk kez kullananlar, ve ben de dahil, sistemi yanlış anladığı için sıkça başarısız oluruz.
Ben bu hatalardan üçünü canlı projelerde öğrendim. Bunları açıklamak istiyorum çünkü dokümantasyon her zaman net değil.
Birinci hata: Thread güvenliğini görmezden gelmek
Flutter'dan native koda bir istek gönderirsin, native taraf cevap verir. Ama native kodu, özellikle Android'de, ana thread dışında çalışıyorsa ve UI güncellemesi yapıyorsa çöker. iOS'ta benzer sorun var ama daha sessiz ilerliyor; uygulamanız donmuş görünüyor.
İlk projemde bir sensör verisi okuyordum. Native taraf arka thread'de veriyi işliyor, Platform Channel üzerinden Flutter'a gönderiyordu. Hiçbir hata almadım ama UI'da veri güncellenmiyordu. Sebep: native tarafta Main/UI thread'e dönüş yapmamıştım. Android'de `Handler(Looper.getMainLooper()).post()` veya iOS'ta `DispatchQueue.main.async` kullanmak gerekiyor.
İkinci hata: Veri tipi dönüşümünde varsayımlı olmak
Flutter'dan native'e bir integer gönderiyor, native taraf onu double olarak alıyor. Veya tam tersi. Platform Channel'ler tip güvenli değil; `Map` veya `List` gönderirsin, karşı taraf hangi tipin ne olduğunu bilmek zorundadır.
Bir finans uygulamasında bu hata parasal hesaplamalarda yanlış sonuç verdi. Flutter'dan gönderdiğim `int` tutarı, native taraf `double` olarak işliyordu. Küçük fark gibi görünse de milyonlarca işlemde birikmesi ciddi sorun yaratıyor.
Her iki tarafta da açık bir "sözleşme" yazmalısın. Gönderilen veri yapısını JSON şeması gibi dokümante et ve kontrol et.
Üçüncü hata: Lifecycle ve memory leak
Platform Channel'i açıp kapatmayı düzgün yönetmemek. Özellikle long-lived channel'ler (arka planda veri akışı yapanlar) için. Bir widget destroy olduğunda channel'i temizlemezsen, native tarafta listener kalıyor, bellek sızıyor.
Flutter'da `dispose()` metodunda channel'i kapatmalısın. Android native tarafında da `onDestroy()` veya ilgili lifecycle callback'te temizlik yapmalısın. iOS'ta ViewController dismiss olduğunda channel reference'ları serbest bırakmalısın.
Bu hata belki ilk gün görünmüyor. Ama uygulama bir hafta açık kaldığında, bellekle ilgili sorunlar başlıyor.
Sonuç
Platform Channel'ler güçlü ama ihmal edilebilir. Thread güvenliği, veri kontratı ve lifecycle yönetimi olmadan, başarısız uygulamalar yazarsın. Bu üç noktayı baştan tasarlarsan, cross-platform native iletişim sorunsuz çalışır.
0 yorum