media_list_view 1.0.0 copy "media_list_view: ^1.0.0" to clipboard
media_list_view: ^1.0.0 copied to clipboard

A Flutter package that extends Photo View to provide a gesture-sensitive, zoomable media list view.

example/main.dart

import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:media_list_view/photo_view.dart';
import 'package:media_list_view/photo_view_gallery.dart';
import 'package:video_player/video_player.dart';

void main() {
  runApp(const MainApp());
}

class MainApp extends StatelessWidget {
  const MainApp({super.key});

  @override
  Widget build(BuildContext context) {
    const img =
        'https://cdn2.tuoitre.vn/thumb_w/480/471584752817336320/2024/7/29/tuoi-tre-cuoi-tram-hoat-hinh-01-1722239999290630742377.jpg';
    const img2 =
        'https://vn.portal-pokemon.com/play/resources/pokedex/img/pm/cf47f9fac4ed3037ff2a8ea83204e32aff8fb5f3.png';
    const listIms = [img, img2];
    const video =
        'https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4';
    const listMedia = [
      img,
      img2,
      video,
      "https://shortpixel.com/blog/wp-content/uploads/2023/12/nyan-cat.gif"
    ];
    return MaterialApp(
      home: Scaffold(
        body: Center(
          // child: PageView.builder(
          //   controller: controller,
          //   itemCount: 4,
          //   itemBuilder: (context, index) {
          //     if (index == 2) {
          //       return const VideoWidget();
          //     } else if (index == 3) {
          //       return const Text("final page");
          //     }
          //     return PhotoAttachmentWidget(
          //       img: listMedia[index],
          //     );
          //   },
          // ),
          child: PhotoViewGallery.builder(
            itemBuilder: (context, index) {
              if (index == 2) {
                return const VideoWidget();
              }
              return PhotoAttachmentWidget(
                img: listMedia[index],
              );
            },
            itemCount: listMedia.length,
          ),
        ),
      ),
    );
  }
}

class PdfViewer extends StatelessWidget {
  final String pdfUrl =
      "https://pdfobject.com/pdf/sample.pdf"; // Replace with your PDF URL

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("PDF Viewer")),
      body: InAppWebView(
        initialUrlRequest: URLRequest(url: WebUri(pdfUrl)),
      ),
    );
  }
}

class PhotoAttachmentWidget extends StatelessWidget {
  const PhotoAttachmentWidget({
    super.key,
    required this.img,
  });
  final String img;
  @override
  Widget build(BuildContext context) {
    return PhotoView(
      imageProvider: NetworkImage(img),
      loadingBuilder: (context, event) =>
          const Center(child: CircularProgressIndicator()),
      errorBuilder: (_, __, ___) => const Center(
        child: Text("Can not load this video"),
      ),
      minScale: 1.0,
      maxScale: 4.0,
      filterQuality: FilterQuality.high,
    );
  }
}

class VideoWidget extends StatefulWidget {
  const VideoWidget({super.key});

  @override
  State<StatefulWidget> createState() => _VideoWidgetState();
}

class _VideoWidgetState extends State<VideoWidget> {
  late VideoPlayerController _controller;
  bool _isPlaying = false;

  @override
  void initState() {
    super.initState();
    _controller = VideoPlayerController.networkUrl(Uri.parse(
        'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4'))
      ..initialize().then((_) {
        setState(() {}); // Update UI after initialization
      });
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  void _togglePlayPause() {
    setState(() {
      if (_controller.value.isPlaying) {
        _controller.pause();
        _isPlaying = false;
      } else {
        _controller.play();
        _isPlaying = true;
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: _controller.value.isInitialized
          ? Stack(
              alignment: Alignment.center,
              children: [
                AspectRatio(
                  aspectRatio: _controller.value.aspectRatio,
                  child: VideoPlayer(_controller),
                ),
                Positioned(
                  bottom: 16,
                  child: FloatingActionButton(
                    onPressed: _togglePlayPause,
                    backgroundColor: Colors.black.withOpacity(0.5),
                    child: Icon(
                      _isPlaying ? Icons.pause : Icons.play_arrow,
                      color: Colors.white,
                    ),
                  ),
                ),
              ],
            )
          : const CircularProgressIndicator(),
    );
  }
}
3
likes
0
points
27
downloads

Publisher

unverified uploader

Weekly Downloads

A Flutter package that extends Photo View to provide a gesture-sensitive, zoomable media list view.

Repository (GitHub)
View/report issues

Documentation

Documentation

License

unknown (license)

Dependencies

flutter, photo_view

More

Packages that depend on media_list_view