Flutter | Native Android Kodu Çalıştırmak (Platform Channel)

Samed Harman
CNK Tech
Published in
3 min readMay 3, 2021

--

Flutter’da proje geliştirirken Flutter kanadında bulunmayan ve platforma özgü olan kütüphane/apiler ile çalışma gereği duyulabilir. Flutter ise ister Android (Kotlin/Java) tarafında olsun ister İOS (Swift/Objective-C) olsun platforma özgü olan apileri çağırabilmemize olanak tanır.

Peki , nasıl çalışıyor?

https://flutter.dev/images/PlatformChannels.png

İstemci tarafında oluşturduğumuz MethodChannel nesnesine platform tarafında çalıştırmak istediğimiz metotların ismini geçerek çağrıları gerçekleştirebiliyoruz.

Ardından host edilen taraftan Flutter client tarafına bir yanıt dönüyor ve çağrı tamamlanıyor.

Şimdi isterseniz bir Flutter projesi oluşturup Android tarafında bir notification servisini nasıl çağırabiliriz onu görelim. Android tarafında Kotlin kodu yazacağımız için projeyi Android Studio kullanarak oluşturmak bizim için daha kullanışlı olacaktır.

Flutter kısmında temel iskeleti yazdıktan sonra sabit bir MethodChannel nesnesi oluşturalım ve ona bir name parametresi geçelim. Bu parametre bizim için önemli çünkü native taraftaki iletişimi sağlamak için bu ismi kullanacağız.

static const platformChannel = MethodChannel('notification');

ardından arayüzümüzdeki iki adet buton için aşağıdaki metotları yazalım. Metotlarda gördüğünüz invodeMethod() ile çağrılarımızı gerçekleştiriyoruz. Bu metota verdiğimiz String türündeki parametre native kısımda yazacağımız fonksiyonun ismi ile eşleşmelidir.

showNotification() async {
var response =
await MyHome.platformChannel.invokeMethod('showNotification');
setState(() {
_response = response;
});
}

removeNotification() async {
var response =
await MyHome.platformChannel.invokeMethod('removeNotification');
setState(() {
_response = response;
});
}

Flutter tarafındaki işimiz bu kadar :). Gelelim şimdi Android’e. Android kısmında rahat kod yazabilmek adına Android Studio’da Flutter proje klasörü yapısında android/build.gradle dosyasını açıp sağ üstten “Open for Editing Android Studio” diyerek projeyi ayrı bir Android projesi olarak açıyoruz.

FlutterActivity sınıfından türemiş MainAcitivity sınıfı sizi karşılayacaktır. Client tarafında gönderdiğimiz çağrıları handle etmek için bu tarafta MethodChannel sınıfının setMethodCallHandler callback’ini çağrıyoruz. Gelen çağrıları client tarafında verdiğimiz metot isimleri ile eşleşiyor mu diye kontrol ediyor ve ona göre işlemlerimizi yönetiyoruz. Burada dikkat edilmesi gereken husus MethodChannel sınıfına geçilen ‘name’ parametresi. Bu parametre Flutter tarafında verdiğimiz MethodChannel parametresi ile aynı olmalı.

private val CHANNEL = "notification"MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
if (call.method == "showNotification") {
showNotification()
result.success("Service is started !")
}
if(call.method == "removeNotification"){
removeNotification()
result.success("Notification removed !")
}
}
}

Bundan sonra geri kalan kısım ise showNotification ve removeNotification metotlarını yazmak. Yani native android kodu kısaca. Notification gösterme ve kaldırma işlemi için gerekli kodları da şu şekilde yazabiliriz:

private fun showNotification() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val builder = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Native Notification")
.setContentText("Flutter notification with platform channel.")
.setSmallIcon(R.mipmap.ic_launcher)
.setPriority(NotificationCompat.PRIORITY_DEFAULT)

val notificationChannel = NotificationChannel(CHANNEL_ID, "name", NotificationManager.IMPORTANCE_DEFAULT)

val notificationManager: NotificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(notificationChannel)

with(NotificationManagerCompat.from(this)) {
notify(not_id, builder.build())
}
}
}

private fun removeNotification(){
val notificationManager: NotificationManager =
getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.cancel(not_id)
}

Ve uygulamamızı test edelim :). Native tarafta yazılan kodların derlenmesi için uygulamayı kapatıp açmanız gerekebilir.

Çalışıyor gibi ha 😁.

Arayüz kodları da dahil projeyi aşağıdaki repodan inceleyebilirsiniz. Geri dönüşleriniz , gördüğünüz hatalar , önerileriniz olursa lütfen çekinmeyin. Bana linkedIn üzerinden ulaşabilirsiniz. Başka yazılarda görüşmek üzere 🎈.

Bol Flutter’lı günler 💙.

Referanslar:

https://developer.android.com/training/notify-user/build-notification

--

--

Samed Harman
CNK Tech

Flutter/Android Mobile App Developer | Computer Engineer