Как автоматически приостанавливать видео при прокрутке / когда плеер не отображается на экране во время флаттера

#flutter #android-studio #dart #video #video-player

Вопрос:

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

Видеоплеер, который я использую (flick_video_player), имеет зависимость от video_player.

Ответы очень ценятся. С уважением

Комментарии:

1. (Ну, если бы вы опубликовали какой-то код, нам не нужно было бы угадывать детали) Если вы используете ListView.builder , вы можете приостановить свое видео методом dispose (опять же, при условии, что ваше видео завернуто в виджет с отслеживанием состояния).

Ответ №1:

Я думаю, что вы можете использовать детектор видимости для этой цели-

 VisibilityDetector(
                            key: ObjectKey(flickManager),
                            onVisibilityChanged: (visibility){
                              if (visibility.visibleFraction == 0 amp;amp; this.mounted) {
                                flickManager?.flickControlManager?.pause();//pausing  functionality 
                              }

                            },
                            child: Container(
                              child: AspectRatio(
                                aspectRatio: 1280/720,
                                child: FlickVideoPlayer(
                                    flickManager: flickManager
                                ),
                                /*VideoPlayer(
                                    video_controller
                                ),*/
                              ),
                            ),
                          ),
 

Я работал над чем-то подобным. Для получения дополнительной информации, например, как воспроизвести ее снова и многое другое, вы можете обратиться к этому репо — https://github.com/GeekyAnts/flick-video-player/tree/master/example/lib/feed_player

Надеюсь, это помогло!

Комментарии:

1. Проблема была решена аналогичным образом. Спасибо.

Ответ №2:

Может быть, этот пакет детекторов видимости может помочь https://pub.dev/packages/visibility_detector

Комментарии:

1. спасибо за предложение, я уже использовал детектор видимости. Пришлось кое-что подправить тут и там 🙂

Ответ №3:

Оберните свой список видео буквой а NotificationListener и послушайте, начал ли пользователь или прекратил прокрутку. Используйте это значение для воспроизведения или приостановки видео.

Правка: неправильно истолковал ваш вопрос. Это будет работать для приостановки после прокрутки пользователем. Если вы хотите определить, находится ли видео в текущем режиме просмотра, проверьте список прокрутки.

 return NotificationListener(
  onNotification: (notificationInfo) {
    if (notificationInfo is ScrollStartNotification) {
      // Set a state value to indicate the user is scrolling
    }
    if (notificationInfo is ScrollEndNotification) {
      // Set a state value to indicate the user stopped scrolling
    }
    return true;
  },
  child: YourVideos(),
);
 

Комментарии:

1. Спасибо за предложение, это может быть очень интуитивный способ его решения. Я, однако, смог решить эту проблему, посмотрев на один из примеров зависимостей, и мне пришлось немного подправить 🙂 Ваше здоровье!

2. Я даже не знал, что VisibilityDetector-это вещь, кажется, очень удобный инструмент, спасибо!

3. @Rohit Можете ли вы намекнуть, как вы решили эту проблему?

Ответ №4:

Это именно то, что вам нужно, inview_notifier_list:

 InViewNotifierList(
  isInViewPortCondition:
      (double deltaTop, double deltaBottom, double vpHeight) {
    return deltaTop < (0.5 * vpHeight) amp;amp; deltaBottom > (0.5 * vpHeight);
  },
  itemCount: 10,
  builder: (BuildContext context, int index) {
    return InViewNotifierWidget(
      id: '$index',
      builder: (BuildContext context, bool isInView, Widget child) {
        return Container(
          height: 250.0,
          color: isInView ? Colors.green : Colors.red,
          child: Text(
            isInView ? 'Is in view' : 'Not in view',
          ),
        );
      },
    );
  },
);
 

Комментарии:

1. Спасибо за ваше предложение. Я сделал несколько настроек здесь и там, посмотрев на пример dependecy, и смог его решить :). Непременно попробовал бы ваш подход, если бы я застрял в будущем… Овации