import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:webview_flutter/webview_flutter.dart'; import '../../../../core/theme/app_theme_extension.dart'; class PdfViewerPage extends StatefulWidget { final String url; final String fileName; const PdfViewerPage({super.key, required this.url, required this.fileName}); @override State createState() => _PdfViewerPageState(); } class _PdfViewerPageState extends State { late final WebViewController _webViewController; bool _isLoading = true; @override void initState() { super.initState(); _webViewController = WebViewController() ..setJavaScriptMode(JavaScriptMode.unrestricted) ..setNavigationDelegate( NavigationDelegate( onPageStarted: (String url) { setState(() { _isLoading = true; }); }, onPageFinished: (String url) { setState(() { _isLoading = false; }); }, ), ) ..loadRequest( Uri.parse( 'https://docs.google.com/gview?embedded=true&url=${Uri.encodeComponent(widget.url)}', ), ); } @override Widget build(BuildContext context) { final cs = Theme.of(context).colorScheme; final themeExtras = AppThemeExtras.of(context); return Scaffold( body: Container( decoration: BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: themeExtras.dashboardBackgroundGradient, stops: themeExtras.dashboardGradientStops, ), ), child: Column( children: [ SafeArea( child: Container( padding: const EdgeInsets.all(16), decoration: BoxDecoration( color: cs.surface.withOpacity(0.8), boxShadow: [ BoxShadow( color: cs.shadow.withOpacity(0.1), blurRadius: 8, offset: const Offset(0, 2), ), ], ), child: Row( children: [ IconButton( icon: Icon(Icons.arrow_back, color: cs.onSurface), onPressed: () => Navigator.pop(context), ), const SizedBox(width: 12), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( widget.fileName, style: TextStyle( color: cs.onSurface, fontSize: 18, fontWeight: FontWeight.bold, ), maxLines: 1, overflow: TextOverflow.ellipsis, ), Text( 'Visualização de documento', style: TextStyle( color: cs.onSurfaceVariant, fontSize: 12, ), ), ], ), ), ], ), ), ), Expanded( child: Container( margin: const EdgeInsets.all(16), decoration: BoxDecoration( color: cs.surface, borderRadius: BorderRadius.circular(16), boxShadow: [ BoxShadow( color: cs.shadow.withOpacity(0.1), blurRadius: 12, offset: const Offset(0, 4), ), ], ), child: ClipRRect( borderRadius: BorderRadius.circular(16), child: Stack( children: [ WebViewWidget(controller: _webViewController), if (_isLoading) const Center(child: CircularProgressIndicator()), ], ), ), ), ), ], ), ), ); } }