Jeder untergeordnete Bildschirm kann auf unterschiedliche Weise ein PDF generieren:
- Einer lädt es aus dem Internet herunter.
- Ein anderer generiert es lokal.
- Ein anderer erstellt es möglicherweise aus Datenbankdaten.
- Zeigen Sie das PDF an.
- Senden Sie es per E-Mail.
- Drucken Sie es aus.
- Jeder untergeordnete Bildschirm speichert das generierte PDF in seinem eigenen uiState.
- Im untergeordneten Composable verwende ich einen LaunchedEffect, um zu erkennen, wann sich das
PDF ändert. - Wenn es sich ändert, rufe ich eine Funktion im übergeordneten Element auf und übergebe das PDF
nach oben.
Code: Select all
composable(InfractionsDestinations.Pending.name) {
PendingScreen(
infractions = uiState.pendingInfractions,
onPDFDisplayRequested = { pdf ->
vm.showPDF(pdf = pdf)
}
)
}
Untergeordnetes ViewModel:
Code: Select all
data class PendingScreenUiState(
val loading: Boolean = false,
val pdf: PDF? = null
)
class PendingScreenViewModel : ViewModel() {
private val _uiState = MutableStateFlow(PendingScreenUiState())
val uiState: StateFlow
= _uiState
fun buildPDF(context: Context, infraction: InfractionWithDetails) {
viewModelScope.launch {
val pdfFile = PDFUtils.generateProvisionalPDF(context, infraction)
if (pdfFile.exists()) {
val bulletinPDF = PDF(pdfFile)
_uiState.update { it.copy(pdf = bulletinPDF) }
}
}
}
}
Code: Select all
@Composable
fun PendingScreen(
infractions: List,
vm: PendingScreenViewModel = koinViewModel(),
onPDFDisplayRequested: (PDF) -> Unit
) {
val uiState by vm.uiState.collectAsStateWithLifecycle()
LaunchedEffect(uiState.pdf) {
uiState.pdf?.let { onPDFDisplayRequested(it) }
}
// ... rest of the UI
}
Im Moment fühle ich mich gezwungen, das PDF sowohl im untergeordneten als auch im übergeordneten Status zu duplizieren, was sich nicht richtig anfühlt. Gibt es ein empfohlenes Muster, um die PDF-Verarbeitung im übergeordneten Element zu zentralisieren und es dennoch jedem untergeordneten Element in seinem eigenen ViewModel generieren zu lassen?
Mobile version