如何在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
相关产品推荐
相关产品推荐

