Ich habe den Code wie folgt geschrieben.
suspend fun getDataByRegion(): Flow<Result?> {
// getRegion() return Flow<Region>
return getRegion().map { region: Region ->
repository.requestDataFromServer(region)
}
}
Das Problem ist, dass repository.requestDataFromServer(region) zweimal aufgerufen wird.
Also denke ich, ich sollte Operatoren wie zip
oder verwenden combine
.
Wie kann bei Verwendung dieser Operatoren der zweite Flow die Daten des ersten Flows verwenden?
Lösung des Problems
Bei den Operatoren combine
und zip
können Sie sich nicht auf das Ergebnis des anderen verlassen. Im Allgemeinen ist Ihr Verkettungsansatz map
also in Ordnung.
Sie haben mehrere Möglichkeiten:
Angenommen, Ihre Repository-Methode wird nirgendwo anders aufgerufen, liegt der Grund für den zweimaligen Aufruf darin, dass die Region
Flow
zweimal emittiert. Versuchen Sie also herauszufinden, warum dies der Fall ist.Wie auch immer, wenn Ihre Regionsmethode
Flow
dieselbe Region zweimal zurückgibt, können Sie sie beheben, indem Sie einfach
.distinctUntilChanged()
nachher hinzufügengetRegion()
:getRegion().distinctUntilChanged().map { region: Region ->
repository.requestDataFromServer(region)
}Dadurch wird sichergestellt, dass Ihre Region
Flow
nicht redundant mit denselben Daten emittiert. AlternativdistinctUntilChanged()
direkt zur Repository-Methode hinzufügen, wenn dies immer das erwartete Verhalten ist.Fragen Sie sich, ob diese Methode wirklich einen Stream zurückgeben muss (
Flow
). Ich schätze, Sie brauchen einen Stream, da sich die Region zur Laufzeit ändern kann und Sie möchten, dass etwas in Ihrer App automatisch aktualisiert wird? Aber wenn nicht, könnten Sie den Stream einfach in ein einzelnes Ergebnis konvertieren:val region = getRegion().first()
repository.requestDataFromServer(region)
Keine Kommentare:
Kommentar veröffentlichen