+2

Android KTX

Android KTX là một tập hợp của những Kotlin extensions được đính kèm với Android Jetpack và một số thư viện Android khác. KTX extensions cung cấp những code ngắn gọn và dễ hiểu cho Kotlin Jetpack, Android Platforms và một số APIs khác. Để làm được như vậy, các extensions này tận dụng một số tính năng của Kotlin, bao gồm :

  • Extension functions
  • Extension properties
  • Lambdas
  • Named parameters
  • Parameter default values
  • Coroutines. Ví dụ, khi bạn làm việc với SharedPreferences, bạn phải tạo một editor để có thể thao tác được với dữ liệu. Bạn cần phải apply hoặc commit những thay đổi trước khi finish việc sửa đổi, như đoạn code dưới đây :
sharedPreferences
        .edit()  // create an Editor
        .putBoolean("key", value)
        .apply() // write to disk asynchronously

Việc sử dụng Kotlin lambdas là rất ngắn ngọn và dễ hiểu trong trường hợp này, ví dụ :

// 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) }

Dòng trên là sử dụng cho trường hợp bạn apply(), dòng dưới là cho trường hợp bạn muốn sử dụng commit(). Trông code rất gọn và dễ hiểu đúng không. Trên đây sử dụng inline extension functions được cung cấp bởi thư viện Android KTX.

1. Use Android KTX in your project

Để sử dụng Android KTX, bạn hãy thêm dependency sau vào file build.gradle :

repositories {
    google()
}

2. AndroidX Modules

Android KTX được tổ chức theo các modules, các modules chứa một hoặc nhiều package. Bạn phải thêm dependencies tương ứng với các version vào file build.gradle trong app.

Android KTX chứa một single core module, nó cung cấp các Kotlin extensions cho API framework chung.

Ngoại trừ core module, tất cả các module KTX đều có thể thay thế được các dependencies Java cơ bản trong file build.gradle. Ví dụ, bạn có thể thay thế androidx.fragment:fragment sang androidx.fragment:fragment-ktx, cú pháp này giúp bạn quản lý các version tốt hơn và không cần phải thêm các dependency bổ sung nào khác.

3. Core KTX

Core KTX cung cấp các extensions cho các thư viện chung, các thư viện này không có Java-based dependencies mà bạn cần phải thêm vào file build.gradle.

Để thêm module này vào build.gradle, hãy thêm dependency sau vào file build.gradle :

dependencies {
    implementation "androidx.core:core-ktx:1.3.2"
}

Dưới đây là list package được chứa trong module Core KTX :

  • androidx.core.animation
  • androidx.core.content
  • androidx.core.content.res
  • androidx.core.database
  • androidx.core.database.sqlite
  • droidx.core.graphics
  • droidx.core.graphics.drawable
  • droidx.core.location
  • droidx.core.net
  • droidx.core.os
  • droidx.core.text
  • droidx.core.transition
  • droidx.core.util
  • droidx.core.view
  • droidx.core.widget

4. Collection KTX

Collection KTX extensions chứa các function tiện ích để làm việc với các thư viện liên quan đến bộ nhớ của Android, bao gồm ArrayMap, LongSparseArray, LruCache và một số thành phần khác.

Để sử dụng được module này, cần thêm dependency vào file build.gradle như sau :

dependencies {
    implementation "androidx.collection:collection-ktx:1.1.0"
}

Collection extension tận dụng lợi thế của toán tử overload của Kotlin để đơn giản hóa một số thứ như là việc nối collections như sau :

// 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

5. Fragment KTX

Fragment KTX cung cấp một số tiện ích mở rộng để đơn giản hóa Fragment API.

Để include module này, thêm dependency như sau :

dependencies {
    implementation "androidx.fragment:fragment-ktx:1.2.5"
}

Với module Fragment KTX, bạn có thể đơn giản hóa việc chuyển đổi fragment bằng cách sử dụng lambda như sau :

fragmentManager().commit {
   addToBackStack("...")
   setCustomAnimations(
           R.anim.enter_anim,
           R.anim.exit_anim)
   add(fragment, "...")
}

Bạn cũng có thể bind một ViewModel chỉ với một dòng bằng cách sử dụng viewModelsactivityViewModels :

// 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>()

6. Lifecycle KTX

Lifecycle KTX định nghĩa một LifecycleScope cho mỗi đối tượng Lifecycle. Bất kỳ coroutine nào chạy trong scope này cũng sẽ bị cancel nếu như Lifecycle đó bị destroy. Bạn cũng có thể truy cập vào CoroutineScope của Lifecycle bằng cách sử dụng lifecycle.coroutineScope hoặc lifecycleOwner.lifecycleScope .

Để include module này, sử dụng dependency sau :

dependencies {
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.2.0"
}

Ví dụ dưới đây thể hiện làm cách nào sử dụng lifecycleOwner.lifecycleScope để tạo ra text không đồng bộ:

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)
        }
    }
}

7. LiveData KTX

Bạn có thể sử dụng LiveData KTX cho việc tính toán không đồng bộ. Ví dụ bạn muốn tính toán gì đó rồi update UI, LiveData KTX cung cấp cho bạn một liveData builder function được gọi là suspen, nó truyền ra kết quả là một liveData object.

Để include module này, bạn implement dependency sau :

dependencies {
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0"
}

Ở ví dụ sau, loadUser() được coi là một suspen function. Bạn có thể sử dụng liveData builder fuction để gọi hàm không đồng bộ loadUser(), và sau đó dùng emit() để bắn ra kết quả :

val user: LiveData<User> = liveData {
    val data = database.loadUser() // loadUser is a suspend function.
    emit(data)
}

Để biết thêm thông tin về cách sử dụng coroutine với LiveData, hãy xem Use Kotlin coroutines with Architecture components .

8. Navigation KTX

Mỗi thành phần của thư viện Navigation đều có một phiên bản KTX của riêng nó, giúp viết code ngắn gọn và dễ hiểu hơn.

Để thêm module, thêm dependency sau vào file build.gradle :

dependencies {
    implementation "androidx.navigation:navigation-runtime-ktx:2.3.2"
    implementation "androidx.navigation:navigation-fragment-ktx:2.3.2"
    implementation "androidx.navigation:navigation-ui-ktx:2.3.2"
}

Sử dụng extension function để truyền tham số và điều hướng đến một đích đến nào đó, như ví dụ dưới đây:

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)
            }
     }
     ...

}

9. ViewModel KTX

Thư viện ViewModel KTX cung cấp một hàm viewModelScope(), nó giúp dễ dàng launch coroutines từ ViewModel. Bạn có thể sử dụng viewModelScope() thay vì tạo mới một scope cho mỗi ViewModel.

Để include module này, thêm dependency sau:

dependencies {
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
}

Như ví dụ dưới đây, hàm viewModelScope() laucnch một coroutine mà nó request tới network từ background thread. Thư viện xử lý tất các setup và phản hồi một cách rõ ràng như sau:

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()
}

10. Other KTX modules

Bạn cũng có thể tìm hiểu thêm về các modules KTX theo như danh sách dưới đây :

Tham khảo

Android KTX


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí