Flutter Platform Kanalında Veri Türü Dönüşüm Hataları
Flutter uygulaması ile Android ya da iOS'un native kodunu çağırırken, iki taraf arasında geçen veriler belli bir format bekler. Türü yanlış gönderirsen çöküş ya da sessiz hata yaşarsın. Burada yaygın dönüşüm sorunlarını ve çözümlerini adım adım göreceğiz.
Flutter (Dart) ile native kod (Kotlin/Swift) arasında harita, liste ya da sayı gönderirken, her taraf kendi türlerini kullanır. Örneğin Dart'ta bir harita gönderirken, karşı taraf onu doğru okuyamayabilir. Tersine, native'den gelen bir tam sayı Dart'ta yanlış tipe dönüştürülürse uygulamada çöküş oluşur.
Flutter'da platform kanalı tanımlarken, gönderilecek veri türünü açık yaz.
1const platform = MethodChannel('com.example.app/data');23Future<void> sendData() async {4try {5final result = await platform.invokeMethod(6'getData',7{'userId': 42, 'name': 'Ahmet', 'active': true},8);9print('Sonuç: $result');10} catch (e) {11print('Hata: ${e.message}');12}13}Burada harita içinde tam sayı (42), metin ('Ahmet') ve boolean (true) gönderiliyor. Native taraf bunları doğru okumalı.
Android'de, Dart'tan gelen veri bir Map olarak gelir. Türü kontrol etmeden erişirsen çöküş oluşur.
1val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, "com.example.app/data")2channel.setMethodCallHandler { call, result ->3if (call.method == "getData") {4// HATA: Doğrudan erişim5// val userId = call.argument<Int>("userId") // Çöküş riski67// DOĞRU: Tür kontrolü ve güvenli erişim8try {9val args = call.arguments as? Map<String, Any>?: return@setMethodCallHandler10val userId = (args["userId"] as? Number)?.toInt()?: 011val name = args["name"] as? String?: ""12val active = args["active"] as? Boolean?: false1314Log.d("Platform", "Gelen veri: $userId, $name, $active")15result.success("Başarılı: $userId")16} catch (e: Exception) {17result.error("TYPE_ERROR", "Veri türü uyumsuz", null)18}19}20}Anahtar nokta: as? ile güvenli tür dönüşümü yap; başarısız olursa null dön ve varsayılan değer kullan.
Native'den Dart'a dönen veri da uyumlu olmalı. Örneğin liste dönerken:
1// Kotlin'de2result.success(listOf(1, 2, 3, "dört")) // Karışık tip - sorun!3result.success(mapOf("count" to 10, "message" to "tamam")) // Doğru45// Dart'ta al6final response = await platform.invokeMethod('getData');7if (response is Map) {8final count = response['count'] as int?;9final message = response['message'] as String?;10}Hata 1: Dart'ta int gönder, Kotlin'de Long bekle (args["value"] as? Number)?.toLong() kullan.
Hata 2: Null değer gönder, karşı taraf null kontrolü yapma Her zaman ?: defaultValue ekle.
Hata 3: İç içe harita gönder, alıcı düz yapı bekle Veri şemasını önceden anlaş ve dokümante et.
Platform kanallarında türü açık tutmak, hataları erken yakalar ve uygulamanın çökmesini engeller.
0 yorum