class YourRepository {
private var counter = 0
fun getDataStream(): Flow = flow {
while (true) {
counter++
val newData = YourDataClass(
info = "Update #$counter",
timestamp = System.currentTimeMillis()
)
emit(newData)
delay(5000)
}
}
}
У меня есть два примера реализации кода, и я хочу знать, какой из них лучший. Мое требование состоит в том, чтобы при поступлении новых данных мне нужно было показывать загрузчик или счетчик, ждать 2 секунды, а затем отображать данные в режиме реального времени. Я хочу знать наиболее эффективный и интуитивно понятный способ добиться этого с помощью Flow и StateFlow.
- Использование FlatMapLatest
private val repository: YourRepository
) : ViewModel() {
// StateFlow for the UI
val uiState: StateFlow = repository
.getDataStream()
.flatMapLatest { data ->
flow {
emit(null) // Show loading initially
delay(2000) // Wait 2 seconds
emit(data) // Show actual data
}
}
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = null
)
}
- Использование трансформирования
private val repository: YourRepository,
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) : ViewModel() {
val uiState: StateFlow = repository.getDataStream()
.transform { newData ->
emit(DataUiState.Updating)
delay(2000)
emit(DataUiState.Success(newData))
}
.flowOn(ioDispatcher)
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000),
initialValue = DataUiState.InitialLoading
)
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... -viewmodel
Мобильная версия