fApp/lib/mediagrid.dart
2025-05-31 16:40:25 +02:00

79 lines
2.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:f0ckapp/services/api.dart';
import 'package:f0ckapp/models/mediaitem.dart';
import 'package:f0ckapp/screens/detail.dart';
class MediaGrid extends StatefulWidget {
const MediaGrid({super.key});
@override
State createState() => _MediaGridState();
}
class _MediaGridState extends State<MediaGrid> {
final ScrollController _scrollController = ScrollController();
List<MediaItem> mediaItems = [];
bool isLoading = false;
@override
void initState() {
super.initState();
_loadMedia();
_scrollController.addListener(() {
if (_scrollController.position.pixels >= _scrollController.position.maxScrollExtent - 100) {
_loadMedia();
}
});
}
Future<void> _loadMedia() async {
if (isLoading) return;
setState(() => isLoading = true);
try {
List<MediaItem> newMedia = await fetchMedia(older: mediaItems.isNotEmpty ? mediaItems.last.id.toString() : null);
setState(() {
mediaItems.addAll(newMedia);
isLoading = false;
});
} catch (e) {
print('Fehler: $e');
}
}
@override
Widget build(BuildContext context) {
return GridView.builder(
controller: _scrollController,
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
crossAxisSpacing: 8.0,
mainAxisSpacing: 8.0,
),
itemCount: mediaItems.length + (isLoading ? 1 : 0),
itemBuilder: (context, index) {
if (index >= mediaItems.length) {
return const Center(child: CircularProgressIndicator());
}
final item = mediaItems[index];
return GestureDetector(
onTap: () async {
try {
final details = await fetchMediaDetail(item.id);
Navigator.push(
context,
MaterialPageRoute(builder: (context) => DetailView(details: details)),
);
} catch (e) {
print('Fehler beim Laden der Details: $e');
}
},
child: Image.network(item.thumbnailUrl, fit: BoxFit.cover),
);
},
);
}
}