Search code examples
flutterdartflutter-layoutflutter-dependencies

flutter videoPlayerController.addListener() listening multiple times. how can i listen only one time?


I want to print the video's current playback time in seconds. but it's printing 4 times every second I think. here's videoPlayerController.addListener code.

await videoPlayerController.initialize().then((value) => {
          videoPlayerController.addListener(
            () {
              log(videoPlayerController.value.position.inSeconds.toString);
            },
          )
        });

I want this videoPlayerController.value.position.inSeconds log will show only once in a second.

full code

void _initVideoPlayer() async {
    var url = await _extractVideoUrl();
    log('url $url');

    videoPlayerController = VideoPlayerController.network(url);
    await videoPlayerController.initialize().then((value) => {
          videoPlayerController.addListener(
            () {
              log(videoPlayerController.value.position.inSeconds.toString);
            },
          )
        });

    chewieController = ChewieController(
      videoPlayerController: videoPlayerController,
      autoPlay: true,
      looping: false,
      allowedScreenSleep: false,
      allowFullScreen: true,
      showControls: true,
      startAt: _reStoreLastPosition(),
      errorBuilder: (context, errorMessage) {
        return Center(
          child: Text(
            errorMessage,
            style: const TextStyle(color: Colors.white),
          ),
        );
      },
    );
    setState(() {});
  }

Solution

  • The listener will keep listening to the video's position without considering the time.. You can do this instead

    void _initVideoPlayer() async {
        var url = await _extractVideoUrl();
        log('url $url');
        String lastLoggedTime = "";//<--add a variable here
        videoPlayerController = VideoPlayerController.network(url);
        await videoPlayerController.initialize().then((value) => {
              videoPlayerController.addListener(
                () {
    if(lastLoggedTime !=  videoPlayerController.value.position.inSeconds.toString()){  
    lastLoggedTime = videoPlayerController.value.position.inSeconds.toString(); //<--save it here          
    log(videoPlayerController.value.position.inSeconds.toString());
    }
                },
              )
            });
    
        chewieController = ChewieController(
          videoPlayerController: videoPlayerController,
          autoPlay: true,
          looping: false,
          allowedScreenSleep: false,
          allowFullScreen: true,
          showControls: true,
          startAt: _reStoreLastPosition(),
          errorBuilder: (context, errorMessage) {
            return Center(
              child: Text(
                errorMessage,
                style: const TextStyle(color: Colors.white),
              ),
            );
          },
        );
        setState(() {});
      }