diff --git a/lib/main.dart b/lib/main.dart index 2f0d15e..e830afa 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,32 +2,15 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:pdfrx/pdfrx.dart'; -import 'package:path_provider/path_provider.dart'; -import 'dart:io'; import 'package:pdf_signature/app.dart'; +import 'package:pdf_signature/utils/pdfrx_cache_init/pdfrx_cache_init.dart'; export 'package:pdf_signature/app.dart'; -Future _initPdfrxCache() async { - try { - // Only set once; guard for hot reload/tests - if (Pdfrx.getCacheDirectory == null) { - final dir = await getTemporaryDirectory(); - final cacheDir = Directory('${dir.path}/pdfrx_cache'); - if (!await cacheDir.exists()) { - await cacheDir.create(recursive: true); - } - Pdfrx.getCacheDirectory = () async => cacheDir.path; - debugPrint('[main] Pdfrx cache directory set to ${cacheDir.path}'); - } - } catch (e, st) { - debugPrint('[main] Failed to initialize Pdfrx cache directory: $e'); - debugPrint(st.toString()); - } -} - Future main() async { WidgetsFlutterBinding.ensureInitialized(); - await _initPdfrxCache(); + // Initialize pdfrx core (safe to call multiple times) and set up cache directory. + pdfrxFlutterInitialize(); + await initPdfrxCache(); // Disable right-click context menu on web using Flutter API if (kReleaseMode) { debugPrint = (String? message, {int? wrapWidth}) { diff --git a/lib/ui/features/pdf/view_model/pdf_view_model.dart b/lib/ui/features/pdf/view_model/pdf_view_model.dart index 5b49cee..2bbcbd8 100644 --- a/lib/ui/features/pdf/view_model/pdf_view_model.dart +++ b/lib/ui/features/pdf/view_model/pdf_view_model.dart @@ -1,3 +1,4 @@ +// ignore_for_file: unnecessary_import import 'dart:typed_data'; import 'package:cross_file/cross_file.dart'; import 'package:flutter/material.dart'; @@ -10,6 +11,7 @@ import 'package:pdfrx/pdfrx.dart'; import 'package:file_picker/file_picker.dart' as fp; import 'package:go_router/go_router.dart'; import 'package:path_provider/path_provider.dart'; +import 'package:flutter/foundation.dart'; class PdfViewModel extends ChangeNotifier { final Ref ref; @@ -322,10 +324,8 @@ class PdfSessionViewModel extends ChangeNotifier { int pageCount = 1; // default try { // Defensive: ensure Pdfrx cache directory set (in case main init skipped in tests) - if (Pdfrx.getCacheDirectory == null) { - debugPrint( - '[PdfSessionViewModel] Pdfrx.getCacheDirectory was null; setting temp directory', - ); + if (Pdfrx.getCacheDirectory == null && !kIsWeb) { + debugPrint('[PdfSessionViewModel] Setting Pdfrx cache directory (io)'); try { final temp = await getTemporaryDirectory(); Pdfrx.getCacheDirectory = () async => temp.path; @@ -336,6 +336,8 @@ class PdfSessionViewModel extends ChangeNotifier { debugPrint(st.toString()); } } + // Ensure engine initialized (safe multiple calls) + pdfrxFlutterInitialize(); final doc = await PdfDocument.openData(bytes); pageCount = doc.pages.length; debugPrint( diff --git a/lib/utils/pdfrx_cache_init/pdfrx_cache_init.dart b/lib/utils/pdfrx_cache_init/pdfrx_cache_init.dart new file mode 100644 index 0000000..939c264 --- /dev/null +++ b/lib/utils/pdfrx_cache_init/pdfrx_cache_init.dart @@ -0,0 +1,3 @@ +// Conditional export: use IO implementation except when compiling for web (html). +export 'pdfrx_cache_init_io.dart' + if (dart.library.html) 'pdfrx_cache_init_web.dart'; diff --git a/lib/utils/pdfrx_cache_init/pdfrx_cache_init_io.dart b/lib/utils/pdfrx_cache_init/pdfrx_cache_init_io.dart new file mode 100644 index 0000000..a7fac52 --- /dev/null +++ b/lib/utils/pdfrx_cache_init/pdfrx_cache_init_io.dart @@ -0,0 +1,26 @@ +import 'dart:io'; +import 'package:flutter/foundation.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:pdfrx/pdfrx.dart'; + +/// Initialize Pdfrx cache directory for IO platforms (mobile/desktop). No-op on web. +Future initPdfrxCache() async { + try { + if (kIsWeb) return; // Guard (should not be used on web, but extra safety) + if (Pdfrx.getCacheDirectory != null) return; // Already set + final dir = await getTemporaryDirectory(); + final cacheDir = Directory('${dir.path}/pdfrx_cache'); + if (!await cacheDir.exists()) { + await cacheDir.create(recursive: true); + } + Pdfrx.getCacheDirectory = () async => cacheDir.path; + debugPrint( + '[pdfrx_cache_init_io] Pdfrx cache directory set to ${cacheDir.path}', + ); + } catch (e, st) { + debugPrint( + '[pdfrx_cache_init_io] Failed to initialize Pdfrx cache directory: $e', + ); + debugPrint(st.toString()); + } +} diff --git a/lib/utils/pdfrx_cache_init/pdfrx_cache_init_web.dart b/lib/utils/pdfrx_cache_init/pdfrx_cache_init_web.dart new file mode 100644 index 0000000..be68e37 --- /dev/null +++ b/lib/utils/pdfrx_cache_init/pdfrx_cache_init_web.dart @@ -0,0 +1,17 @@ +import 'package:flutter/foundation.dart'; +import 'package:pdfrx/pdfrx.dart'; + +/// Web stub: pdfrx can operate without a filesystem cache; leave getCacheDirectory null. +Future initPdfrxCache() async { + // Intentionally no-op. If desired, could set an in-memory indicator. + debugPrint( + '[pdfrx_cache_init_web] Skipping Pdfrx cache directory setup on web', + ); + // Ensure any previous (hot-reload) IO assignment isn't kept when switching target. + if (kIsWeb && Pdfrx.getCacheDirectory != null) { + // Leave as-is; clearing could break existing references. Merely log. + debugPrint( + '[pdfrx_cache_init_web] Existing getCacheDirectory left unchanged', + ); + } +}