Hướng dẫn Kotlin Flow phần 3: Tìm hiểu SharedFlow và StateFlow cho ứng dụng Android
Chào mừng bạn đến với phần cuối cùng trong loạt bài Kotlin Cheat Sheet. Trong bài viết này, chúng ta sẽ tìm hiểu hai kiểu flow đặc biệt trong Kotlin Flow là SharedFlow và StateFlow. Đây là những công cụ mạnh mẽ giúp chia sẻ trạng thái và sự kiện giữa các thành phần khác nhau trong ứng dụng Android của bạn.
SharedFlow: Khái niệm cơ bản
SharedFlow là một loại hot stream, có thể gửi các giá trị đến nhiều receiver cùng một lúc. Những đặc điểm nổi bật của SharedFlow bao gồm:
- Có thể có nhiều consumer nhận giá trị giống nhau.
- Luôn hoạt động cho đến khi scope của nó bị đóng.
- Có phiên bản có thể thay đổi là
MutableSharedFlow
, cho phép emit các giá trị mới thông qua phương thứcemit
. - Hỗ trợ cấu hình như chế độ replay và tràn buffer.
Các tham số cấu hình của MutableSharedFlow
kotlin
public fun <T> MutableSharedFlow(
replay: Int = 0,
extraBufferCapacity: Int = 0,
onBufferOverflow: BufferOverflow = BufferOverflow.SUSPEND
): MutableSharedFlow<T>
Chuyển đổi Flow thành SharedFlow
Sử dụng shareIn
để biến một Flow thành SharedFlow:
kotlin
myFlow.shareIn(
scope = viewModelScope,
started = SharingStarted.Lazily
)
Trường hợp sử dụng: Quan sát thay đổi từ cơ sở dữ liệu
Nếu bạn sử dụng Room, bạn có thể sử dụng SharedFlow để tránh việc đọc dữ liệu nhiều lần từ đĩa:
kotlin
suspend fun getUserSettings(): SharedFlow<List<UserSettings>> {
return dao.getAll().shareIn(
scope = this,
started = SharingStarted.Lazily,
replay = 1
)
}
StateFlow: Khái niệm cơ bản
StateFlow là một biến thể của SharedFlow nhưng chỉ lưu trữ một giá trị nhất định duy nhất. Tương tự như LiveData
, StateFlow có thể được sử dụng để quản lý trạng thái trong ứng dụng:
kotlin
val state = MutableStateFlow("A") // Giá trị ban đầu
state.value = "B" // Đặt giá trị thành B
Chuyển đổi Flow thành StateFlow
Sử dụng stateIn
để chuyển một Flow thành StateFlow:
kotlin
val myState: StateFlow<MyState> = myFlow
.map { /* xử lý dữ liệu */ }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), MyState.Loading)
Kết thúc
Cảm ơn bạn đã theo dõi chuỗi bài viết về Kotlin Flow. Hy vọng rằng những kiến thức này sẽ giúp bạn tự tin hơn trong việc làm việc với Kotlin Coroutines và Flow trong các ứng dụng Android của mình. Hãy tiếp tục khám phá thế giới lập trình Kotlin và đón chờ những bài viết tiếp theo nhé!
Tài nguyên tham khảo
Bài viết được cung cấp bởi Henry Techie. Theo dõi chúng tôi trên:
- Blog: henrytechie.com
- Facebook: Henry Techie
- TikTok: @henrytechie
source: viblo