Fix PDF loading in public file viewer

- Change PDF viewer to use SfPdfViewer.network instead of loading bytes
- Remove _loadPdfBytes method and _pdfBytes variable
- Use direct network loading for better performance and reliability
- Add onDocumentLoadFailed callback for error handling
- Remove unused dart:typed_data import
This commit is contained in:
Leon Bösche
2026-01-25 15:23:01 +01:00
parent 86f0cb188e
commit a88121d465

View File

@@ -4,7 +4,6 @@ import 'package:web/web.dart' as web;
import 'dart:ui_web' as ui_web; import 'dart:ui_web' as ui_web;
import 'package:syncfusion_flutter_core/theme.dart'; import 'package:syncfusion_flutter_core/theme.dart';
import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart'; import 'package:syncfusion_flutter_pdfviewer/pdfviewer.dart';
import 'dart:typed_data';
import 'package:video_player/video_player.dart'; import 'package:video_player/video_player.dart';
import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/foundation.dart' show kIsWeb;
import '../theme/app_theme.dart'; import '../theme/app_theme.dart';
@@ -27,7 +26,6 @@ class _PublicFileViewerState extends State<PublicFileViewer> {
String? _error; String? _error;
Map<String, dynamic>? _fileData; Map<String, dynamic>? _fileData;
VideoPlayerController? _videoController; VideoPlayerController? _videoController;
List<int>? _pdfBytes;
String? _videoViewType; String? _videoViewType;
@override @override
@@ -52,11 +50,6 @@ class _PublicFileViewerState extends State<PublicFileViewer> {
_isLoading = false; _isLoading = false;
}); });
// Load PDF bytes if it's a PDF file
if (_isPdfFile()) {
await _loadPdfBytes();
}
// Initialize video player if it's a video file // Initialize video player if it's a video file
if (_isVideoFile()) { if (_isVideoFile()) {
await _initializeVideoPlayer(); await _initializeVideoPlayer();
@@ -69,28 +62,6 @@ class _PublicFileViewerState extends State<PublicFileViewer> {
} }
} }
Future<void> _loadPdfBytes() async {
if (_fileData?['viewUrl'] != null) {
try {
final apiClient = getIt<ApiClient>();
// Extract the path from viewUrl and call it directly
final viewUrl = _fileData!['viewUrl'] as String;
final uri = Uri.parse(viewUrl);
final path = uri.path + (uri.query.isNotEmpty ? '?${uri.query}' : '');
final bytes = await apiClient.getBytes(path);
setState(() {
_pdfBytes = bytes;
});
} catch (e) {
// If loading fails, we'll show an error or fallback
setState(() {
_error = 'Failed to load PDF content.';
});
}
}
}
Future<void> _initializeVideoPlayer() async { Future<void> _initializeVideoPlayer() async {
if (!kIsWeb) { if (!kIsWeb) {
// For mobile, use VideoPlayerController // For mobile, use VideoPlayerController
@@ -185,49 +156,34 @@ class _PublicFileViewerState extends State<PublicFileViewer> {
if (viewUrl == null) return const SizedBox(); if (viewUrl == null) return const SizedBox();
if (_isPdfFile()) { if (_isPdfFile()) {
if (_pdfBytes != null) { return Expanded(
return Expanded( child: SfTheme(
child: SfTheme( data: SfThemeData(
data: SfThemeData( pdfViewerThemeData: SfPdfViewerThemeData(
pdfViewerThemeData: SfPdfViewerThemeData( backgroundColor: AppTheme.primaryBackground,
progressBarColor: AppTheme.accentColor,
scrollStatusStyle: PdfScrollStatusStyle(
backgroundColor: AppTheme.primaryBackground, backgroundColor: AppTheme.primaryBackground,
progressBarColor: AppTheme.accentColor, ),
scrollStatusStyle: PdfScrollStatusStyle( scrollHeadStyle: PdfScrollHeadStyle(
backgroundColor: AppTheme.primaryBackground, backgroundColor: AppTheme.accentColor,
),
scrollHeadStyle: PdfScrollHeadStyle(
backgroundColor: AppTheme.accentColor,
),
), ),
), ),
child: SfPdfViewer.memory(
Uint8List.fromList(_pdfBytes!),
canShowScrollHead: false,
canShowScrollStatus: false,
enableDoubleTapZooming: true,
enableTextSelection: false,
),
), ),
); child: SfPdfViewer.network(
} else if (_error != null) { viewUrl,
return Expanded( canShowScrollHead: false,
child: Center( canShowScrollStatus: false,
child: Text( enableDoubleTapZooming: true,
_error!, enableTextSelection: false,
style: TextStyle(color: AppTheme.primaryText), onDocumentLoadFailed: (details) {
textAlign: TextAlign.center, setState(() {
), _error = 'Failed to load PDF content.';
});
},
), ),
); ),
} else { );
return const Expanded(
child: Center(
child: CircularProgressIndicator(
valueColor: AlwaysStoppedAnimation<Color>(AppTheme.accentColor),
),
),
);
}
} else if (_isVideoFile()) { } else if (_isVideoFile()) {
if (kIsWeb && _videoViewType != null) { if (kIsWeb && _videoViewType != null) {
// Use HTML video element for web // Use HTML video element for web