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

如何在Flutter的better_player中添加播放监听器并实现定时暂停弹窗

实现Better Player视频播放到1分钟自动暂停并弹出弹窗

要实现这个需求,核心是监听视频播放进度,当进度到达1分钟时触发暂停和弹窗逻辑,具体步骤如下:

1. 初始化BetterPlayerController并添加进度监听

在StatefulWidget的状态类中定义控制器和防重复弹窗的标志位:

late BetterPlayerController _betterPlayerController;
bool _hasShownPopup = false; // 避免同一进度点重复触发弹窗

在initState方法中完成控制器初始化并添加进度监听:

@override
void initState() {
  super.initState();
  // 配置播放器基础参数
  BetterPlayerConfiguration playerConfig = const BetterPlayerConfiguration(
    aspectRatio: 16/9,
    fit: BoxFit.contain,
  );
  
  // 设置视频数据源(替换成你的视频地址)
  BetterPlayerDataSource dataSource = BetterPlayerDataSource(
    BetterPlayerDataSourceType.network,
    "你的视频URL",
  );
  
  _betterPlayerController = BetterPlayerController(playerConfig);
  _betterPlayerController.setupDataSource(dataSource);
  
  // 监听播放进度事件
  _betterPlayerController.addEventsListener((BetterPlayerEvent event) {
    if (event.betterPlayerEventType == BetterPlayerEventType.progress) {
      final currentPos = event.parameters?["position"] as Duration?;
      if (currentPos != null && currentPos.inSeconds >= 60 && !_hasShownPopup) {
        _hasShownPopup = true;
        // 暂停视频
        _betterPlayerController.pause();
        // 弹出询问弹窗
        _showLikeDialog(context);
      }
    }
  });
}

2. 实现询问弹窗逻辑

编写弹窗方法,创建包含"是""否"选项的对话框:

void _showLikeDialog(BuildContext context) {
  showDialog(
    context: context,
    builder: (context) {
      return AlertDialog(
        title: const Text("你喜欢这个视频吗?"),
        actions: [
          TextButton(
            onPressed: () {
              Navigator.of(context).pop();
              // 处理"否"的逻辑,示例:继续播放视频
              _betterPlayerController.play();
            },
            child: const Text("否"),
          ),
          TextButton(
            onPressed: () {
              Navigator.of(context).pop();
              // 处理"是"的逻辑,示例:跳转至点赞页面或执行其他操作
              // _betterPlayerController.play(); // 如需继续播放可取消注释
            },
            child: const Text("是"),
          ),
        ],
      );
    },
  );
}

3. 资源清理避免内存泄漏

在dispose方法中销毁控制器并移除监听:

@override
void dispose() {
  _betterPlayerController.removeEventsListener((){});
  _betterPlayerController.dispose();
  super.dispose();
}

关键注意点

  • _hasShownPopup标志位必须设置,否则进度监听会持续触发弹窗逻辑。
  • 若需要支持视频重播后再次触发弹窗,可在视频播放结束或重新播放时重置_hasShownPopup为false。
  • 进度判断可根据需求调整精度,比如用currentPos.inMilliseconds >= 59500 && currentPos.inMilliseconds <= 60500覆盖时间误差。

内容的提问来源于stack exchange,提问作者Md Zihad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 19:12:20