Флаттер утилизирует видео и снова использует - PullRequest
0 голосов
/ 11 февраля 2019

Я хочу просмотреть список файлов мультимедиа (изображения, видео и т. Д.), Поэтому у меня есть будущее, которое вызывает себя, чтобы просмотреть список и показать каждый элемент мультимедиа.Я хочу, чтобы он мог воспроизводить видео один за другим, если мой список содержит, например, [видео, видео, изображение, видео], но если я использую следующий способ:

void playVideo(File video) {
  if(playerController != null && playerController.value.initialized) {
    playerController.removeListener(listener);
    playerController.dispose();
  }
  playerController = new VideoPlayerController.file(video);
  playerController.initialize().then((_) => setState(() {}));
  //playerController.setVolume(0.0);
  playerController.play();
  playerController.addListener(listener);
}

и каждый раз вызываю playVideoУ меня есть новое видео для отображения.Если я это сделаю, я получу следующую ошибку:

A VideoPlayerController was used after being disposed.
Once you have called dispose() on a VideoPlayerController, it can no longer be used.

1 Ответ

0 голосов
/ 13 августа 2019

Ниже кода воспроизведения снова нажмите кнопку видео изменить и удалить

class MainScreen extends StatefulWidget {
  MainScreen({Key key}) : super(key: key);

  @override
  _MainScreenState createState() => new _MainScreenState();
}

class _MainScreenState extends State<MainScreen> {
  List<String> urlsVideo = [
    "assets/videos/1.1.mp4",
    "assets/videos/1.2.mp4",
  ];

  int videoPos = 1;

  VideoPlayerController controllerFirst;

  StreamController<bool> streamController = new StreamController();

  @override
  void initState() {
    _startVideoPlayer();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      backgroundColor: Colors.white,
      body: Column(
        children: <Widget>[
          Expanded(
              child: StreamBuilder(
                  stream: streamController.stream,
                  builder: (context, snapshot) {
                    if (snapshot.hasData &&
                        !snapshot.data &&
                        controllerFirst != null) {
                      return VideoPlayer(controllerFirst);
                    } else {
                      return Center(child: CircularProgressIndicator());
                    }
                  })),
          RaisedButton(
            child: Padding(
              padding: const EdgeInsets.all(10.0),
              child: Text("Play Again"),
            ),
            onPressed: () {
              _startVideoPlayer();
            },
          )
        ],
      ),
    );
  }

  Future<void> _startVideoPlayer() async {
    videoPos = videoPos == 0 ? 1 : 0;
    streamController.add(true);
    final VideoPlayerController _controller =
        VideoPlayerController.asset(urlsVideo[videoPos]);
    _controller.addListener(_listener);
    await _controller.setLooping(true);
    await _controller.initialize();
    final VideoPlayerController oldController = controllerFirst;
    if (mounted) {
      setState(() {
        controllerFirst = _controller;
      });
    }
    await _controller.play();
    await oldController?.dispose();
    streamController.add(false);
  }

  get _listener => () {
        if (controllerFirst != null && controllerFirst.value.size != null) {
          if (mounted) setState(() {});
          controllerFirst.removeListener(_listener);
        }
      };
}
...