Flutter17 Mart 2024

Flutter'da Swift ve Kotlin ile Native Kod Bağlantısı

MethodChannel kullanarak Flutter ile platform native kodları arasında köprü kurma.

Merhaba. Bu yazımda Flutter ile geliştirdiğimiz uygulamamıza Kotlin&Swift tarafında yazılan kodları çalıştırabilmeyi en temel seviyede inceleyeceğiz.

FLUTTER

dart
static const platform = MethodChannel('cagatay.test.native');

Native taraf ile iletişim kurmak için MethodChannel kullanırız. Burada platform adında bir MethodChannel nesnesi oluşturuyoruz ve bu kanal adına ben ‘cagatay.test.native’ adını verdim. Siz dilediğiniz ismi verebilirsiniz ancak benzersiz bir isim olması gerekmektedir.

dart
Future<void> getNativeText() async {
    try {
      final result = await platform.invokeMethod('getTextNative');
      text = result;
    } catch (e) {
      text = 'Failed to Native code catch -->$e';
    }

    setState(() {});
  }

getNativeText adında bir fonksiyon oluşturuyorum. platform.invokeMethod(‘getTextNative’) MethodChannel üzerinden belirli bir metodun çağrılmasını sağlar. invokeMethod parametresi, çağrılacak olan methodun adını belirtir. Ben getTextNative adında bir method adı belirledim.

Burada önemli olan 2 nokta var.
1) MethodChannel(‘cagatay.test.native‘)
2) invokeMethod(‘getTextNative‘)

Bu iki isimlendirmenin de Swift ve Kotlin tarafında karşılıklarının birebir aynı olması gerekmektedir.

SWIFT

swift
let controller : FlutterViewController = window?.rootViewController as! FlutterViewController
      let methodChannel = FlutterMethodChannel(name: "cagatay.test.native",
                                                binaryMessenger: controller.binaryMessenger)
      methodChannel.setMethodCallHandler({
            (call: FlutterMethodCall, result: @escaping FlutterResult) -> Void in
          switch call.method {
          case "getTextNative":
              result("This is Swift Code")
          default:
              result(FlutterMethodNotImplemented)
          }   
       })

İlk satırda FlutterViewController’dan bir controller oluşturuluyor. Bu controller Flutter uygulamasının view controller’ını temsil eder.

İkinci satırda FlutterMethodChannel adında bir nesne oluşturuluyor ve buradaki name karşılığı Flutter tarafındaki MethodChannel ile aynı olmak zorundadır. Bu platformlar arasında iletişim için kullanılacak olan kanalımızın adını temsil eder. binaryMessenger ise bu kanalın mesajlarını yönlendirecek olan messenger’ı belirtmektedir. Burada controller.binaryMessenger kullanarak FlutterViwController‘ın binaryMessenger‘ı atanmış olur.

Daha sonra setMethodCallHandler çalıştırırız. Bu, MethodChannel üzerinden çağırılan metodları işlemek için bir handler tanımlar.

call.method ==’getTextNative’ olduğu durumda döndürmek istediğimiz değeri belirtiriz. Buradaki isimlendirme de Flutter tarafındaki invokeMethod ile aynı olmak zorundadır.

KOTLIN

kotlin
private val CHANNEL = "cagatay.test.native"
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine){
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler{
            call,result->
            if(call.method=="getTextNative"){

                result.success("This is Kotlin code")
            }else {
                result.notImplemented()
              }
        }
    }

cagatay.test.native‘ adında bir sabit CHANNEL değişkeni oluşturuyorum. Bu, Flutter tarafındaki MethodChannel ile aynı olmak zorundadır.

configureFlutterEngine fonksiyonu, FlutterEngine yapılandırılması için kullanılır.

4. satırda MethodChannel nesnesi, Flutter ile platform arasındaki iletişimi sağlayan kanalı temsil eder. Mesajları iletmek için flutterEngine.dartExecutor.binaryMessenger ile FlutterEngine’in dartExecutor’ı üzerindeki binaryMessenger kullanılır. Flutter tarafından gönderilen mesajların Kotlin tarafında işlenmesini sağlar.

setMethodCallHandler, MethodChannel üzerinden çağrılan metodları işlemek için bir handler tanımlar.

getTextNative adında bir metod çağrılırsa This is Kotlin code satırını çalıştırır.

Flutter ile Native tarafıyla haberleşmek temelde bu kadar. Native tarafından yapmanız gereken şeyleri yapıp belirlediğiniz kanal aracılığıyla Flutter tarafında kullanabilirsiniz. İyi çalışmalar dilerim.