State Flow и Shared Flow в Котлине
Состояние потока
StateFlowявляется наблюдаемым потоком держателя состояния, который отправляет текущие и новые обновления состояния своим коллекторам.- SharedFlow, представляющий состояние только для чтения с одним обновляемым значением данных, которое отправляет обновления значения своим сборщикам.
- Поток состояний разработан как более эффективная и упрощенная версия существующей библиотеки Flow в Kotlin, с ключевым отличием в том, что он представляет собой одно значение, которое может обновляться с течением времени, тогда как Flow представляет собой последовательность значений.
- Поток состояний использует синтаксис, аналогичный потоку, но вместо создания потока значений он предоставляет одно значение, которое можно обновить с помощью свойства
value. Изменения этого значения автоматически распространяются на всех наблюдателей потока состояний. - Поток состояния является горячим потоком, поскольку его активный экземпляр существует независимо от наличия сборщиков.
- A
StateFlowвсегда активен и находится в памяти, и он становится пригодным для сборки мусора только тогда, когда на него нет других ссылок из корня сборки мусора. - Поток изменяемого состояния создается с помощью
MutableStateFlow(value)функции-конструктора с начальным значением. - Все методы потока состояний потокобезопасны и могут безопасно вызываться из параллельных сопрограмм без внешней синхронизации.
Шаг 1: Создайте класс модели
data class User(val id: Int, val name: String, val email: String)
class UserRepository {
suspend fun getUserById(userId: Int): User {
// make API call to fetch user data
val response = // make API call here
return response.toUser() // convert API response to User object
}
}
class UserViewModel(private val repository: UserRepository) : ViewModel() {
private val _user = MutableStateFlow<User?>(null)
val user: StateFlow<User?> = _user
fun getUserById(userId: Int) = viewModelScope.launch {
_user.value = repository.getUserById(userId)
}
}
class UserFragment : Fragment() {
private val viewModel: UserViewModel by viewModels()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val userId = arguments?.getInt("userId") ?: throw IllegalArgumentException("userId is required")
viewModel.getUserById(userId)
viewModel.user.onEach { user ->
userTextView.text = user?.name ?: "Loading..."
emailTextView.text = user?.email ?: ""
}.launchIn(viewLifecycleOwner.lifecycleScope)
}
}
Общий поток
В Kotlin a SharedFlow— это тип потока, который позволяет нескольким сборщикам получать испускаемые значения от одного производителя. В отличие от обычного Flow, которое является холодным и начинает выдавать значения только при подключении коллектора, a SharedFlowявляется горячим и сразу же начинает выдавать значения всем текущим и будущим коллекторам, как только они будут подключены.
Может SharedFlowбыть полезен в ситуациях, когда вам нужно разделить поток данных между несколькими компонентами вашего приложения, например, когда вы хотите уведомить несколько частей вашего пользовательского интерфейса об изменении некоторых данных.
class MainViewModel : ViewModel() {
private val _items = MutableSharedFlow<List<Item>>()
val items: SharedFlow<List<Item>> = _items
fun startFetchingItems() {
viewModelScope.launch {
while (true) {
val newItems = fetchItemsFromApi()
_items.emit(newItems)
delay(5000)
}
}
}
private suspend fun fetchItemsFromApi(): List<Item> {
// code to fetch items from API
}
}
class MainActivity : AppCompatActivity() {
private lateinit var recyclerView: RecyclerView
private lateinit var adapter: ItemAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerView = findViewById(R.id.recyclerView)
adapter = ItemAdapter(emptyList())
recyclerView.apply {
layoutManager = LinearLayoutManager(this@MainActivity)
setHasFixedSize(true)
this.adapter = [email protected]
}
val viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
lifecycleScope.launchWhenStarted {
viewModel.items.collectLatest { items ->
adapter.updateItems(items)
}
}
viewModel.startFetchingItems()
}
}
collectLatest— это функция более высокого порядка в API Kotlin Flow, которая позволяет вам собирать переданные значения из a Flowи выполнять преобразование только для самого последнего значения. Он похож на collect, который используется для сбора всех сгенерированных значений, но collectLatestобрабатывает только последнее сгенерированное значение и игнорирует все предыдущие значения, которые еще не были обработаны.
Разница между потоком состояния и общим потоком
Вот некоторые ключевые различия между Kotlin SharedFlowи StateFlowв нем:
- Изменяемый и неизменяемый:
StateFlowнеизменяемый держатель данных, представляющий одно значение, которое можно наблюдать, а такжеSharedFlowизменяемый держатель данных, который может выдавать несколько значений. - Обработка ошибок:
StateFlowне имеет встроенной обработки ошибок, ноSharedFlowподдерживаетtryEmitфункцию, которая позволяет безопасно выдавать значения и распространять ошибки на нижестоящие сборщики. - Обработка обратного давления:
StateFlowиспользует стратегию обратного давления, называемую «объединением», которая автоматически отбрасывает промежуточные значения, которые испускаются слишком быстро, чтобы коллектор не успевал за ними.SharedFlowпозволяет более точно контролировать обработку противодавления с помощью его параметровbufferиonBufferOverflow. - Режим широковещания:
SharedFlowпредназначен для широковещательной передачи значений нескольким коллекторам, аStateFlowпредназначен для наблюдения за одним значением. - Сценарии использования:
StateFlowчасто используется для представления единственного источника правды в приложении, такого как текущее состояние компонента пользовательского интерфейса или данных в базе данных.SharedFlowчасто используется в ситуациях, когда несколько частей приложения должны отслеживать один и тот же источник данных, например, в приложении для обмена сообщениями, где нескольким пользователям необходимо наблюдать за одной и той же комнатой чата.
Заключение
Таким образом, Kotlin SharedFlowи StateFlowпредоставляют разработчикам мощные инструменты для реализации шаблонов реактивного программирования в приложениях Android.
StateFlowпредставляет единственное неизменное значение и идеально подходит для представления единого источника правды в вашем приложении.
SharedFlowявляется изменчивым и может выдавать несколько значений, что делает его более подходящим для широковещательной передачи значений нескольким сборщикам.
Каждый из них имеет свои сильные и слабые стороны, и выбор того, какой из них использовать, зависит от конкретных требований вашего приложения.
Надеюсь, эта статья была вам полезна.
Если у вас есть какие-либо отзывы или вопросы, пожалуйста, напишите мне по адресу [email protected]. Мы очень ценим ваши хлопки, ведь они помогают другим найти эту статью .
Повышение уровня кодирования
Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:
- Хлопайте за историю и подписывайтесь на автора
- Смотрите больше контента в публикации Level Up Coding
- Бесплатный курс собеседования по программированию ⇒ Посмотреть курс
- Подписывайтесь на нас: Твиттер | Линкедин | Новостная рассылка

![В любом случае, что такое связанный список? [Часть 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































