import 'dart:html' as html; import 'dart:ui_web' as ui_web; import 'package:flutter/material.dart'; /// Aperçu PDF sur le web : un `iframe` vers l'URL du fichier, donc le lecteur PDF /// natif du navigateur — pagination, zoom et recherche compris. Aucune dépendance /// ajoutée, là où un rendu Dart demanderait `pdfx` ou `syncfusion` et le portage /// de leur worker WASM. /// /// Le fichier doit être servi en `application/pdf` : c'est ce que pose l'upload /// (`resources_screen.create`). Un PDF téléversé avant cette règle peut donc se /// télécharger au lieu de s'afficher. class PdfWebViewer extends StatefulWidget { final String url; const PdfWebViewer({Key? key, required this.url}) : super(key: key); @override State createState() => _PdfWebViewerState(); } class _PdfWebViewerState extends State { /// Une fabrique de vue ne peut être enregistrée qu'une fois par identifiant, /// et l'écran réaffiche le même PDF à chaque clic sur sa vignette. static final Set _registered = {}; late String _viewType; @override void initState() { super.initState(); _register(); } @override void didUpdateWidget(covariant PdfWebViewer oldWidget) { super.didUpdateWidget(oldWidget); if (oldWidget.url != widget.url) _register(); } void _register() { _viewType = 'pdf-preview-${widget.url.hashCode}'; if (_registered.add(_viewType)) { ui_web.platformViewRegistry.registerViewFactory( _viewType, (int _) => html.IFrameElement() ..src = widget.url ..style.border = 'none' ..style.width = '100%' ..style.height = '100%', ); } } @override Widget build(BuildContext context) => HtmlElementView(viewType: _viewType); }