flutter videoPlayerController.addListener() 监听多次。我怎样才能只听一次?

Tan*_*zan 2 dart flutter flutter-dependencies flutter-layout

我想打印视频当前的播放时间(以秒为单位)。但我认为它每秒打印 4 次。 这是 videoPlayerController.addListener 代码。

await videoPlayerController.initialize().then((value) => {
          videoPlayerController.addListener(
            () {
              log(videoPlayerController.value.position.inSeconds.toString);
            },
          )
        });
Run Code Online (Sandbox Code Playgroud)

我希望此 videoPlayerController.value.position.inSeconds 日志每秒仅显示一次。

完整代码

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(() {});
  }
Run Code Online (Sandbox Code Playgroud)

Kau*_*dru 6

收听者将继续收听视频的位置,而不考虑时间。您可以这样做

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(() {});
  }
Run Code Online (Sandbox Code Playgroud)