Android MVVM Kullanımı 1
Merhaba, bu yazımda size MVVM design patterını anlatıp küçük bir login örneği göstereceğim.

Uzun zamandır kişisel projelerimde ve şirket projelerinde MVP yapısı kullandım. Lakin Google’nin MVVM design patterını desteklemesinden sonra bu konuda bilgi sahibi olmam gerektiğine karar verdim.
Daha önce Android uygulama geliştirirken nasıl MVP yapısı kullanılacağına dair yazı serim:
Bu yazımızda örneğe başlamadan önce şu 3 soruya cevap vereceğiz
- MVVM’în nasıl bir yapısı var?
- MVVM’in avantajı ne?
- MVVM ile MVP arasındaki farklar neler?
1 - MVVM’in yapısı
MVVM yapısı 3 parçadan oluşuyor
- Model
- View
- ViewModel
Teker teker bu parçalardan bahsedelim
Model: Uygulamanın verilerini içerir ve direkt View ile iletişime geçmek. Genellikle datayı ViewModel’a gönderir.
View: Uygulamanın UI kısmını sağlar ama herhangi bir mantık içermez. Sadece veriyi ViewModel’a gönderir
ViewModel: Model ile View arasındaki iletişimi sağlar.
MVVM Pattern’ı anlatan şöyle bir görseli şuraya bırakıyorum

2- MVVM’in Avantajı Ne?
Google, Google I/O 18 ile MVVM’i destekleyeceğini açıkladı ve bunun için componentler oluşturdu. Bunun dışında MVP’ye göre uygulamalar daha hızlı çıkıyor.
Sonuç olarak Google’nin böyle bir davranışı es geçilmemeli. Yatırım yapılması gereken bir konu olarak düşünüyorum.
3- MVVM ile MVP Arasındaki Farklar
- Presenter yerine ViewModel kullanılıyor
- Presenter View’ı klasik yollar ile güncelliyordu lakin MVVM’de Data Binding adında bir olay var aşağıda değineceğiz.
- ViewModel hangi View’ın kendisini dinlediğini bilmez
Bu farklardan da bahsettiğimize göre artık implementasyona geçebiliriz.
MVVM’i Android uygulamalara implement etmek için 2 yöntem var
1- Data Binding
2- RXJava
Biz bu yazımızda Data Binding yöntemini kullanacağız. Teknik olarak objenizi XML tarafına yollayacağız.
Bunun için BindingAdapter’e ve XML tarafında özel değişikler yapacağız. BindingAdapter XML tarafında bulunan attirubete (değeri) dinliyor olacak.
O zaman başlayalım.
En başta projemizde dataBinding’i aktif etmemiz lazım.
Bunun için uygulamanın build.gradle dosyasına aşağıdaki kodu ekliyoruz
Artık uygulamanızda databinding aktif halde.
Şimdi uygulamamıza diğer bağımlılıkları ekleyelim. Build.gradle dosyasına aşağıdaki bağımlılığı ekliyoruz
Bir sıkıntı yaşamadan buraya kadar geldi iseniz artık biraz kodlayalım :)
İlk önce business kısmının olacağı Model’imizden başlayalım
User.java
Yukarıdaki User sınıfında gördüğünüz gibi “isInputDataValid()” adlı bir fonksiyon var ve bu fonksiyonda bu kullanıcının bazı verileri doğru girip girmediğini kontrol ediyoruz. Örneğin girdiği mail adresi gerçekten mail patternına uygun mu? gibi
Şimdi kullanıcılara göstereceğimiz Layout dosyasını oluşturalım
activity_main.xml
Bence bu kısım çok önemli teker teker bunların ne olduğunu açıklayalım. Böyle yapıştır geç olmaz yani :)
Layout dosyamızda <data> </data> tagleri var peki bu tagler ne?
Size yukarıda Java classlarında oluşturduğumuz bir objeyi layouta gönderdiğimizi söylemiştim. İşte yukarıdaki tagler gelen objeyi yakalıyor.
Biz obje olarak ViewModel Classımızı gönderdik. Peki akıllarda tek bir soru ViewModel’i oluşturmadık nasıl gönderiyoruz :) Biliyorum lakin ilk önce layout dosyamızı oluşturmanın daha mantıklı olduğunu düşündüm. Siz hayali olarak oluşturduğumuzu düşünün. Diğer yazımızda bahsediyor olacağız.
Burasını anladığımıza göre devam edelim layout üstünden. Yukarıda gördüğünüz bir farklılık var değil mi? Android XML içinde “afterTextChanged” diye bir tanım yok. Peki bu ne oluyor?
Bu bir fonksiyon ismi diğer yazıda oluşturacağımız ViewModel’da bulunan bir fonksiyon. Dedim ya ViewModel’ı bir obje olarak gönderdik artık o objeden o sınıfın fonksiyonlarına ulaşabiliriz.”editable” ise şu oluyor : “Edittext’e yazılan text” ve bu texti “afterEmailTextChanged” fonksiyonuna değişken olarak veriyoruz.
Şimdi butona gelelim. Orada ise şöyle bir farklılık var
Yani diyoruz ki viewModel objesindeki “onLoginClicked” fonksiyonunu çağır.
En son yukarıdaki kısım kaldı. Ve bu da şu demek viewModel’da bulunan toastMessage adlı değişkene bunu bind et. Çok açıklayıcı olmadı biliyorum ama diğer yazımızda ViewModel sınıfı ile bu olayı daha iyi kavrıyor olacağız.
İkinci yazıda görüşmek üzere.
Not: Bu yazı aşağıdaki linkten referans alınarak yazılmıştır