Loader anzeigen, bevor Flow-Daten in ViewModel ausgegeben werdenAndroid

Forum für diejenigen, die für Android programmieren
Anonymous
 Loader anzeigen, bevor Flow-Daten in ViewModel ausgegeben werden

Post by Anonymous »

Ich habe einen Datenstrom vom Server. Der Server gibt keine Auskunft darüber, wann die nächsten Daten eintreffen. Ich habe einen Flow in meinem Repository, der Daten ausgibt, sobald sie eintreffen. In meinem Testaufbau sendet das Repository beispielsweise alle 5 Sekunden Daten aus, aber in Wirklichkeit können die Daten jederzeit eintreffen, und es gibt keine Begrenzung für das Intervall zwischen den Emissionen.

Code: Select all

 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)
}
}
}
Ich habe zwei Beispielcode-Implementierungen und möchte wissen, welche die beste ist. Meine Anforderung besteht darin, dass ich bei jedem Eintreffen neuer Daten einen Loader oder Spinner anzeigen, 2 Sekunden warten und die Daten dann in Echtzeit anzeigen muss. Ich möchte wissen, wie ich dies mit Flow und StateFlow am effizientesten und intuitivsten erreichen kann.
  • Mit flatMapLatest

Code: Select all

 class YourViewModel(
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
)
}
  • Transfrom verwenden

Code: Select all

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post