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 آمده است:

مجموعه 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 خود را دارد که 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 استفاده کنید.