improve page loading

This commit is contained in:
2025-07-25 17:49:40 +02:00
parent 9bc6444d3f
commit a8c41c4b35

View File

@@ -9,8 +9,11 @@ class SheetViewerPage extends StatefulWidget {
final Sheet sheet; final Sheet sheet;
final ApiClient apiClient; final ApiClient apiClient;
const SheetViewerPage( const SheetViewerPage({
{super.key, required this.sheet, required this.apiClient}); super.key,
required this.sheet,
required this.apiClient,
});
@override @override
State<SheetViewerPage> createState() => _SheetViewerPageState(); State<SheetViewerPage> createState() => _SheetViewerPageState();
@@ -21,11 +24,13 @@ class _SheetViewerPageState extends State<SheetViewerPage> {
int page = 1; int page = 1;
int numPages = 1; int numPages = 1;
bool isFullscreen = false; bool isFullscreen = false;
late Future<bool> documentLoaded;
PdfDocument? document; PdfDocument? document;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
documentLoaded = loadPdf();
} }
@override @override
@@ -34,15 +39,15 @@ class _SheetViewerPageState extends State<SheetViewerPage> {
super.dispose(); super.dispose();
} }
Future<PdfDocument> loadPdf() async { Future<bool> loadPdf() async {
var file = await widget.apiClient.getPdfFileCached(widget.sheet.uuid); var file = await widget.apiClient.getPdfFileCached(widget.sheet.uuid);
if (file == null) { if (file == null) {
throw Exception("Failed fetching pdf file"); throw Exception("Failed fetching pdf file");
} }
var document = await PdfDocument.openFile(file.path); document = await PdfDocument.openFile(file.path);
return document; return true;
} }
void toggleFullscreen() { void toggleFullscreen() {
@@ -50,85 +55,98 @@ class _SheetViewerPageState extends State<SheetViewerPage> {
if (isFullscreen) { if (isFullscreen) {
log.info("enter fullscreen"); log.info("enter fullscreen");
// enter fullscreen // enter fullscreen
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky, SystemChrome.setEnabledSystemUIMode(
overlays: []); SystemUiMode.immersiveSticky,
overlays: [],
);
} else { } else {
// exit fullscreen // exit fullscreen
log.info("exit fullscreen"); log.info("exit fullscreen");
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge, SystemChrome.setEnabledSystemUIMode(
overlays: SystemUiOverlay.values); SystemUiMode.edgeToEdge,
overlays: SystemUiOverlay.values,
);
} }
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(title: Text(widget.sheet.name)),
title: Text(widget.sheet.name),
),
body: FutureBuilder( body: FutureBuilder(
future: loadPdf(), future: documentLoaded,
builder: (BuildContext context, AsyncSnapshot<PdfDocument> snapshot) { builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
if (snapshot.hasData) { if (snapshot.hasData && document != null) {
document = snapshot.data; numPages = document!.pages.length;
if (document != null) {
numPages = document!.pages.length;
}
return GestureDetector(
onTapUp: (TapUpDetails details) {
// Get the size of the screen
final screenWidth = MediaQuery.of(context).size.width;
// print("Touch at y = ${details.localPosition.dy}"); return GestureDetector(
// print("Touch at x = ${details.localPosition.dx}"); onTapUp: (TapUpDetails details) {
// print("Screenwidth = ${screenWidth}"); // Get the size of the screen
// Check where the user tapped final screenWidth = MediaQuery.of(context).size.width;
// if (details.localPosition.dy < 100) {
// TODO // print("Touch at y = ${details.localPosition.dy}");
// setState(() { // print("Touch at x = ${details.localPosition.dx}");
// toggleFullscreen(); // print("Screenwidth = ${screenWidth}");
// }); // Check where the user tapped
if (details.localPosition.dx < screenWidth / 2) { // if (details.localPosition.dy < 100) {
// Left half of the screen // TODO
setState(() { // setState(() {
page = page > 1 ? page - 1 : 1; // toggleFullscreen();
}); // });
} else { if (details.localPosition.dx < screenWidth / 2) {
// Right half of the screen // Left half of the screen
setState(() { setState(() {
page = page < numPages ? page + 1 : numPages; page = page > 1 ? page - 1 : 1;
}); });
} } else {
}, // Right half of the screen
child: Stack( setState(() {
children: [ page = page < numPages ? page + 1 : numPages;
PdfPageView( });
key: ValueKey(page), }
document: document, },
pageNumber: page, child: Row(
alignment: Alignment.center, mainAxisAlignment: MainAxisAlignment.center,
), children: [
Container( Stack(
alignment: Alignment.bottomCenter, children: [
padding: EdgeInsets.only(bottom: 5), PdfPageView(
child: Text('$page / $numPages'), key: ValueKey(page),
), document: document,
], pageNumber: page,
), alignment: Alignment.center,
); ),
} else if (snapshot.hasError) { Container(
return Center( alignment: Alignment.bottomCenter,
child: Text( padding: EdgeInsets.only(bottom: 5),
style: Theme.of(context) child: Text('$page / $numPages'),
.textTheme ),
.displaySmall! ],
.copyWith(color: Colors.red), ),
textAlign: TextAlign.center, // PdfPageView(
snapshot.error.toString())); // key: ValueKey(page),
} else { // document: document,
return const Center(child: CircularProgressIndicator()); // pageNumber: page + 1,
} // alignment: Alignment.center,
}), // ),
],
),
);
} else if (snapshot.hasError) {
return Center(
child: Text(
style: Theme.of(
context,
).textTheme.displaySmall!.copyWith(color: Colors.red),
textAlign: TextAlign.center,
snapshot.error.toString(),
),
);
} else {
return const Center(child: CircularProgressIndicator());
}
},
),
); );
} }
} }