بسم الله الرحمن الرحیم

امروز یه چیزایی از mvvm خوندم که میخوام همزمان با چیزی که دارم یاد میگیرم همونو همینجا هم بنویسم که دوستان دیگه هم اگه کارشون بهش گیر کرد استفاده کنن

اگه برنامه نویس متوسط اندروید باشید قطعا برای چندسال پیش برای نوشتن یه برنامه ساده اندروید به این شیوه عمل میکردید که یه فایل xml میساختید و یه فایل جاوا و از توی فایل جاوا با نوشتن findViewById میتونستید آبجکت هایی که توی xml ساختید رو بگیرید و ازشون استفاده کنید

علاوه بر تابع findViewById یه تابع معروف دیگه هم به اسم setOnClickListener داشتیم (که البته هنوز هر دو رو داریم) و ازش برای زمانی استفاده میکردیم که وقتی کاربر روی دکمه، تصویر یا متنی کلیک کرد میخواستیم کدی که ما بهش بگیم اجرا بشه

پیاده کردن معماری mvc روی اندروید امکان پذیر نبود بخاطر همین mvp به وجود اومده بود که p اخرش به معنای presenter بود یعنی رابط بین ویو و مدل

اصلا ویو و مدل چی هستن؟

مدل یعنی اون کلاس مورد نظری که میخواد کار خاصی رو انجام بده فرض کنید که ویو یه صفحه ای هست که قراره چیزی رو از اینترنت بگیره و نشون بده

کار گرفتن اطلاعات از اینترنت توسط مدل انجام میشه و نتیجه اش به presenter داده  میشه (یا presenter ازش نتیجه رو میگیره) و نهایتا presenter اونو میده به ویو تا ست کنه

حالا معماری جدیدی که گوگل توی IO'17 معرفی کرده معماری mvvm به معنای model-view-viewmodel هست که از توش presenter رو دراوردن و به جاش viewmodel گذاشتن

viewmodel چند تا کار خوب برامون میکنه

اولا که رابط بین model  و view ما هست. ثانیا با چند خط کد میشه یه کاری کرد که وقتی گوشی میچرخه و اکتیویتی ما از اول onCreate میشه ویو ها اطلاعات خودشونو داشته باشن و از دست ندن (یه قابلیتی که تا چندوقت پیش نبود یا اگه بود کار باهاش سخت بود) با بقیه قابلیت های viewmodel در ادامه آشنا میشیم

خب یکم از تعریف کردن فاصله بگیرم بریم توی محیط کد»

DataBinding:

شاید اگه این کلمه رو توی گوگل سرچ کنید و یکم در موردش بخونید به این نتیجه برسید که یه چیز توی مایه های ButterKnife هست تازه ButterKnife هم که وقتی یه اکستنشن برای اندروید استودیو اومد که خود ویو رو مستقیم با آیدی به کدهای جاوا (یا کاتلین) وصل میکرد دیگه کمرنگ شد

bind توی فارسی یعنی بستن، گرفتار و اسیر کردن حالا dataBinding راحت تر معنی میشه و معنیش به نظرم اینه که شما ویو خودتون رو به دیتا bind کنید یا گره بزنید

یعنی با تغییر دیتا سریعا view هم تغییر کنه و مقدار جدید رو توش ریخته بشه (این معرکه است، نه؟؟؟)

ولی حتی میتونید تا این حد هم پیش نرید یعنی شما میتونید از لایبراری های DataBinding فقط برای اتصال راحتتر ویو هایی که توی xml دارید به فایل کدهاتون استفاده کنید

باهم کم کم پیش میریم:

اول از همه این خطوط کد رو فایل build.gradle اضافه کنید

// at the top of file 
apply plugin: 'kotlin-kapt'


android {
    //other things that we already used
    dataBinding.enabled = true
}
dependencies {
    //other dependencies that we used
    kapt "com.android.databinding:compiler:3.0.0-beta1"
}

 دقت کنید: که در نسخه جدید gradle (فکر کنم 3.2.1 به بالا) دیگه نیاز به خط آخر نیست یعنی اگه بنویسید از شما خطا میگیره 

خب حالا وقت معرفی یه چیز جدید برای استفاده از این لایبراری که اضافه کردید رسیده:

چند تا تگ جدید توی xml اندروید اضافه شده که دونه دونه بنا بر نیاز خودمون توضیحشون میدم:

تگ <layout>:

این تگ رو نمیشه توضیح خاصی براش گفت فعلا فقط اینو بدونید که طریقه استفاده اش اینه که فایل layout شما باید بالاترین لایوت ش همین tag باشه (یعنی پرنت همه باید این باشه)

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
           ....

</layout>

خب از این تگ استفاده کنید و توش یه ویو بکشید ویوتون باید یه ویو اصلی باشه مثل ConstraintLayout و بعد توش صفحه تون رو طراحی کنید

بعد از اینکه چند تا ویو توی ConstraintLayout تون گذاشتید اون چکش (بالای اندروید استودیو) که کارش بیلد هست رو بزنید تا برنامه بیلد بشه در نتیجه چندتا فایل ساخته میشه که فعلا به طور مستقیم کاریشون نداریم.

وارد MainActivity.kt بشید (کدهامون به کاتلین هستن نه جاوا) و کد زیر رو بالای onCreate بنویسید

lateinit var binding: ActivityMainBinding

شاید بپرسید ActivityMainBinding چیه باید عرض کنم که این فایل اسمش طبق اسم فایل xml شما هست و وقتی لایبراری DataBinding رو اضافه کردید برای فایل xml شما این فایل ساخته شد

حالا به جای کد زیر توی onCreate:

setContentView(R.layout.activity_main)

از این کد استفاده کنید:

binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

و حالا به جای هیجان انگیزی میرسیم

کافیه زیر کد بالا کلمه binding رو تایپ کنید و بعدش دات بزنید تا آیدی اون ویو هایی که توی xml ساختید نشون داده بشن

درست فهمیدید اون لایبراری ها و پلاگینی که اضافه کردید کارشون این بود که براتون از روی xml آبجکت ها رو میساختن که شما بتونید ازشون خیلی راحت تر استفاده کنید و دیگه نیاز به findViewById نداشته باشید

این تازه اول کاره و خیلی چیزای باحال دیگه هم داریم اما این پست داره طولانی میشه انشاءالله وقت کنم توی پست های بعدی ادامشو میزارم

موفق باشید

یاعلی