Flutter使用Better Player插件滚动页面后视频反复重启问题求助
Better Player滚动出屏后返回从头播放问题解决思路
这个问题的核心原因是滚动容器默认会销毁离屏区域的Widget,导致BetterPlayer组件重建、控制器重新触发初始化播放逻辑,可按以下方案排查解决:
- 优先使用组件保活方案:给视频所在的自定义Widget混入
AutomaticKeepAliveClientMixin,重写wantKeepAlive返回true,同时将外层滚动容器(ListView、GridView等)的addAutomaticKeepAlives参数设置为true,确保视频组件滚出屏幕时不会被销毁,原有播放状态和进度会直接保留。
保活实现参考代码:class VideoItemWidget extends State<VideoItemWidget> with AutomaticKeepAliveClientMixin { BetterPlayerController? _betterPlayerController; @override bool get wantKeepAlive => true; @override void initState() { super.initState(); // 控制器初始化必须放在initState,不要放在build中重复创建 BetterPlayerConfiguration config = BetterPlayerConfiguration( autoPlay: false, // 其他配置项 ); _betterPlayerController = BetterPlayerController(config); } @override Widget build(BuildContext context) { super.build(context); // 混入保活mixin必须调用super.build return Center( child: _betterPlayerController == null ? CircularProgressIndicator( color: widget.loaderColor, backgroundColor: widget.loaderBackgroundColor, ) : AspectRatio( aspectRatio: 16 / 9, child: BetterPlayer( controller: _betterPlayerController as BetterPlayerController, ), ), ); } @override void dispose() { _betterPlayerController?.dispose(); super.dispose(); } } - 如果场景不允许保活组件(比如长列表视频数量太多,全保活会占用过高内存),可以做进度缓存:在组件
dispose生命周期触发前,获取当前播放进度_betterPlayerController?.videoPlayerController?.position存入临时缓存,下次组件重建初始化BetterPlayerController时,将缓存的进度传入betterPlayerDataSource的startAt参数,实现续播。 - 额外排查点:确认控制器没有在视频组件每次触发build时重新创建,所有初始化逻辑必须放在
initState中,避免每次组件更新都重置控制器。
内容的提问来源于stack exchange,提问作者ahmed mohamed abdulkadir
相关产品推荐
相关产品推荐

