'Need help to make Flutter Custom Video Player


I need help to make a custom video player like it .

When we tap on the video or in the icon above the video, the video changes simultaneously with the time. Using flutter package video_player I made that part only here .

But there I have a tons of issues. Also when I trying to add VideoPlayerController.network('~~~~~~'); not working.

Can anyone help me?


import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';

class AssetVideo extends StatefulWidget {
  @override
  AssetVideoState createState() => AssetVideoState();
}

class AssetVideoState extends State<AssetVideo> {
  VideoPlayerController? _controller1, _controller2;
  bool x = true;

  @override
  void initState() {
    super.initState();
    playVideo1();
    playVideo2();
  }

  void playVideo1() {
    _controller1 = VideoPlayerController.assets(
        'assets/v3.mp4');
    _controller1!.addListener(() {
      setState(() {});
    });
    _controller1!.setLooping(true);
    _controller1!.initialize().then((_) => setState(() {}));
    _controller1!.play();
  }

  playVideo2() {
    _controller2 = VideoPlayerController.assets(
        'assets/sample.mp4');

    _controller2!.addListener(() {
      setState(() {});
    });
    _controller2!.setLooping(true);
    _controller2!.initialize().then((_) => setState(() {}));
    // _controller2!.pause();
    _controller2!.play();
  }

  @override
  void dispose() {
    _controller1!.dispose();
    _controller2!.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      child: Column(
        children: <Widget>[
          _controller2!.value.isPlaying
              ? AspectRatio(
                  aspectRatio: _controller2!.value.aspectRatio,
                  child: Stack(
                    alignment: Alignment.bottomCenter,
                    children: [
                      VideoPlayer(_controller2!.value.isPlaying
                          ? _controller2!
                          : _controller1!),
                      VideoController(
                        controller: _controller2!.value.isPlaying
                            ? _controller2!
                            : _controller1!,
                      ),
                      VideoProgressIndicator(
                          _controller2!.value.isPlaying
                              ? _controller2!
                              : _controller1!,
                          allowScrubbing: false),
                    ],
                  ),
                )
              : AspectRatio(
                  aspectRatio: _controller1!.value.aspectRatio,
                  child: Stack(
                    alignment: Alignment.bottomCenter,
                    children: [
                      VideoPlayer(_controller1!),
                      VideoController(
                        controller: _controller1!,
                      ),
                      VideoProgressIndicator(_controller1!,
                          allowScrubbing: false),
                    ],
                  ),
                ),
        ],
      ),
    );
  }
}

class VideoController extends StatefulWidget {
  final VideoPlayerController controller;
  final VideoPlayerController? controller2;
  static const _examplePlaybackRates = [
    0.25,
    0.5,
    1.0,
    1.5,
    2.0,
    3.0,
    5.0,
    10.0,
  ];

  const VideoController({
    required this.controller,
    this.controller2,
  });

  @override
  State<VideoController> createState() => VideoControllerState();
}

class VideoControllerState extends State<VideoController> {
  @override
  Widget build(BuildContext context) {
    return Stack(
      children: <Widget>[
        AnimatedSwitcher(
          duration: const Duration(milliseconds: 50),
          reverseDuration: const Duration(milliseconds: 200),
          child: widget.controller.value.isPlaying
              ? const SizedBox.shrink()
              : Container(
                  color: Colors.black26,
                  child: const Center(
                    child: Icon(
                      Icons.play_arrow,
                      color: Colors.white,
                      size: 100.0,
                      semanticLabel: 'Play',
                    ),
                  ),
                ),
        ),
        GestureDetector(onTap: () {
          widget.controller.value.isPlaying
              ? widget.controller.pause()
              : widget.controller.play();
        }),
      ],
    );
  }
}




Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source