Android Jetpack Navigation Component #2 Fragmentler Arası Veri Taşıma İşlemleri
Tags: navigationcomponent, safeargs, data, jetpack
Published: 2022-06-22 11:52:51

---
title: Android Jetpack Navigation Component #2 Fragmentler Arası Veri Taşıma İşlemleri
published: true
date: 2022-22-06 12:50:28 UTC
tags: navigationcomponent,safeargs,data,jetpack
canonical_url: 
---

![](https://cdn-images-1.medium.com/max/1024/1*u_EjKe1NGd7acnTO74lk7w.png)

Bir önceki yazımı okumadıysanız lütfen okuduktan sonra bu yazıyı okuyun. Okumamanız halinde bu yazıdakileri anlayamayabilirsiniz.

[Navigation Architecture Component #1 Ekranlar Arası Geçiş İşlemleri](https://medium.com/@cengiz.toru/navigation-architecture-component-1-ekranlar-aras%C4%B1-ge%C3%A7i%C5%9F-i%CC%87%C5%9Flemleri-59937bdb7703)

Ekranlar arası geçiş yaparken sıklıkla veri taşıma ihtiyacımız olur. Bu yazıda Navigation Component ile ekranlar arasında nasıl veri taşıyabileceğimizi anlatmaya çalışacağım. Keyifli okumalar.

> Öncelikle şunu belirtmek istiyorum. Veri taşımanın en hızlısı, en hafifi, kısacası best-practise yöntemi bundle ile taşımaktır. Primitive tipteki veriler direk o verinin tipindeki fonksiyon yardımıyla bundle’a eklenerek taşınabilir. Obje taşırken de modeli parcelable dizayn ederek bundle’ın parcelable fonksiyonu yardımıyla bundle’a eklenerek taşınabilir.

> Google ekranlar arası veri taşırken büyük verilerin taşınmamasını, veriye ait bir id / key değerinin taşınmasının önermektedir. Çünkü Android’de kayıt edilen veriler için toplam alan sınırlıdır.

Büyük veriler taşımak için [buraya](https://developer.android.com/topic/libraries/architecture/viewmodel)göz atabilirsiniz.

Bu kadarcık teoriden sonra artık kodlama kısmına geçebiliriz 💻.

### PRIMITIVE TİPTEKİ VERİLERİ GEÇİŞ ESNASINDA TAŞIMA

Öncelikle NavigationGraph’ta verilerin taşınacağı ekrana taşınacak verileri tanımlamamız lazım.

{% gist https://gist.github.com/cengiztoru/97d195573d38d73eb21d0926e8e19c9d %}

Navigation Graph dosyamızın içinde Fragmente gönderilecek veriler yukarıdaki gibi argument tagleri arasında tanımlanabilir. Gerekmesi halinde argumentin nullable olma durumuda _app:nullable=”true veya false”_ şeklinde eklenebilir.

Şimdi de verileri ilgili ekrana nasıl gönderebileceğimize bakalım.

{% gist https://gist.github.com/cengiztoru/b6ef33e738d15599e436df0fd6a50dda %}

Primitive tipteki verileri yukarıdaki koddaki gibi gönderebiliriz. Öncelikle bir bundle nesnesi oluşturuyoruz. Ardından verilerimizi bundle nesnesinin verimizin tipi ile aynı olan fonksiyonu yardımıyla bundle nesnesine ekliyoruz. Bir önceki yazıda ekranlar arası geçiş yapmayı öğrenmiştik. Ekranlar arası geçiş yaparken navigate fonksiyonuna bundle nesnesini 2. parametre olarak vererek verilerimizi taşıyabiliriz.

Son olarak ilgili ekrana taşınanan verileri nasıl yakalayacağımıza bakalım.

{% gist https://gist.github.com/cengiztoru/87d5d5040bded4fcfc41077e51d0f078 %}

Verilerimizi onCreate metodunda yukarıdaki şekilde elde edebiliriz.

### GEÇİŞ ESNASINDA NESNELERİ TAŞIMA

Öncelikle modelimizi Parcelable olacak şekilde hazırlayalım.

{% gist https://gist.github.com/cengiztoru/5abc5fcbd8ccc7ef493b4ead9a2f19ae %}

Daha sonra veri göndereceğimiz ekrana modelimiz için bir argument ekleyelim.

{% gist https://gist.github.com/cengiztoru/6c70504661cb9ddf0b5510d796cea7d7 %}

Burada argType olarak modelimizin tam yolunu vermeye dikkat edelim.

Daha sonra bu ekrana verilerimizi navigate fonksiyonu ile gönderelim.

{% gist https://gist.github.com/cengiztoru/71aa8cdd6fc3387eede7b42dd7110217 %}

Öncelikle bir bundle nesnesi oluşturuyoruz. Daha sonra bundle nesnesinin putParcelable fonksiyonuna verimizi ekliyoruz. Son olarak bundle nesnemizi navigation controller nesnemizin navigate fonksiyonuna 2. parametre olarak veriyoruz. Bu şekilde (nesne olan) verimizi ilgili ekrana gönderebiliriz.

Şimdi ilgili ekranda gelen veriyi nasıl yakalayabileceğimize bakalım.

{% gist https://gist.github.com/cengiztoru/fbb0510354c803eae7fa73a1bcccf10d %}

Gönderilen veriyi arguments nesnesinin getParcelable fonksiyonu ile elde edebiliriz.

Şimdi dananın kuyruğunun koptuğu yere geldik. Lütfen dayanın bundan sonraki başlık önemli.

### SAFE ARGS İLE VERİ TAŞIMA

SafeArgs gradle plugini Navigation Components ile geldi. SafeArgs ile verileri taşırken Type-Safety veriler taşıyabiliyoruz.

Type-Safety kavramının ne olduğunu, önemini bilmiyorsanız aşağıdaki yazımı okuyabilirsiniz.

[Type Safety (Tip — Tür Güvenliği)](https://medium.com/@cengiz.toru/type-safety-tip-t%C3%BCr-g%C3%BCvenli%C4%9Fi-12cbbb554dc4)

SafeArgs yapısını kullanabilmek için bazı ayarlar yapmamız gerekiyor.

Öncelikle AndroidX kullanımını gradle.properties dosyamızda _android.useAndroidX=true_ koduyla açmış olduğumuzdan emin olmamız gerekiyor.

Daha sonra build.gradle(Module: app) dosyamızın başına sadece kotlinde kullanmak için

```
apply plugin: "androidx.navigation.safeargs.kotlin"
```

Javada veya hem Javada hem Kotlinde kullanabilmek için

```
apply plugin: "androidx.navigation.safeargs"
```

eklememiz gerekiyor.

Daha sonra build.gradle(Project: …) dosyamıza

```
buildscript {
   dependencies {
        def nav_version = "2.3.0"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
    }
}

```

eklememiz gerekiyor. Bunları yaptıktan sonra projemizi Rebuild edelim. SafeArgs, ekranlarımızın isminin sonuna Directions eklenmiş sınıflar oluşturacaktır. Ör: LoginFragment için LoginFragmentDirections

SafeArgs kullanmak için argument tanımında ve veriyi ilgili ekranda yakalama adımlarında herhangi bir değişiklik yapmıyoruz.

Şimdi SafeArgs ile nasıl veri gönderdiğimize bakalım.

{% gist https://gist.github.com/cengiztoru/a2279b45f292c8a934dd342252bf445d %}

Verimizi SafeArgs tarafından oluşturulmuş olan (sonu Directions ile biten) sınıfın içindeki, gerçekleşmesini istediğimiz ekran geçişinin bulunduğu fonksiyona parametre olarak veriyoruz. Bu fonksiyon ismini NavigationGraph içindeki action taglerininin id attributelerinden alır. Fonksiyon bize NavDirections tipinde bir nesne döndürür. NavigationController nesnesinin navigate fonksiyonuna bu nesneyi verirsek ekran geçişi sağlanmış olacak.

#### SAFEARGS KULLANSAK NE OLUR? KULLANMASAK NE OLUR?

Şimdi SafeArgs yapısının avantajına bakalım. SafeArgs ile veri taşırken Tip Güvenliğinin sağlandığından bahsetmiştim. Şimdi ona bakalım.

![](https://cdn-images-1.medium.com/max/1024/1*_3I6Kkx9GqBLeETyrF6WdQ.png)

Dalgınlıkla verileri gönderirken yanlış veri tipinde veri göndermeye çalışmamız halinde (yukarıdaki resimdeki gibi) IDE bizi uyarır. Varsayalım ki dalgınlığımız o kadar üzerimizde ki uyarıyı görmedik bu sefer de projeyi compile ederken hata alırız.

![](https://cdn-images-1.medium.com/max/1024/1*TUnZURWOEaPn1lm0MHuG7g.png)

Böylece uygulama canlıya çıktıktan sonra olabilecek hatalar uygulama canlıya çıkmadan önlenmiş olur.

Peki SafeArgs kullanmazsak ne olur?

SafeArgs kullamazsak veri taşırken Type-Safety validasyonu yapılmaz. Bu da yanlış tipte veri göndermemiz halinde hata almamaz, hatta projenin sorunsuz build edilmesi demek olur. Ancak uygulama hata yaptığımız yeri çalıştırmaya çalıştığında çökecektir.

![](https://cdn-images-1.medium.com/max/992/1*7BrRACRKGiVds5S8ofnrfw.png)

Örneğin HomeFragment bizden bir User nesnesi beklerken biz User tipinden farklı tipte veri gönderecek olursak (SafeArgs kullanmıyorsak) hiç hata almayız. Projemiz de derlenir. Ama verilerin gönderildiği ekran verileri yakalamaya çalışırken yakalayamayacak ve uygulama çökecektir.

Acil bir şekilde canlıya çıkan, testi az yapılabilmiş bir projede böyle bir hata başımızı fazlasıyla ağrıtabilir. Bu tarz durumların oluşmaması için SafeArgs kullanmanızı tavsiye ederim.

Gönderilen verileri yakalarken yukarıdaki koda alternatif olarak şu şekilde bir kod parçacığı da kullanılabilir.

{% gist https://gist.github.com/cengiztoru/286d527d5acc288fb0043a3a8da70875 %}

Bu yazımda Navigation Component ile ekranlar arasında nasıl veri taşıyabileceğimizi anlatmaya çalıştım. Olabildiğince Türkçe kaynak oluşturmaya çalışıyorum. Ama malumunuz sektörün dili İngilizce. Bu sebeple de bazı kelimeler İngilizce kalıyor. Çünkü ya Türkçe’si yok yada Türkçe’si anlamsız oluyor. Bunu anlayışla karşılayacağınızı umuyorum.

Yazıyı beğendiyseniz 👏 butonuna basarsanız sevinirim. Daha fazla insanın faydalanması için paylaşmanızı rica ederim. Buna benzer yazıları yazmaya devam etmeyi düşünüyorum. Yazdıklarımdan haberdar olmak için takip edebilirsiniz. Sonraki yazı da görüşmek üzere.

#### LİNKLER

[cengiztoru/Simple-Navigation-Component-Example](https://github.com/cengiztoru/Simple-Navigation-Component-Example)

[Navigation Component Google Guide](https://developer.android.com/guide/navigatio)

[Navigation Component Google Pass Data](https://developer.android.com/guide/navigation/navigation-pass-data)