Flutter video_player перезапустить видео с начала на кран - PullRequest
0 голосов
/ 07 января 2020

Я использую пакет flutter video_player для воспроизведения короткого видеофайла, используемого в моем приложении. Из вдохновленной поваренной книги я вдохновился: Воспроизведение и приостановка видео .

Я хотел бы разрешить пользователю нажимать на видео, чтобы перезапустить его с самого начала. Поэтому я обернул VideoPlayer GestureDetector .

У меня в настоящее время есть следующий код:

class MyVideoPlayer extends StatefulWidget {
  final File videoFile;

  MyVideoPlayer({Key key, this.videoFile}) : super(key: key);

  @override
  _MyVideoPlayerState createState() => _MyVideoPlayerState();
}

class _MyVideoPlayerState extends State<MyVideoPlayer> {
  VideoPlayerController _controller;
  Future<void> _initializeVideoPlayerFuture;

  @override
  void initState() {
    _controller = VideoPlayerController.file(widget.videoFile);
    _initializeVideoPlayerFuture = _controller.initialize();
    super.initState();
  }

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

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: _initializeVideoPlayerFuture,
      builder: (context, snapshot) {
        print(snapshot.connectionState);
        if (snapshot.connectionState == ConnectionState.done) {
          // Play video once it's loaded
          _controller.play();

          return AspectRatio(
            aspectRatio: _controller.value.aspectRatio,
            child: GestureDetector(
              onTap: () async {
                await _controller.seekTo(Duration.zero);
                _controller.play();
              },
              child: VideoPlayer(_controller),
            ),
          );
        } else {
          return CircularProgressIndicator();
        }
      },
    );
  }
}

Видео воспроизводится хорошо после того, как видео файл загружен (после того, как состояние соединения передано выполненному), однако, когда я пытаюсь нажать на видео, чтобы воспроизвести его во второй раз, оно не воспроизводит видео с самого начала. Звук начинает воспроизводиться снова, но видео не возобновляется. Есть идеи?

РЕДАКТИРОВАТЬ 1

Следуя предложению @ marcosboaventura , я попытался обернуть вызовы в setState , чтобы снова запустите метод сборки:

return AspectRatio(
  aspectRatio: _controller.value.aspectRatio,
  child: GestureDetector(
    onTap: () async {
      await _controller.seekTo(Duration.zero);
      setState(() {
        _controller.play();
      });
    },
    child: VideoPlayer(_controller),
  ),
);

Но видео все равно не воспроизводится, только звук. Любая другая идея?

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Я наконец нашел решение своей проблемы, снова вызвав initialize () на контроллере при событии крана, если видео больше не воспроизводится (т. Е. Видео уже закончено).

return AspectRatio(
  aspectRatio: _controller.value.aspectRatio,
  child: GestureDetector(
    onTap: () {
      if (!_controller.value.isPlaying) {
         setState(() {});
         _controller.initialize();
      }
    },
    child: VideoPlayer(_controller),
  ),
);

Спасибо за вашу помощь.

0 голосов
/ 08 января 2020

Вам нужно перестроить VideoPlayer, если вы что-то изменили при воспроизведении видео. Самое простое решение в вашем случае - просто запустить метод построения огня с помощью вызова setState.

/// ... after some code
child: GestureDetector(
          onTap: () async {
            await _controller.seekTo(Duration.zero);
            setState( () {
              _controller.play();
            } );
          },
          child: VideoPlayer(_controller),
        ),
...