Как воспроизвести список видео, хранящихся в папке с активами, на которые есть ссылка в виде массива, с помощью плагина видеоплеера - PullRequest
0 голосов
/ 18 сентября 2018
import 'package:video_player/video_player.dart';
import 'package:flutter/material.dart';

void main() => runApp(VideoApp());

class VideoApp extends StatefulWidget {
  @override
  _VideoAppState createState() => _VideoAppState();
}

class _VideoAppState extends State<VideoApp> {
  var vidlist = [
    'assets/videos/1.mp4',
    'assets/videos/2.m4',
    'assets/videos/3.mp4'
  ];
  VideoPlayerController _controller;
  bool _isPlaying = false;

  @override
  void initState() {
    super.initState();
    _controller = VideoPlayerController.asset(vidlist)
      ..addListener(() {
        final bool isPlaying = _controller.value.isPlaying;
        if (isPlaying != _isPlaying) {
          setState(() {
            _isPlaying = isPlaying;
          });
        }
      })
      ..initialize().then((_) {
        // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed.
        setState(() {});
      });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Video Demo',
      home: Scaffold(
        body: Center(
          child: _controller.value.initialized
              ? AspectRatio(
                  aspectRatio: _controller.value.aspectRatio,
                  child: VideoPlayer(_controller),
                )
              : Container(),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: _controller.value.isPlaying
              ? _controller.pause
              : _controller.play,
          child: Icon(
            _controller.value.isPlaying ? Icons.pause : Icons.play_arrow,
          ),
        ),
      ),
    );
  }
}

Это то, что я сделал. Я попытался создать массив строк, ссылающихся на пути к видео. Однако контроллер видеопроигрывателя не может принимать типы списков. Так как же тогда воспроизвести список видео, хранящихся локально? Я также попытался использовать цикл for в контроллере, но он не работает.

1 Ответ

0 голосов
/ 18 апреля 2019

Я новичок во Флаттере, поэтому я не уверен, что это чистое решение, но работает в моем случае. В соответствии с вашими переменными

    var vdlist = [.......];
    VideoPlayerController _controller;
    //I am not using _isPlaying as variable
    var currentIndexPosition = 0; // Position on the list

    void initState(){
      getFile();
    }

    void getFile(){
        _controller = VideoPlayerController.asset(currentfile)
  ..addListener(() {

    final bool isPlaying =_controller.value.position.inMilliseconds < _controller.value.duration.inMilliseconds;  
  // Tested with the following print
    print("POSITION = " + _controller.value.position.inMilliseconds.toString() + "  DURATION = " + _controller.value.duration.inMilliseconds.toString());

    if (!isPlaying) {
      setState(() {
        nextVideo();
        getFile();
      });
    }})
  ..initialize().then((_) {
    setState(() {
      _controller.play();
    });
  });

  void nextVideo(){
  if(currentIndexPosition < vdlist.length-1){
  currentIndexPosition++;
  }else{ 
  currentIndexPosition = 0;
  }

Надежда может помочь, а также может стать началом для получения улучшенного решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...