123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- import 'package:flutter/material.dart';
- import 'package:photo_view/photo_view.dart';
- import 'package:veloe_kemono_party_flutter/pages/widgets/video_player_widget';
- import '../models/post.dart';
- class MediaCarouselItem {
- final String url;
- final String type; // 'image' or 'video'
- final int postIndex;
- final int attachmentIndex;
- MediaCarouselItem({
- required this.url,
- required this.type,
- required this.postIndex,
- required this.attachmentIndex,
- });
- }
- class MediaCarouselScreen extends StatefulWidget {
- final int initialIndex;
- final List<MediaCarouselItem> mediaItems;
- final Future<void> Function() loadMorePosts;
- final List<Post> allPosts;
- const MediaCarouselScreen({
- super.key,
- required this.initialIndex,
- required this.mediaItems,
- required this.loadMorePosts,
- required this.allPosts,
- });
- @override
- State<MediaCarouselScreen> createState() => _MediaCarouselScreenState();
- }
- class _MediaCarouselScreenState extends State<MediaCarouselScreen> {
- late PageController _pageController;
- late int _currentIndex;
- late List<MediaCarouselItem> _mediaItems;
- @override
- void initState() {
- super.initState();
- _currentIndex = widget.initialIndex;
- _mediaItems = widget.mediaItems;
- _pageController = PageController(initialPage: widget.initialIndex);
- }
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- backgroundColor: Colors.black,
- body: Stack(
- children: [
- PageView.builder(
- controller: _pageController,
- itemCount: _mediaItems.length,
- onPageChanged: (index) {
- setState(() {
- _currentIndex = index;
- });
- // Check if we are near the end and load more
- if (index >= _mediaItems.length - 3) {
- _loadMoreIfNeeded();
- }
- },
- itemBuilder: (context, index) {
- final item = _mediaItems[index];
- if (item.type == 'image') {
- return PhotoView(
- imageProvider: NetworkImage(item.url),
- backgroundDecoration: const BoxDecoration(color: Colors.black),
- );
- } else {
- return VideoPlayerWidget(videoUrl: item.url);
- }
- },
- ),
- Positioned(
- top: 40,
- left: 20,
- child: IconButton(
- icon: const Icon(Icons.close, color: Colors.white),
- onPressed: () => Navigator.pop(context),
- ),
- ),
- ],
- ),
- );
- }
- Future<void> _loadMoreIfNeeded() async {
- if (_currentIndex >= _mediaItems.length - 3) {
- await widget.loadMorePosts();
- setState(() {
- _mediaItems = _compileMediaItems(widget.allPosts);
- });
- }
- }
- List<MediaCarouselItem> _compileMediaItems(List<Post> posts) {
- List<MediaCarouselItem> items = [];
- for (int i = 0; i < posts.length; i++) {
- final post = posts[i];
- for (int j = 0; j < post.attachments.length; j++) {
- final attachment = post.attachments[j];
- items.add(
- MediaCarouselItem(
- url: attachment.link,
- type: attachment.isImage ? "image" : "video",
- postIndex: i,
- attachmentIndex: j,
- ),
- );
- }
- }
- return items;
- }
- }
|