Código fuente del creador de páginas
La pantalla de clase pdf extiende el widget con estado {
Cadena final;
? Ruta final de la cadena;
? título de cadena final;
? PDFScreen({Clave clave, esta.url, esta.ruta, este.título}):super(Clave:Clave);
? _ pdfscreenstate createstate()= > _ pdf screenstate();
}
clase _ pdfscrenstateextiende el estado con WidgetsBindingObserver {
Final Completer_Controller =
Completo();
? int páginas = 0;
? intcurrentPage = 0;
? boolisReady = false
? StringerrorMessage = "";
? @portada
? Widgetbuild(contexto BuildContext){
Volver andamio(
appBar:AppBar(
elevación: 0,
principal: nuevo botón de icono (
Icono: Image.asset(
Utils.getImgPath('icon_back '),
Ancho: 18,
Alto: 36,
? onPressed: () {
pop();
},
),
Título central: Sí,
Título: Texto (
widget.title,
?Style:TextStyle(fontSize:17.0),
?),
?Text:Stack(
Niños:[
Posicionado(
altura:consulta de medios . de (contexto). tamaño . altura-(utils . getheightsize(80, contexto) *2),
?width:media query.of(context).size.width,
?Subproyecto:PDFView(
filePath:widget.path,
enableSwipe: verdadero,
deslizarHorizontal: verdadero,
espaciado automático: falso,
pageFling: verdadero,
pageSnap:Sí,
defaultPage:currentPage
fitPolicy: FitPolicy.
Ambos,
Prevención de navegación:
falso, //Si se establece en verdadero, los enlaces se procesan en flutter
onRender: (_pages) {
setState(() {
páginas = _ páginas
isReady = true
?});
},
onError:(error){
setState(() {
mensaje de error = error . tostring();
> }) ;
? print(error . tostring());
},
onPageError:(página, error){
setState(() {
mensaje de error = ' $ página:$ { error .tostring()} ';
});
? print(' $ página:$ { error . tostring()} ');
},
onview creado:(controlador de vista pdf controlador de vista pdf){
_ controlador .complete(controlador de vista pdf);
},
onLinkHandler:(cadena uri) {
print(' ir a uri:$ uri ');
},
onPageChanged: (int página, int total) {
print('Cambio de página: $ página/$ total ');
? setState(() {
currentPage = página
?});
},
? ),
? ),
? Posicionado (
Abajo: 0,
? alto: Utils.getHeightSize(80, contexto),
? ancho: consulta de medios. de (contexto). tamaño . ancho,
? niño: contenedor (
// relleno: EdgeInsets.only (izquierda: 10.0, derecha: 10.0, arriba: 10.0, abajo: 10.0), < / p>
Decoración:BoxDecoration(
Color: color. Blanco,
?border: borde. todo(color:colores de la aplicación. tono Gary),
? boxShadow: [
//Referencia:/video/6443
Box Shadow (
Color:AppColors.shadeGary,
desplazamiento:Desplazamiento(0.0, 0.0),
Radio de desenfoque: 3.0,
Radio de difusión: 0.0),
],
),
Niños: pila(
Niños:[
fila(
mainAxisSize: MainAxisSize.min,
?Niños:[
Contenedor(),
Expandir(Niños:SizeBox()),
Contenedor(
Alto: 42,0,
? ancho: Utils.getWidthSize(90, contexto),
?
argin:EdgeInsets.only(derecha:20.0, abajo:5.0),
? Decoración: BoxDecoration(//Línea de borde
borderRadius: borderRadius . circular(21.0),? //Esquinas redondeadas
Degradado: degradado lineal (
Color: [Color(0xFF5FD27A), Color(0xFF3FAF6F)],
),
),
? child:TextButton(
Estilo:ButtonStyle(
color de superposición:materialstateproperty . all(colores . transparente),
?foreground color:materialstateproperty . resolver con(
(Estado){
if(Estados. Contiene(estado del material. Presionado)){
//Color al presionar
Return Colors.transparent
? }
//El estado predeterminado es gris
? Return Colors.transparent
}, p>
? ),
),
Niños: texto(
traducciones globales . texto(" msg _ download ").
? Estilo:TextStyle(color:Colors.white),
),
onPressed: () {
launchPdfURL(widget .URL) ;
},
),
),
? ],
),
? ],
),
? )),
? errorMessage.isEmpty
! isReady
centro(
niño:indicador de progresión circular(),
?)
:contenedor()
:center(
niño:Texto(mensaje de error),
?)
],
? ),
? //botón de acción flotante: futuro constructor(
//?Future:_controller.future,
//?Builder: (contexto, instantánea asíncrona){
// if (snapshot.hasData) {
// ?return botón de acción flotante extendido(
// label: Text("Ir a ${pages ~/ 2 } ",
// onPressed: () async {
// ?esperar instantánea . datos . configurar página(páginas ~/2);
/ / },
// ?);
// }
//
//Devolver contenedor();< / p>
//?},
// ),
);
? }
launchPdfURL(String url) {
Launch(URL);
? }
}