如何使用视频播放器插件播放存储在资产文件夹中的视频列表,该列表引用为数组

时间:2018-09-18 09:25:13

标签: flutter

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 :(得分:0)

我是Flutter的新手,因此我不确定这是一个干净的解决方案,但适用于我的情况。 根据您的变量

    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;
  }

希望会有所帮助,这也可能是获得改进解决方案的开始。