آشنایی با کاتلین (پروژه ی کتابخانه برای اندروید)
فهرست مطالب
آخرین به روزرسانی در 21/10/2022
در این مقاله قصد داریم به معرفی ، آشنایی با زبان کاتلین و آموزش مقدماتی آن برای استفاده در اندروید بپردازیم.
لازم به ذکر است زبان کاتلین یکی از جامع تری و منتخب ترین زبان برای طراحی اپلیکیشن اندروید می باشد.
ما در این مقاله صرفا به آشنایی ، معرفی کاربردهای این زبان و آموزش استفاده از آن برای اندروید خواهیم پرداخت و در مقاله ی بعدی
توضیحات بیشتری را در رابطه با جزئیات این زبان خواهیم داد و کمی وارد فاز آموزشی در حد مقدماتی برای آن می شویم.
لازم به ذکر است پیش نیاز این آموزش تسلط بر زبان جاوا و درک مفاهیم آن می باشد.
مقدمه
قبل از سال 2017، توسعه دهندگان برنامه های اندروید تقریباً به طور انحصاری از زبان برنامه نویسی جاوا 6 استفاده می کردند.
جاوا 6 در سال 2006، دو سال قبل از عرضه دستگاه های اندرویدی معرفی شد.
در واقع جاوا در بازار برنامه نویسی اندروید پادشاهی می کرد.
پس از آمدن اندروید ، جاوا JetBrains IntelliJ IDEA را توسعه داد که اساس Android Studio است.
در سال 2011، این شرکت زبان Kotlin را معرفی کرد، اما تعداد کمی از توسعه دهندگان اندروید شروع به استفاده از آن کردند.
اگرچه کاتلین آماده تولید بود، اما زبان ثابت و محبوبی نبود.
وقتی تغییرات مهمی در زبان اتفاق افتاد، توسعهدهندگان مجبور شدند پایگاه کد خود را تغییر دهند.
پنج سال بعد، کاتلین نسخه 1.0 را منتشر کرد.
در Google I/O 2017، گوگل اعلام کرد که اندروید از این پس از Kotlin به عنوان یک زبان برنامه نویسی درجه یک پشتیبانی می کند.
برای اینکه این اتفاق بیفتد، نسخه 3.0 اندروید استودیو (AS) پشتیبانی از Kotlin را کاملاً یکپارچه کرد.
سه نسخه کوچک بعدی AS به بهبود پشتیبانی Kotlin و ابزارهای موجود ادامه دادند.
Kotlin یک زبان برنامه نویسی مدرن و با تایپ ایستا است که با کامپایل کردن کد Kotlin در بایت کد جاوا بر روی یک ماشین مجازی جاوا (JVM) اجرا می شود. همچنین می توان آن را به کد منبع جاوا اسکریپت و فایل های اجرایی لوکال کامپایل کرد.
زبان کاتلین انعطاف پذیر است و ویژگی های جالبی دارد.
در این مقاله ی آَشنایی با زبان کاتلین به طور کلی موارد زیر را با هدف استفاده از کاتلین برای اندروید یاد خواهید گرفت :
- چگونه محیط Kotlin خود را راه اندازی کنیم.
- نحوه کار با جاوا و کاتلین در یک پروژه
- چه چیزی کاتلین را به عنوان یک زبان جدید بسیار هیجان انگیز می کند.
چرا کاتلین ؟
از زمانی که اندروید در دنیای تلفن های همراه انقلابی به پا کرد، توسعه دهندگان جایگزین های کمی برای جاوا برای توسعه اپلیکیشن داشتند.
جاوا زبان برنامه نویسی بود که پیشرفته ترین گوشی ها از آن برای اجرای برنامه های بومی خود بر روی سیستم عامل های اختصاصی خود استفاده می کردند.
به عنوان مثال، سیمبین نوکیا دارای برنامه های جاوا ME بود.
اگرچه استفاده از آن گسترده است، اما جاوا با توشه های تاریخی زیادی همراه است.
جاوا 8 برخی از مشکلات این زبان را حل کرد و حتی بیشتر با جاوا 9 و 10 اصلاح شد.
متأسفانه، برای استفاده از همه ویژگی های جاوا 8 باید حداقل SDK را روی اندروید 24 تنظیم کنید، که برای بسیاری از توسعه دهندگان گزینه ی درستی نیست.
تکه تکه شدن اکوسیستم اندروید باعث می شود که کاربران با دستگاه های قدیمی تر کنار گذاشته شوند.
در حال حاضر برای اکثر توسعه دهندگان، جاوا 9 و 10 حتی در لیست انتخابی نیز نیستند.
اینجاست که کاتلین وارد بازار می شود.
Kotlin راه حل مدرن زبان برنامه نویسی برای اندروید است.
مواردی که کاتلین را برای اندروید مناسب می کند عبارتند از :
سازگاری : با JDK 6 سازگار است، بنابراین دستگاههای قدیمیتر نیز می توانند از اپلیکیشن های ساخته شده با کاتلین استفاده کنند.
عملکرد : همتراز با جاوا است.
قابلیت همکاری و یکپارچگی : 100٪ با جاوا از جمله annotations قابل همکاری است.
Footprint : runtime library برای Kotlin بسیار کوچک است.
زمان کامپایل : در کامپایل کردن سریع است.
منحنی یادگیری : یادگیری آن آسان است، به خصوص برای افرادی که به زبان های مدرن عادت دارند.
مبدل جاوا به کاتلین در IntelliJ و Android Studio این کار را حتی ساده تر می کند.
همچنین میتوانید از ترکیبی از کاتلین و جاوا در یک پروژه استفاده کنید، بنابراین وقت خود را صرف یادگیری کاتلین کنید و زمانی که احساس راحتی کردید آن را به آن اضافه کنید.
در حالی که جاوا 8 اکنون در نسخه های اخیر اندروید پشتیبانی می شود، نظرسنجی های اخیر توسعه دهندگان نشان می دهد که محبوبیت Kotlin روز به روز در حال افزایش است.
Realm team خاطرنشان می کند که کاتلین در شرف تغییر کل اکوسیستم اندروید است.
Kotlin اکنون یکی از محبوب ترین زبان های برنامه نویسی است.
ویژگی بسیار مهم دیگر در رابطه با کاتلین این است که یک زبان کاملا جدید است.
شروع کار
ما برای این آموزش ، پروژه ای که در نظر گرفته ایم ، کار با اپلیکیشنی است که به کاربران امکان می دهد کتاب ها را جستجو کنند، جلد کتاب ها را ببینند و کتاب ها را با دوستانشان به اشتراک بگذارند.
در ابتدا پروژه را با استفاده از این لینک دانلود کنید.
پروژه starter را در Android Studio نسخه 3.3 یا جدیدتر استخراج و باز کنید.
این شامل سه فایل سورس کد نوشته شده در جاوا است :
MainActivity.java : Activity که صفحه نمایش را برای جستجو و نمایش فهرستی از کتاب ها نمایش می دهد.
DetailActivity.java : Activity که جلد کتاب شناسه ارسال شده به آن را نمایش می دهد.
JSONAdapter.java : یک BaseAdapter سفارشی که یک آبجکت JSON را به یک آیتم list view تبدیل می کند.
پروژه را بیلد و اجرا کنید تا ببینید با چه چیزی کار می کنید.
اول از همه ، نام خود را وارد کنید تا برنامه شروع به کار کند.
پس از آن، شروع به جستجوی کتاب های مورد علاقه خود کنید.
نام کتاب یا نویسنده ای را در فیلد تایپ کنید و روی جستجو کلیک کنید تا لیستی از کتاب ها را دریافت کنید.
با کلیک بر روی یک ردیف، به صفحه دوم می روید که در آن پوشش کامل را خواهید داشت.
تنظیم محیط
اندروید استودیو 3.3 و نسخه های جدیدتر از Kotlin به طور کامل پشتیبانی می کند.
هر پروژه جدیدی که ایجاد کنید از Kotlin استفاده خواهد کرد.
هنگام ایجاد یک activity جدید، زبان را روی Kotlin تنظیم کنید.
شما نیازی به ایجاد پروژه برای این آموزش نخواهید داشت زیرا آموزش همراه با یک پروژه starter در بالا ارائه شده است :
یک پنجره بازشو به شما پیشنهاد می کند تا هر زمان که نسخه جدیدی در دسترس است، افزونه Kotlin خود را در Android Studio 3.3. به روز کنید.
همیشه میتوانید نسخه پلاگین Kotlin خود را در صفحه Plugins با کلیک کردن روی command+shift+a و تایپ Plugins بررسی کنید.
Kotlin را در کادر جستجو تایپ کنید و ورژن سمت راست را علامت بزنید:
کار با جاوا و کاتلین
یکی از شگفت انگیزترین ویژگی های کاتلین این است که می تواند با جاوا همراه شود.
کد جاوا می تواند کد Kotlin را فراخوانی کند و بالعکس.
حتی ممکن است متوجه نشوید که در حال فراخوانی کد به زبان دیگری هستید.
از این مرحله به بعد، کلاس DetailActivity را به کاتلین ترنسلیت خواهید کرد.
com.raywenderlich.android.omgandroid را در پانل Project در سمت چپ تنها کلیک کنید.
با انتخاب بسته، به File ▸ New ▸ Kotlin File/Class بروید تا یک کلاس Kotlin جدید ایجاد کنید.
بدون انتخاب package ، گزینه Kotlin file را نخواهید دید.
در پنجره New Kotlin File/Class، Class را در قسمت Kind انتخاب کنید و DetailActivityKotlin را به عنوان نام کلاس وارد کنید.
روی OK کلیک کنید.
کلاس جدید شما باید به شکل زیر باشد:
package com.raywenderlich.android.omgandroid
class DetailActivityKotlin {
}
چند نکته قابل توجه:
کلاس های Kotlin را با استفاده از کلاس keyword اعلام کنید ؛ درست مانند جاوا.
به طور پیشفرض، اگر هیچ modifier نمایانی در Kotlin وجود نداشته باشد، آیتم public است.
کلاس ها و متدها به طور پیش فرض final هستند.
اگر میخواهید کلاسها را inherit و متدها را override کنید، آنها را باز اعلام کنید.
از آنجایی که کاتلین و جاوا قابل همکاری هستند، می توانید از چارچوب ها و کتابخانه های جاوا موجود در فایل های کد Kotlin خود استفاده کنید.
کلاس را به زیر کلاس AppCompatActivity تبدیل کنید:
class DetailActivityKotlin : AppCompatActivity() {}
در صورت نیاز، برای وارد کردن کلاس هایی مانند AppCompatActivity روی Option + Return کلیک کنید.
اگر تداخلی وجود نداشته باشد، Android Studio معمولاً دستورات import را برای شما اضافه می کند.
به طور متمایز از جاوا، در Kotlin () ، NameOfParentClass را به اعلان subclass اضافه می کنید.
پرانتزهای انتهایی برای سازنده در کلاس والد هستند.
اکنون متد onCreate() Activity را override کنید.
چیزی شبیه به این خواهد بود:
import android.app.Activity
import android.os.Bundle
class DetailActivityKotlin: Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
MainActivity.java را باز کنید و رفرنس DetailActivity در () onItemClick را با DetailActivityKotlin جایگزین کنید.
خط intent creation باید از :
Intent detailIntent = new Intent(this, DetailActivity.class);
به
Intent detailIntent = new Intent(this, DetailActivityKotlin.class);
تغییر کند.
تغییرات
همانطور که برای یک Activity جاوا انجام می دهید، باید Activity Kotlin خود را در AndroidManifest.xml اعلام کنید.
کد زیر را در اعلان DetailActivity داخل تگ application اضافه کنید:
android:name=".DetailActivityKotlin"
android:label="@string/activity_details_kotlin"
android:parentActivityName=".MainActivity">
کار با فایل های XML به طور کلی تغییر نکرده است، از جمله AndroidManifest، فایل های layout ، styles و resources.
صرف نظر از زبان برنامه نویسی Activity، اگر آن را در مانیفست ثبت نکنید، برنامه شما از کار می افتد.
بیلد و اجرا کنید. کتابی را از لیست انتخاب کنید تا صفحه خالی را با عنوان جزئیات کتاب Kotlin ببینید.
ویژگی های جذاب کاتلین
قبل از اینکه عمیقتر به ویژگیهای Kotlin نگاه کنیم، به DetailActivityKotlin.kt برگردید و محتوای فایل را با موارد زیر جایگزین کنید:
package com.raywenderlich.android.omgandroid
import android.content.Intent
import android.os.Bundle
import android.support.v4.view.MenuItemCompat
import android.support.v7.app.AppCompatActivity
import android.view.Menu
import android.widget.ImageView
import android.support.v7.widget.ShareActionProvider
import com.squareup.picasso.Picasso
class DetailActivityKotlin : AppCompatActivity() {
private val imageUrlBase = "http://covers.openlibrary.org/b/id/"
private var imageURL = ""
private var shareActionProvider: ShareActionProvider? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_detail)
actionBar?.setDisplayHomeAsUpEnabled(true)
val imageView = findViewById(R.id.img_cover)
val coverId = this.intent.extras.getString("coverID")
val len = coverId?.length ?: 0
if (len > 0) {
imageURL = imageUrlBase + coverId + "-L.jpg"
Picasso.with(this).load(imageURL).placeholder(R.drawable.img_books_loading).into(imageView)
}
}
private fun setShareIntent() {
val shareIntent = Intent(Intent.ACTION_SEND)
shareIntent.type = "text/plain"
shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Book Recommendation!")
shareIntent.putExtra(Intent.EXTRA_TEXT, imageURL)
shareActionProvider?.setShareIntent(shareIntent)
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.main, menu)
val shareItem = menu.findItem(R.id.menu_item_share)
shareActionProvider = MenuItemCompat.getActionProvider(shareItem) as ShareActionProvider
setShareIntent()
return true
در ظاهر، کد شبیه جاوا است، اما برخی از ویژگی های زبان Kotlin وجود دارد که در بخش بعدی به آنها خواهید پرداخت.
بیلد و اجرا کنید، کتابی را انتخاب کنید و ببینید آیا این بار جلدی به دست می آورید یا خیر.
Declaring Variables (اعلان متغیرها)
اعلان متغیرها در Kotlin ساده و واضح است.
برای اینکه تا حد ممکن با کاتلین آشنا باشید، باید با تمام کارهایی که کاتلین می تواند و نمی تواند در مورد متغیرها انجام دهد آشنا بشوید.
در اینجا چند اعلان متغیر وجود دارد که اغلب از آنها استفاده می کنید :
var item = "house"
val points = 35
var car: String = "BMW"
تفاوت بین val و var چیست؟ بعداً نمیتوانید متغیرهایی را که با val اعلام میکنید دوباره اختصاص دهید.
انجام این کار باعث ایجاد خطای کامپایلر می شود.
اما شما می توانید این کار را با var انجام دهید و این تفاوت بین این دو است.
points = 36
مورد دیگری که در آخرین اعلان متفاوت است این است که یک نوع متغیر نیز وجود دارد.
در کاتلین، نوع inference به خوبی کار می کند.
به همین دلیل است که در بیشتر مواقع نیازی به بیان صریح نوع متغیر نیست.
همانطور که بعداً خواهید دید، در مورد نوع Optional که میتواند null باشد، باید این کار را انجام دهید.
برای متغیر car ، نوع آن ضروری نیست، اما خوب است که به کامپایلر Kotlin اطلاع دهید که این یک رشته است و هرگز چیز دیگری نخواهد بود.
var highScore = points + 999
Null Safety
یک مشکل رایج در مورد زبان های برنامه نویسی، دسترسی به عضوی از یک رفرنس null است.
رفرنس تهی زمانی رخ می دهد که شما یک متغیر ابجکت را بدون دادن مقدار به آن اعلام می کنید، یا زمانی که به آن متغیر null اختصاص می دهید.
وقتی برنامه اجرا میشود و سعی میکند به آن متغیر دسترسی پیدا کند، نمیداند به کجا نگاه کند، زیرا وجود ندارد.
رایج ترین نتیجه این است که برنامه شما ناگهان متوقف می شود و از کار می افتد.
ممکن است با NullPointerException جاوا آشنا باشید.
یکی از بزرگترین ویژگیهای کاتلین این است که هدف سیستم type آن حذف NullPointerException است، هدفی که به عنوان void safety. شناخته میشود.
در Kotlin، دلایل احتمالی NullPointerException عبارتند از:
- کد خارجی جاوا
- یک فراخوان explicit برای NullPointerException() (NPE).
- استفاده از !! operator .
- یک lateinit var قبل از دسترسی مقداردهی اولیه نشده است.
Nullable Types and Non-Null Types
کاتلین دارای انواع Nullable و غیر Null است.
اگر متغیری را به عنوان nullable اعلام نکنید، نمی توانید به آن مقدار null اختصاص دهید.
کامپایلر این را اعمال میکند و خراب کردن ناخواسته برنامه شما را سختتر میکند.
برخلاف جاوا، همه متغیرها باید در نقطه اعلان، در سازنده یا init مقداردهی اولیه شوند، به جز lateinit var.
برای اعلام یک متغیر به عنوان nullable، باید یک ? به نوع آن در نقطه اعلان، همانطور که در این اعلان shareActionProvider می بینید قرار گیرد:
private var shareActionProvider: ShareActionProvider? = null
Late Initialization Variables
Late Initialization Variables متغیر را قبل از دسترسی به آن مقداردهی اولیه می کنند.
این یکی از شایع ترین علل NPE است.
برای اعلان یک متغیر بدون مقداردهی اولیه آن در سازنده یا بلوک init، lateinit را پیشنویس کنید:
class SomeClass {
private lateinit var myName: String
fun methodThatAccesses() {
myName.trim()
}
fun methodThatAssigns() {
myName = "initialize the variables!"
}
}
حال، اگر ابتدا MethodThatAccesses را صدا بزنید (فراخوانی کنید)، برنامه از کار می افتد.
شما باید myName را قبل از دسترسی به آن مقداردهی اولیه کنید و این کار را نکردید.
از طرف دیگر، اگر ابتدا متدThatAssigns را فراخوانی کنید، هیچ خرابی وجود نخواهد داشت.
این می تواند زمانی مفید باشد که شما چیزی دارید که مطمئناً می دانید به موقع آن را مقداردهی اولیه می کنید اما نمی توانید آن را در سازنده یا در بلوک init انجام دهید.
در اندروید، views به روش onCreate() اختصاص داده می شوند.
اگر به یکی از views برای عضویت در کلاس نیاز دارید و نمی خواهید در همه جا با nullability سروکار داشته باشید، منطقی است که آن را lateinit اعلام کنید.
Safe Calls
برای دسترسی به یک ویژگی یا متد روی یک متغیر nullable در جاوا، ابتدا باید یک بررسی null انجام دهید.
می توانید این را در DetailActivity.java ببینید:
if (shareActionProvider != null) {
shareActionProvider.setShareIntent(shareIntent);
}
با Kotlin می توانید عبارت فوق را با استفاده از safe call operator ? ساده کنید.
ویژگی یا متد فقط زمانی فراخوانی می شود که متغیر nullable null نباشد.
shareActionProvider?.setShareIntent(shareIntent)
در اینجا، setShareIntent فقط زمانی فراخوانی می شود که ویژگی shareActionProvider تهی نباشد.
نوع Inference
کاتلین همچنین از inference پشتیبانی می کند.
این بدان معنی است که کامپایلر می تواند انواع متغیرها را از initializer ، inference کند.
در صورت تمایل یا اگر کامپایلر نتواند آن را inference کند، همچنان می توانید نوع را اعلام کنید.
به عنوان مثال، انواع متغیرهای imageUrlBase و imageURL از مقداردهی اولیه آنها استنباط می شوند.
private val imageUrlBase = "http://covers.openlibrary.org/b/id/"
private var imageURL = ""
کامپایلر نوع استنباط شده هر متغیر را، هر کدام به عنوان یک رشته، ردیابی می کند.
هر مقداری که پس از آن به متغیر اختصاص داده می شود نیز باید از آن نوع رشته باشد.
برای اعداد، باید نوع متغیر را برای کامپایلر مشخص کنید.
var longVar = 0L
var floatVar = 0.0f
var doubleVar = 0.0
var integerVar = 0
Converter جاوا به کاتلین
Converter بهترین ابزاری است که تاکنون برای سهولت انتقال از یک زبان برنامه نویسی به زبان دیگر ساخته شده است.
از آنجایی که Kotlin توسط توسعه دهندگان برای توسعه دهندگان ساخته شده بود، آنها می دانستند که کاربران چه زبانی را می خواهند.
این ابزارها همان چیزی است که تیم توسعهدهنده زبان برای انتقال خود از جاوا به کاتلین استفاده کردند.
آن را امتحان کنید. با تبدیل فایل DetailActivity.java به Kotlin، از این ویژگی sanity-saving feature for a test drive استفاده کنید.
کلاس DetailActivity.java را باز کنید و به Code ▸ Convert Java File to Kotlin File بروید یا از میانبر Command + Shift + Option + K استفاده کنید:
یک notice مانند shown دریافت خواهید کرد، روی OK کلیک کنید.
این فایل جاوا را با یک Kotlin جایگزین می کند.
با این حال، این اخطار فقط در صورت لزوم نشان داده می شود، بنابراین همیشه منتظر آن نباشید.
DetailActivity تبدیل شده را با کلاس DetailActivityKotlin مقایسه کنید.
به انتخاب هایی که Converter انجام داده توجه کنید.
همیشه بهترین انتخاب ها را انجام نمی دهد، اما کدهای پر کاربرد تولید می کند.
اکنون، MainActivity را برای اشاره به کد تبدیل شده ریست کنید:
Intent detailIntent = new Intent(this, DetailActivity.class);
بیلد و اجرا کنید و به detail screen بروید، و خواهید دید که کد تبدیل شده و همچنین کدی که در DetailActivityKotlin داشتید کار می کند.
مهرسا امینی
برنامه نویس ، انیماتور ، سئوکار
در زندگی رویاهات را دنبال کن