Android KTX بخشی از Android Jetpack .
Android KTX مجموعهای از برنامههای افزودنی Kotlin است که همراه با Android Jetpack و سایر کتابخانههای اندروید موجود است. پسوندهای KTX کوتلین مختصر و اصطلاحی را به Jetpack، پلتفرم اندروید و سایر APIها ارائه می دهند. برای انجام این کار، این برنامه های افزودنی از چندین ویژگی زبان Kotlin استفاده می کنند، از جمله موارد زیر:
- توابع پسوند
- ویژگی های پسوند
- لامبدا
- پارامترهای نامگذاری شده
- مقادیر پیش فرض پارامتر
- کوروتین ها
به عنوان مثال، هنگام کار با SharedPreferences
، قبل از اینکه بتوانید در داده های تنظیمات برگزیده تغییراتی ایجاد کنید، باید یک ویرایشگر ایجاد کنید . همانطور که در مثال زیر نشان داده شده است، باید پس از اتمام ویرایش، آن تغییرات را اعمال یا انجام دهید:
sharedPreferences
.edit() // create an Editor
.putBoolean("key", value)
.apply() // write to disk asynchronously
لامبداهای کاتلین برای این مورد مناسب هستند. آنها به شما این امکان را می دهند که با ارسال یک بلوک کد برای اجرا پس از ایجاد ویرایشگر، اجازه اجرای کد و سپس اجازه دادن به SharedPreferences
API تغییرات را به صورت اتمی، رویکرد مختصرتری در پیش بگیرید.
در اینجا نمونهای از یکی از توابع اصلی Android KTX، SharedPreferences.edit
است که یک تابع ویرایش را به SharedPreferences
اضافه میکند. این تابع یک پرچم boolean
اختیاری را به عنوان اولین آرگومان خود می گیرد که نشان می دهد آیا باید تغییرات را انجام یا اعمال کرد. همچنین یک عمل برای انجام در ویرایشگر SharedPreferences
به شکل لامبدا دریافت می کند.
// SharedPreferences.edit extension function signature from Android KTX - Core
// inline fun SharedPreferences.edit(
// commit: Boolean = false,
// action: SharedPreferences.Editor.() -> Unit)
// Commit a new value asynchronously
sharedPreferences.edit { putBoolean("key", value) }
// Commit a new value synchronously
sharedPreferences.edit(commit = true) { putBoolean("key", value) }
تماس گیرنده می تواند انتخاب کند که آیا تغییرات را انجام دهد یا اعمال کند. action
لامبدا خود یک تابع برنامه افزودنی ناشناس در SharedPreferences.Editor
است که Unit
برمیگرداند، همانطور که با امضای آن مشخص شده است. به همین دلیل است که در داخل بلوک، میتوانید کار را مستقیماً در SharedPreferences.Editor
انجام دهید.
در نهایت، امضای SharedPreferences.edit()
حاوی کلمه کلیدی inline
است. این کلمه کلیدی به کامپایلر Kotlin می گوید که باید بایت کد کامپایل شده برای تابع را هر بار که از تابع استفاده می شود کپی و جایگذاری (یا درون خطی ) کند. این امر از سربار نمونه سازی یک کلاس جدید برای هر action
در هر بار فراخوانی این تابع جلوگیری می کند.
این الگوی ارسال کد با استفاده از لامبدا، اعمال پیشفرضهای معقول که میتوان آنها را نادیده گرفت، و افزودن این رفتارها به APIهای موجود با استفاده از توابع الحاقی inline
، نمونهای از پیشرفتهای ارائهشده توسط کتابخانه Android KTX است.
از Android KTX در پروژه خود استفاده کنید
برای شروع استفاده از Android KTX، وابستگی زیر را به فایل build.gradle
پروژه خود اضافه کنید:
شیار
repositories { google() }
کاتلین
repositories { google() }
ماژول های AndroidX
Android KTX در ماژول هایی سازماندهی شده است که هر ماژول شامل یک یا چند بسته است.
شما باید یک وابستگی برای هر مصنوع ماژول در فایل build.gradle
برنامه خود قرار دهید. به یاد داشته باشید که شماره نسخه را به آرتیفکت اضافه کنید. میتوانید آخرین شمارههای نسخه را در بخش مربوط به هر مصنوع در این مبحث پیدا کنید.
Android KTX شامل یک ماژول تک هسته ای است که پسوندهای Kotlin را برای APIهای فریمورک رایج و چندین پسوند خاص دامنه ارائه می کند.
به استثنای ماژول اصلی، همه مصنوعات ماژول KTX جایگزین وابستگی اساسی جاوا در فایل build.gradle
شما می شوند. برای مثال، میتوانید وابستگی androidx.fragment:fragment
با androidx.fragment:fragment-ktx
جایگزین کنید. این نحو به مدیریت بهتر نسخه کمک می کند و الزامات اعلام وابستگی اضافی را اضافه نمی کند.
هسته KTX
ماژول Core KTX افزونههایی را برای کتابخانههای معمولی که بخشی از چارچوب Android هستند ارائه میکند. این کتابخانه ها وابستگی های مبتنی بر جاوا ندارند که باید آنها را به build.gradle
اضافه کنید.
برای گنجاندن این ماژول، موارد زیر را به فایل build.gradle
برنامه خود اضافه کنید:
شیار
dependencies { implementation "androidx.core:core-ktx:1.13.1" }
کاتلین
dependencies { implementation("androidx.core:core-ktx:1.13.1") }
در اینجا لیستی از بسته های موجود در ماژول Core KTX آمده است:
- androidx.core.animation
- androidx.core.content
- androidx.core.content.res
- androidx.core.base
- androidx.core.database.sqlite
- androidx.core.graphics
- androidx.core.graphics.drawable
- androidx.core.location
- androidx.core.net
- androidx.core.os
- androidx.core.text
- androidx.core.transition
- androidx.core.util
- androidx.core.view
- androidx.core.widget
مجموعه KTX
افزونههای مجموعه شامل توابع کاربردی برای کار با مجموعه کتابخانههای کارآمد حافظه اندروید، از جمله ArrayMap
، LongSparseArray
، LruCache
و غیره هستند.
برای استفاده از این ماژول، موارد زیر را به فایل build.gradle
برنامه خود اضافه کنید:
شیار
dependencies { implementation "androidx.collection:collection-ktx:1.4.3" }
کاتلین
dependencies { implementation("androidx.collection:collection-ktx:1.4.3") }
پسوندهای مجموعه از بارگذاری بیش از حد اپراتور Kotlin برای ساده کردن مواردی مانند الحاق مجموعه استفاده می کنند، همانطور که در مثال زیر نشان داده شده است:
// Combine 2 ArraySets into 1.
val combinedArraySet = arraySetOf(1, 2, 3) + arraySetOf(4, 5, 6)
// Combine with numbers to create a new sets.
val newArraySet = combinedArraySet + 7 + 8
قطعه KTX
ماژول Fragment KTX تعدادی پسوند برای ساده سازی قطعه API ارائه می دهد.
برای گنجاندن این ماژول، موارد زیر را به فایل build.gradle
برنامه خود اضافه کنید:
شیار
dependencies { implementation "androidx.fragment:fragment-ktx:1.8.2" }
کاتلین
dependencies { implementation("androidx.fragment:fragment-ktx:1.8.2") }
با ماژول Fragment KTX، می توانید تراکنش های قطعه را با لامبدا ساده کنید، به عنوان مثال:
fragmentManager().commit {
addToBackStack("...")
setCustomAnimations(
R.anim.enter_anim,
R.anim.exit_anim)
add(fragment, "...")
}
همچنین میتوانید با استفاده از viewModels
و نمایندههای ویژگی activityViewModels
به ViewModel
در یک خط متصل شوید:
// Get a reference to the ViewModel scoped to this Fragment
val viewModel by viewModels<MyViewModel>()
// Get a reference to the ViewModel scoped to its Activity
val viewModel by activityViewModels<MyViewModel>()
چرخه حیات KTX
Lifecycle KTX یک LifecycleScope
برای هر شیء Lifecycle
تعریف می کند. هر برنامهای که در این محدوده راهاندازی میشود، زمانی که Lifecycle
از بین میرود، لغو میشود. می توانید با استفاده از ویژگی lifecycle.coroutineScope
یا lifecycleOwner.lifecycleScope
به CoroutineScope
از Lifecycle
دسترسی داشته باشید.
برای گنجاندن این ماژول، موارد زیر را به فایل build.gradle
برنامه خود اضافه کنید:
شیار
dependencies { implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.8.4" }
کاتلین
dependencies { implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.8.4") }
مثال زیر نحوه استفاده از lifecycleOwner.lifecycleScope
برای ایجاد متن از پیش محاسبه شده به صورت ناهمزمان نشان می دهد:
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
val params = TextViewCompat.getTextMetricsParams(textView)
val precomputedText = withContext(Dispatchers.Default) {
PrecomputedTextCompat.create(longTextContent, params)
}
TextViewCompat.setPrecomputedText(textView, precomputedText)
}
}
}
LiveData KTX
هنگام استفاده از LiveData، ممکن است لازم باشد مقادیر را به صورت ناهمزمان محاسبه کنید. به عنوان مثال، ممکن است بخواهید تنظیمات برگزیده یک کاربر را بازیابی کنید و آنها را به UI خود ارائه دهید. برای این موارد، LiveData KTX یک تابع سازنده liveData
را ارائه می دهد که یک تابع suspend
فراخوانی می کند و نتیجه را به عنوان یک شی LiveData
ارائه می کند.
برای گنجاندن این ماژول، موارد زیر را به فایل build.gradle
برنامه خود اضافه کنید:
شیار
dependencies { implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.8.4" }
کاتلین
dependencies { implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.8.4") }
در مثال زیر، loadUser()
یک تابع suspend است که در جای دیگری اعلام شده است. می توانید از تابع liveData
builder برای فراخوانی loadUser()
به صورت ناهمزمان استفاده کنید و سپس از emit()
برای انتشار نتیجه استفاده کنید:
val user: LiveData<User> = liveData {
val data = database.loadUser() // loadUser is a suspend function.
emit(data)
}
برای اطلاعات بیشتر در مورد استفاده از کوروتین ها با LiveData
، به استفاده از کوروتین های Kotlin با اجزای معماری مراجعه کنید.
ناوبری KTX
هر جزء از کتابخانه ناوبری نسخه KTX خود را دارد که API را به گونه ای مختصر و اصطلاحی Kotlin تطبیق می دهد.
برای گنجاندن این ماژول ها، موارد زیر را به فایل build.gradle
برنامه خود اضافه کنید:
شیار
dependencies { implementation "androidx.navigation:navigation-runtime-ktx:2.7.7" implementation "androidx.navigation:navigation-fragment-ktx:2.7.7" implementation "androidx.navigation:navigation-ui-ktx:2.7.7" }
کاتلین
dependencies { implementation("androidx.navigation:navigation-runtime-ktx:2.7.7") implementation("androidx.navigation:navigation-fragment-ktx:2.7.7") implementation("androidx.navigation:navigation-ui-ktx:2.7.7") }
همانطور که در مثال زیر نشان داده شده است، از توابع افزونه و تفویض ویژگی برای دسترسی به آرگومان های مقصد و پیمایش به مقصد استفاده کنید:
class MyDestination : Fragment() {
// Type-safe arguments are accessed from the bundle.
val args by navArgs<MyDestinationArgs>()
...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
view.findViewById<Button>(R.id.next)
.setOnClickListener {
// Fragment extension added to retrieve a NavController from
// any destination.
findNavController().navigate(R.id.action_to_next_destination)
}
}
...
}
پالت KTX
ماژول Palette KTX پشتیبانی اصطلاحی Kotlin را برای کار با پالت های رنگی ارائه می دهد.
برای استفاده از این ماژول، موارد زیر را به فایل build.gradle
برنامه خود اضافه کنید:
شیار
dependencies { implementation "androidx.palette:palette-ktx:1.0.0" }
کاتلین
dependencies { implementation("androidx.palette:palette-ktx:1.0.0") }
به عنوان مثال، هنگام کار با یک نمونه Palette
، می توانید نمونه selected
برای یک target
معین را با استفاده از عملگر get ( [ ]
) بازیابی کنید:
val palette = Palette.from(bitmap).generate()
val swatch = palette[target]
جریان های واکنشی KTX
ماژول Reactive Streams KTX به شما امکان می دهد یک جریان LiveData
قابل مشاهده از یک ناشر ReactiveStreams
ایجاد کنید.
برای گنجاندن این ماژول، موارد زیر را به فایل build.gradle
برنامه خود اضافه کنید:
شیار
dependencies { implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.4" }
کاتلین
dependencies { implementation("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.8.4") }
به عنوان مثال، یک پایگاه داده با لیست کوچکی از کاربران را در نظر بگیرید. در برنامه خود، پایگاه داده را در حافظه بارگذاری می کنید و سپس داده های کاربر را در رابط کاربری خود نمایش می دهید. برای رسیدن به این هدف، می توانید از RxJava استفاده کنید. مولفه Room
Jetpack می تواند لیست کاربران را به صورت Flowable
بازیابی کند. در این سناریو، شما همچنین باید اشتراک ناشر Rx را در طول عمر قطعه یا فعالیت خود مدیریت کنید.
با این حال، با LiveDataReactiveStreams
، میتوانید از RxJava و مجموعه غنی از اپراتورها و قابلیتهای زمانبندی کار بهره ببرید و در عین حال با سادگی LiveData
نیز کار کنید، همانطور که در مثال زیر نشان داده شده است:
val fun getUsersLiveData() : LiveData<List<User>> {
val users: Flowable<List<User>> = dao.findUsers()
return LiveDataReactiveStreams.fromPublisher(users)
}
اتاق KTX
افزونههای اتاق، پشتیبانی کوروتینها را برای تراکنشهای پایگاه داده اضافه میکنند.
برای استفاده از این ماژول، موارد زیر را به فایل build.gradle
برنامه خود اضافه کنید:
شیار
dependencies { implementation "androidx.room:room-ktx:2.6.1" }
کاتلین
dependencies { implementation("androidx.room:room-ktx:2.6.1") }
در اینجا چند نمونه وجود دارد که در آن Room اکنون از کوروتین ها استفاده می کند. مثال اول از یک تابع suspend
برای برگرداندن لیستی از اشیاء User
استفاده می کند، در حالی که نمونه دوم از Flow
Kotlin برای بازگرداندن ناهمزمان لیست User
استفاده می کند. توجه داشته باشید که هنگام استفاده از Flow
، همچنین از هرگونه تغییر در جداول مورد نظر مطلع می شوید.
@Query("SELECT * FROM Users")
suspend fun getUsers(): List<User>
@Query("SELECT * FROM Users")
fun getUsers(): Flow<List<User>>
SQLite KTX
برنامههای افزودنی SQLite کدهای مرتبط با SQL را در تراکنشها پیچیده میکنند و بسیاری از کدهای دیگ بخار را حذف میکنند.
برای استفاده از این ماژول، موارد زیر را به فایل build.gradle
برنامه خود اضافه کنید:
شیار
dependencies { implementation "androidx.sqlite:sqlite-ktx:2.4.0" }
کاتلین
dependencies { implementation("androidx.sqlite:sqlite-ktx:2.4.0") }
در اینجا مثالی از استفاده از پسوند transaction
برای انجام تراکنش پایگاه داده آورده شده است:
db.transaction {
// insert data
}
ViewModel KTX
کتابخانه ViewModel KTX یک تابع viewModelScope()
ارائه میکند که راهاندازی کوروتینها را از ViewModel
شما آسانتر میکند. CoroutineScope
به Dispatchers.Main
متصل است و با پاک شدن ViewModel
به طور خودکار لغو می شود. می توانید به جای ایجاد یک محدوده جدید برای هر ViewModel
از viewModelScope()
استفاده کنید.
برای گنجاندن این ماژول، موارد زیر را به فایل build.gradle
برنامه خود اضافه کنید:
شیار
dependencies { implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4" }
کاتلین
dependencies { implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4") }
به عنوان مثال، تابع viewModelScope()
زیر یک coroutine راهاندازی میکند که درخواست شبکه را در یک رشته پسزمینه ایجاد میکند. کتابخانه تمام تنظیمات و پاکسازی محدوده مربوطه را انجام می دهد:
class MainViewModel : ViewModel() {
// Make a network request without blocking the UI thread
private fun makeNetworkRequest() {
// launch a coroutine in viewModelScope
viewModelScope.launch {
remoteApi.slowFetch()
...
}
}
// No need to override onCleared()
}
WorkManager KTX
WorkManager KTX پشتیبانی درجه یک را برای برنامههای روزمره ارائه میکند.
برای گنجاندن این ماژول، موارد زیر را به فایل build.gradle
برنامه خود اضافه کنید:
شیار
dependencies { implementation "androidx.work:work-runtime-ktx:2.9.1" }
کاتلین
dependencies { implementation("androidx.work:work-runtime-ktx:2.9.1") }
به جای گسترش Worker
، اکنون می توانید CoroutineWorker
گسترش دهید، که API کمی متفاوت دارد. به عنوان مثال، اگر می خواهید یک CoroutineWorker
ساده برای انجام برخی از عملیات شبکه بسازید، می توانید موارد زیر را انجام دهید:
class CoroutineDownloadWorker(context: Context, params: WorkerParameters)
: CoroutineWorker(context, params) {
override suspend fun doWork(): Result = coroutineScope {
val jobs = (0 until 100).map {
async {
downloadSynchronously("https://www.google.com")
}
}
// awaitAll will throw an exception if a download fails, which
// CoroutineWorker will treat as a failure
jobs.awaitAll()
Result.success()
}
}
برای اطلاعات بیشتر در مورد استفاده از CoroutineWorker
، به Threading در CoroutineWorker مراجعه کنید.
WorkManager KTX همچنین توابع افزونه را به Operations
و ListenableFutures
اضافه میکند تا برنامه فعلی را به حالت تعلیق درآورد.
در اینجا مثالی وجود دارد که Operation
که توسط enqueue()
برگردانده شده است به حالت تعلیق در می آورد:
// Inside of a coroutine...
// Run async operation and suspend until completed.
WorkManager.getInstance()
.beginWith(longWorkRequest)
.enqueue().await()
// Resume after work completes...
سایر ماژول های KTX
همچنین میتوانید ماژولهای KTX اضافی را که خارج از AndroidX وجود دارند، اضافه کنید.
Firebase KTX
برخی از Firebase SDK برای Android دارای کتابخانه های افزونه Kotlin هستند که به شما امکان می دهد هنگام استفاده از Firebase در برنامه خود کدهای اصطلاحی Kotlin بنویسید. برای اطلاعات بیشتر به موضوعات زیر مراجعه کنید:
پلتفرم نقشه های گوگل KTX
برنامههای افزودنی KTX برای کیتهای توسعه نرمافزار اندروید پلتفرم نقشههای گوگل موجود است که به شما امکان میدهد از چندین ویژگی زبان Kotlin مانند توابع برنامههای افزودنی، پارامترهای نامگذاری شده و آرگومانهای پیشفرض، اعلانهای تخریب ساختار، و روتینها استفاده کنید. برای اطلاعات بیشتر به موضوعات زیر مراجعه کنید:
بازی Core KTX
Play Core KTX با افزودن توابع افزونه به SplitInstallManager
و AppUpdateManager
در کتابخانه Play Core، از کوروتینهای Kotlin برای درخواستهای تکشات و Flow برای نظارت بر بهروزرسانیهای وضعیت پشتیبانی میکند.
برای گنجاندن این ماژول، موارد زیر را به فایل build.gradle
برنامه خود اضافه کنید:
شیار
dependencies { implementation "com.google.android.play:core-ktx:1.8.1" }
کاتلین
dependencies { implementation("com.google.android.play:core-ktx:1.8.1") }
در اینجا نمونه ای از Flow
نظارت بر وضعیت آمده است:
// Inside of a coroutine...
// Request in-app update status updates.
manager.requestUpdateFlow().collect { updateResult ->
when (updateResult) {
is AppUpdateResult.Available -> TODO()
is AppUpdateResult.InProgress -> TODO()
is AppUpdateResult.Downloaded -> TODO()
AppUpdateResult.NotAvailable -> TODO()
}
}
اطلاعات بیشتر
برای کسب اطلاعات بیشتر در مورد Android KTX، ویدیوی DevBytes را ببینید.
برای گزارش یک مشکل یا پیشنهاد یک ویژگی، از ردیاب مشکل Android KTX استفاده کنید.