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

Flutter Better Player中onPlayerVisibilityChanged参数使用方法咨询

关于Better Player中onPlayerVisibilityChanged参数的使用说明

核心作用

onPlayerVisibilityChanged是一个Function(bool)类型的回调,用来向BetterPlayer核心层同步你自定义控件的显示/隐藏状态。播放器内部会根据这个状态处理触摸事件拦截、自动隐藏逻辑联动等核心行为。

具体用法

你需要在自定义控件的状态变化时主动调用这个回调,传递当前控件的可见状态(true为显示,false为隐藏),以下是完整的自定义控件示例:

class CustomControlsWidget extends StatefulWidget {
  final BetterPlayerController controller;
  final Function(bool) onControlsVisibilityChanged;

  const CustomControlsWidget({
    super.key,
    required this.controller,
    required this.onControlsVisibilityChanged,
  });

  @override
  State<CustomControlsWidget> createState() => _CustomControlsWidgetState();
}

class _CustomControlsWidgetState extends State<CustomControlsWidget> {
  bool _controlsVisible = true;
  Timer? _hideControlsTimer;

  @override
  void initState() {
    super.initState();
    // 初始化时通知播放器:控件已显示
    widget.onControlsVisibilityChanged(true);
    _startHideControlsTimer();
  }

  // 启动控件自动隐藏定时器
  void _startHideControlsTimer() {
    _hideControlsTimer?.cancel();
    _hideControlsTimer = Timer(const Duration(milliseconds: 1000), () {
      if (mounted) {
        setState(() => _controlsVisible = false);
        // 通知播放器:控件已隐藏
        widget.onControlsVisibilityChanged(false);
      }
    });
  }

  // 切换控件显示/隐藏状态
  void _toggleControls() {
    setState(() => _controlsVisible = !_controlsVisible);
    // 同步状态给播放器核心
    widget.onControlsVisibilityChanged(_controlsVisible);
    
    if (_controlsVisible) {
      _startHideControlsTimer();
    } else {
      _hideControlsTimer?.cancel();
    }
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      // 触摸屏幕切换控件显示状态
      onTap: _toggleControls,
      child: Visibility(
        visible: _controlsVisible,
        child: Container(
          color: Colors.black12,
          child: Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              IconButton(
                icon: Icon(
                  widget.controller.isPlaying() ? Icons.pause : Icons.play_arrow,
                  color: Colors.white,
                ),
                onPressed: () {
                  widget.controller.togglePlay();
                  // 点击按钮后保持控件可见,同步状态并重启定时器
                  setState(() => _controlsVisible = true);
                  widget.onControlsVisibilityChanged(true);
                  _startHideControlsTimer();
                },
              ),
              // 可添加进度条、音量控制等其他自定义控件
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _hideControlsTimer?.cancel();
    super.dispose();
  }
}

关键调用场景

  • 控件初始化显示时,必须调用一次onControlsVisibilityChanged(true)
  • 自动隐藏定时器触发、控件切换为隐藏状态时,调用onControlsVisibilityChanged(false)
  • 触摸屏幕切换控件显示/隐藏时,同步传递当前状态
  • 点击播放/暂停等交互按钮时,需要将控件状态切回显示并同步给播放器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:40:41