Method Channel — nedir, çalışma özellikleri ve Flutter'da uygulaması

Yazar: IT Sectr Yayınlanma: 2026-06-03 Okuma süresi: 9 dk

Method Channel, Flutter'da Dart kodu ile iOS ve Android'in yerel tarafı arasında iki yönlü iletişim mekanizmasıdır. Flutter Documentation, 2026'ya göre Method Channel, Dart ve ana platform arasında tür belirtilmiş mesajların iletilmesini sağlar. Bu mekanizma olmadan, cihazın donanım yeteneklerine, yerel SDK'lara ve sistem çağrılarına uygulama kodundan erişmek imkansızdır.

Önemli Noktalar

  • Method Channel, Flutter'ı iOS ve Android yerel koduyla entegre etmek için ana mekanizmadır.
  • İki yönlü iletişim — Dart kodu yerel yöntemleri çağırabilir ve yerel kod Dart'a veri geri gönderebilir.
  • Asenkron — tüm çağrılar ana iş parçacığını bloke etmeden asenkron modda yürütülür.
  • Standart serileştirme — veriler, ilkel türler, listeler ve sözlükler desteğiyle JSON uyumlu formatta iletilir.
  • BasicMessageChannel — dize veya ikili mesajların akışı için alternatif kanal türü.

Method Channel nedir ve neden gereklidir

Method Channel, Dart izolatlarının iOS veya Android'deki ana uygulamayla mesaj alışverişi yaptığı Flutter platform katmanının merkezi bileşenidir. Kanalın ana görevi, iki platform arasındaki veri aktarım protokollerindeki farklılıkları gizlemek ve geliştiriciye birleşik bir API sağlamaktır.

Bir Flutter uygulamasının kameraya, Bluetooth'a, sensörlere veya başka bir yerel API'ye erişmesi gerektiğinde, Dart'tan doğrudan çağrı yapmak imkansızdır. Flutter, C++ üzerine inşa edilmiş bir motorda çalışır ve UIKit veya Android SDK çerçevelerine erişimi yoktur. Method Channel, Dart dünyası ile yerel kod dünyası arasında bir köprü oluşturarak bu sorunu çözer.

Google I/O 2024'e göre, üretimdeki Flutter uygulamalarının %80'inden fazlası, platform hizmetleriyle entegrasyon için en az bir Method Channel kullanmaktadır. Bu, modern proje mimarisinde kanalın kritik rolünü doğrulamaktadır.

Geliştirici için Method Channel, sıradan bir asenkron işlev çağrısı gibi görünür. Perde arkasında, mesajın serileştirilmesi, motor arabelleği aracılığıyla iletilmesi ve platformun ana iş parçacığında yerel kodun yürütülmesi gerçekleşir.

Method Channel nasıl çalışır

Method Channel aracılığıyla etkileşim, Dart tarafının yöntem adını ve argümanları içeren bir mesaj göndermesiyle başlar. Flutter Engine bu mesajı alır, standart StandardMethodCodec formatına dönüştürür ve BinaryMessenger aracılığıyla yerel tarafa iletir.

Yerel taraf, seri durumdan çıkarılmış çağrıyı alan ve ilgili mantığı yürüten bir işleyici — MethodCallHandler içerir. Sonuç, başarılı bir sonuç veya kod ve mesaj içeren bir hata içeren Response olarak Dart'a geri döndürülür.

Adım adım çağrı süreci

Method Channel aracılığıyla tüm çağrı döngüsü altı aşamaya ayrılabilir. Dart izolatı, bağlantıyı tanımlamak için benzersiz bir ada sahip bir kanal örneği oluşturur. invokeMethod çağrıldığında, Dart platform kodu, MethodCodec kullanarak yöntem adını ve argümanları serileştirir ve bunları StandardMessageCodec aracılığıyla ikili bir arabelleğe dönüştürür.

Flutter Engine bu arabelleği bir soket aracılığıyla yerel tarafa iletir. Yerel BinaryMessenger mesajı okur, kanalı ada göre tanımlar ve kayıtlı işleyiciyi çağırarak, ayrıştırılmış verilerle birlikte bir FlutterMethodCall nesnesi iletir. İşleyici gerekli kodu yürütür ve bir sonuç döndürür; sonuç, ters serileştirme yolundan geçerek Dart'a Future olarak ulaşır.

Method Channel mimarisi: temel bileşenler

Method Channel mimarisi, her biri veri aktarımının kendi aşamasından sorumlu olan birbirine bağlı birkaç varlıktan oluşur. Dart API, geliştiriciden serileştirme ve yönlendirmenin düşük seviyeli ayrıntılarını gizleyen MethodChannel sınıfını sağlar.

BinaryMessenger

BinaryMessenger, Dart ve ana platform arasında ikili mesajlar göndermek ve almak için Flutter Engine'ın düşük seviyeli arayüzüdür. Her MethodChannel, kanal adına göre yönlendirme sağlayan belirli bir BinaryMessenger'a bağlanır. Dart tarafında BinaryMessenger sınıfı, Android'de — io.flutter.embedding.engine paketinden BinaryMessenger, iOS'te — FlutterBinaryMessenger protokolü kullanılır.

MethodCodec ve MessageCodec

MethodCodec, yöntem çağrılarını ve dönüş değerlerini ikili formata dönüştüren bir kodlayıcıdır. Flutter, iki yerleşik uygulamayla birlikte gelir: StandardMethodCodec (varsayılan) ve JSONMethodCodec (JSON dizeleri için). StandardMethodCodec, dahili olarak StandardMessageCodec'i kullanır ve tüm temel Dart türlerini destekleyerek verileri serileştirir.

Method Channel'da veri türleri ve serileştirme

StandardMessageCodec, Dart, Kotlin ve Swift arasında uyumluluğu sağlamak için sınırlı bir veri türü kümesini destekler. Liste şunları içerir: null, bool, int, double, String, Uint8List, Int32List, Int64List, Float64List, List ve dize anahtarlarıyla Map.

Diğer tüm türler — DateTime, DTO nesneleri veya özel sınıflar — listelenen biçimlerden birine dönüştürülmelidir. En yaygın yaklaşım, karmaşık nesneleri alanlarla birlikte bir Map'e serileştirmek ve alıcı tarafta bir alan sözlüğünden yapıyı yeniden oluşturmaktır.

Kamera görüntüleri gibi büyük ikili verileri aktarmak için Flutter, MethodChannel aracılığıyla her çağrıda tam arabellek kopyalamayı önlemek amacıyla Uint8List ile BasicMessageChannel kullanılmasını önerir.

Dart TürüKotlin TürüSwift Türü
nullnullnil
boolBooleanNSNumber
intIntNSNumber
doubleDoubleNSNumber
StringStringNSString
Uint8ListByteArrayFlutterStandardTypedData
ListListArray
MapHashMapDictionary

Android'de Method Channel: Kotlin'de kurulum

Android tarafında Method Channel kurulumu, FlutterPlugin uygulayan bir sınıfta veya doğrudan MainActivity'de yapılır. İlk yaklaşım önerilir çünkü eklenti yaşam döngüsünün doğru yönetimini ve uygulamaya ekleme senaryolarıyla uyumluluğu sağlar.

Dart tarafıyla aynı ada sahip bir kanal örneği oluşturduktan sonra, setMethodCallHandler aracılığıyla bir MethodCallHandler kaydetmek gerekir. İşleyicinin içinde, geliştirici when kullanarak gelen yöntemin adını kontrol eder ve sonucu result.success aracılığıyla veya kod ve mesajla birlikte result.error aracılığıyla bir hata döndürür.

kotlin
package com.example.app

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)
        val channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
        channel.setMethodCallHandler { call, result ->
            when (call.method) {
                "getBatteryLevel" -> {
                    val batteryLevel = getBatteryLevel()
                    if (batteryLevel != null) {
                        result.success(batteryLevel)
                    } else {
                        result.error("UNAVAILABLE", "Battery not available", null)
                    }
                }
                else -> result.notImplemented()
            }
        }
    }
}

Bu örnekte, samples.flutter.dev/battery adlı kanal getBatteryLevel çağrısını işler, Android BatteryManager aracılığıyla pil seviyesini alır ve Dart koduna döndürür. Kanal adı her iki tarafta da eşleşmelidir, aksi takdirde mesaj işleyiciye ulaşmaz.

FlutterPlugin aracılığıyla eklenti oluşturma

Üretim kodu için, Method Channel mantığını FlutterPlugin uygulayan ayrı bir sınıfta izole etmek önerilir. Bu, eklentinin projeler arasında yeniden kullanılmasını sağlar ve onDetachedFromEngine çağrıldığında kaynakların doğru şekilde temizlenmesini garanti eder. Eklenti registerWith aracılığıyla kaydedilir ve Activity'den bağımsız olarak test edilebilir.

iOS'te Method Channel: Swift'te kurulum

iOS'te Method Channel, FlutterPlugin protokolünü uygulayan bir sınıfta veya AppDelegate'te yapılandırılır. Önerilen yaklaşım, FlutterPluginRegistrar aracılığıyla kaydedilen ve Flutter Engine tarafından yönetilen ayrı bir eklenti sınıfı oluşturmaktır.

Dart tarafı bir çağrı gönderir ve yerel işleyici, yöntem adı ve argümanlarıyla birlikte bir FlutterMethodCall nesnesi alır. Geliştirici, call.method üzerinde switch aracılığıyla çağrılan yöntemi belirler ve sonucu result closure'ı aracılığıyla döndürür. iOS API'lerine erişmek için UIKit ve diğer sistem çerçeveleri kullanılır.

swift
import Flutter
import UIKit

public class BatteryPlugin: NSObject, FlutterPlugin {
    public static func register(with registrar: FlutterPluginRegistrar) {
        let channel = FlutterMethodChannel(
            name: "samples.flutter.dev/battery",
            binaryMessenger: registrar.messenger())
        let instance = BatteryPlugin()
        registrar.addMethodCallDelegate(instance, channel: channel)
    }

    public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
        switch call.method {
        case "getBatteryLevel":
            let device = UIDevice.current
            device.isBatteryMonitoringEnabled = true
            let level = Int(device.batteryLevel * 100)
            result(level)
        default:
            result(FlutterMethodNotImplemented)
        }
    }
}

FlutterPlugin yaklaşımı, Flutter Engine yok edildiğinde eklentinin doğru şekilde kaydedilmesini ve devre dışı bırakılmasını sağlar. Swift işleyicisinde, call.method üzerinde switch kullanılır, her durum result closure'ı aracılığıyla bir sonuç döndürür. Argümanlara call.arguments aracılığıyla uygun türe dönüştürme yapılarak erişilebilir.

Method Channel en iyi uygulamaları ve yaygın hatalar

Method Channel ile çalışırken, uygulama performansını ve kararlılığını sağlamak için birkaç önemli kurala uymak önemlidir. Ana öneri, özellikle animasyon döngülerinde veya yüksek frekansta yapılan çağrılarda, aktarılan veri miktarını ve hacmini en aza indirmektir.

Hata yönetimi

Yerel tarafta, her zaman istisnaları işlemek ve insan tarafından okunabilir bir mesajla birlikte result.error aracılığıyla bir hata döndürmek gerekir. Dart tarafında, PlatformException'ı yakalamak için her invokeMethod çağrısı try-catch ile sarılmalıdır. Hataları görmezden gelmek, net bir sebep olmadan beklenmeyen uygulama çökmelerine yol açabilir.

İş parçacığı izolasyonu

Varsayılan olarak, Method Channel yerel kodu platformun ana iş parçacığında yürütür. İşleyici ağır bir işlem gerçekleştiriyorsa, Android'de Kotlin Coroutines veya iOS'te Grand Central Dispatch kullanılarak yürütme bir arka plan iş parçacığına taşınmalıdır. Sonuç, yalnızca ana iş parçacığındaki iş tamamlandıktan sonra result aracılığıyla döndürülmelidir.

Kanal adlandırma

Ters domain notasyonu kullanarak kanallar için benzersiz adlar seçin — örneğin, com.example.app/feature. Kısa adlar diğer eklentilerle çakışabilir. Flutter kanalları küresel olarak kaydeder, bu nedenle farklı eklentilerde aynı adların kullanılması işleyicinin üzerine yazılmasına ve bozuk çağrılara yol açar.

Sıkça sorulan sorular

MethodChannel ve BasicMessageChannel arasındaki fark nedir?

MethodChannel, MethodCodec aracılığıyla kodlama ile istek-yanıt deseninde yöntem çağırmak için tasarlanmıştır. BasicMessageChannel, yöntem ve argüman formatı olmadan rastgele mesajlar gönderir; bu, akış verileri ve platformdan gelen olaylar için uygundur.

Method Channel aracılığıyla özel nesneler iletilebilir mi?

Doğrudan — hayır. StandardMessageCodec yalnızca temel türleri destekler: ilkel türler, String, Uint8List, List ve Map. Özel nesneler, göndermeden önce manuel olarak bir Map'e serileştirilmeli ve alıcı tarafta bir alan sözlüğünden yeniden oluşturulmalıdır.

Method Channel çağrılırken hatalar nasıl yönetilir?

Yerel tarafta, bir hata kodu ve mesajla birlikte result.error kullanın. Dart tarafında, invokeMethod'u try-catch ile sarın ve PlatformException'ı yakalayın. Yöntem platformda uygulanmadıysa, result.notImplemented döndürün.

Method Channel performansı etkiler mi?

Her çağrı, izolatlar ve platformlar arasında serileştirme ve veri kopyalama gerçekleştirir. Seyrek çağrılar için ek yük ihmal edilebilir düzeydedir. Kare başına megabaytlarca veri aktarılırken, gecikmeler ve FPS düşüşü meydana gelebilir. Akış verileri için platform görünümleri veya doku oluşturma nesneleri kullanın.

Dart'tan çağrı yapmadan platformdan Dart'a olay nasıl gönderilir?

EventChannel kullanın — yerel taraftan Dart'a olay akışı yapmak için tasarlanmıştır. Platform, EventSink aracılığıyla göndermeyi başlatır ve Dart, receiveBroadcastStream kullanarak akışa abone olur. Method Channel bu senaryo için uygun değildir.

Özet

  • Method Channel, Dart ile iOS ve Android yerel kodu arasında iki yönlü asenkron iletişim için birincil Flutter platform entegrasyon mekanizmasıdır.
  • Mimari, birlikte serileştirme, yönlendirme ve çağrı yürütmeyi yöneten BinaryMessenger, MethodCodec ve MethodCallHandler'ı içerir.
  • Veri türleri StandardMessageCodec kümesiyle sınırlıdır: ilkel türler, dizeler, listeler, sözlükler ve tür belirtilmiş arabellekler.
  • Kurulum Android'de Kotlin'de MethodChannel ile FlutterPlugin aracılığıyla, iOS'te Swift'te FlutterMethodChannel ile FlutterPlugin aracılığıyla yapılır.
  • Performans, aktarılan veri boyutunun en aza indirilmesini ve akış olayları için EventChannel kullanılmasını gerektirir.
  • Hatalar, platformda result.error aracılığıyla ve Dart tarafında PlatformException'ı yakalayarak yönetilir.
  • FlutterPlugin ile eklenti mimarisi, doğru yaşam döngüsü yönetimini sağladığı için Activity'deki doğrudan koda tercih edilir.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış