You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter视频重复播放5次异常:首次正常后续无法重启

视频重复播放5次失败问题排查与修复

问题场景

要实现视频重复播放5次的功能,首次播放正常,但视频结束后无法再次启动,反而直接触发多次计数跳至5次。

原监听器代码

void listenerController() async {
    if (controller.value.isCompleted && (!bVideoController)) {
      bVideoController = true;
      print("completed: ${controller.value.isCompleted}");
      view[indexVideo]++;
      print("Views: ${view[indexVideo]}");
      if (view[indexVideo] < 5) {
        await controller.seekTo(Duration.zero);
        await controller.play();
        print("Re Play -> completed: ${controller.value.isCompleted}");
        print("position video: ${controller.value.position}");
        bVideoController = false;
      }
    }
  }

调试日志

flutter: Views: 1
flutter: Re Play -> completed: false
flutter: position: 0:00:00.000000
flutter: completed: true
flutter: Views: 2
flutter: Re Play -> completed: false
flutter: position: 0:00:00.000000
flutter: completed: true
flutter: Views: 3
flutter: Re Play -> completed: false
flutter: position: 0:00:00.000000
flutter: completed: true
flutter: Views: 4
flutter: Re Play -> completed: false
flutter: posizione: 0:00:00.000000
flutter: position: true
flutter: Views: 5

问题原因

从日志能看出,视频刚播放完成,监听器就被连续多次触发,直接把播放计数拉到5次,根本没实际执行重播逻辑。核心问题:

  • 监听器未做防重复触发处理,视频状态变化时会多次回调
  • 异步操作中bVideoController的状态切换时机不合理,没能有效拦截重复触发
  • seekTo后直接调用play,视频状态可能还没从completed切换回来,导致播放失败

修复代码

void listenerController() async {
  // 先移除监听器,避免重复触发回调
  controller.removeListener(listenerController);

  if (controller.value.isCompleted && view[indexVideo] < 5) {
    view[indexVideo]++;
    print("播放次数: ${view[indexVideo]}");

    // 先暂停确保状态可控,再跳转到视频开头
    await controller.pause();
    await controller.seekTo(Duration.zero);

    // 确认视频未播放时再启动播放
    if (!controller.value.isPlaying) {
      await controller.play();
      print("重新播放 -> 完成状态: ${controller.value.isCompleted}");
      print("当前位置: ${controller.value.position}");
    }
  }

  // 未达到5次播放时,重新添加监听器等待下一次完成
  if (view[indexVideo] < 5) {
    controller.addListener(listenerController);
  }
}

额外注意事项

  1. 初始化时给view[indexVideo]设初始值为1(首次播放算第1次)
  2. 页面初始化阶段添加监听器:controller.addListener(listenerController);
  3. 页面销毁时务必移除监听器:controller.removeListener(listenerController);,避免内存泄漏

内容的提问来源于stack exchange,提问作者Maurizio Mancini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 03:16:29