58 lines
1.8 KiB
Dart
58 lines
1.8 KiB
Dart
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<PdfWebViewer> createState() => _PdfWebViewerState();
|
|
}
|
|
|
|
class _PdfWebViewerState extends State<PdfWebViewer> {
|
|
/// 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<String> _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);
|
|
}
|