Каждый дочерний экран может создавать PDF-файл разными способами:
- Один загружает его из Интернета.
- Другой создает его локально.
- Другой может создавать его на основе данных базы данных.
- Отобразить PDF-файл.
- Отправить его по электронной почте.
- Распечатать.
- Каждый дочерний экран сохраняет сгенерированный PDF-файл в своем собственном uiState.
- В дочернем компоненте я использую LaunchedEffect, чтобы определить, когда
PDF изменяется. - Когда он меняется, я вызываю функцию в родительском элементе, передавая PDF
вверх.
Код: Выделить всё
composable(InfractionsDestinations.Pending.name) {
PendingScreen(
infractions = uiState.pendingInfractions,
onPDFDisplayRequested = { pdf ->
vm.showPDF(pdf = pdf)
}
)
}
Дочерняя модель представления:
Код: Выделить всё
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) }
}
}
}
}
Код: Выделить всё
@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
}
Сейчас я чувствую себя вынужденным дублировать PDF-файл как в дочернем, так и в родительском состояниях, что кажется неправильным. Существует ли рекомендуемый шаблон для централизации обработки PDF-файлов в родительском элементе, при этом позволяя каждому дочернему элементу генерировать его в своей собственной модели представления?
Подробнее здесь: https://stackoverflow.com/questions/798 ... assing-par
Мобильная версия