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

Flutter中Consumer组件子Widget值不更新问题求助

解决Flutter切换视频源后VideoPlayerBox不实时更新的问题

你的问题核心在于VideoPlayerBox的State类没有监听传入的channel参数变化:initState仅在组件首次创建时执行,当父组件通过Provider切换频道后,widget.channel已更新,但State未响应该变化,导致控制器仍使用初始视频源,只有组件被销毁重建(导航离开再返回)时才会重新初始化。

解决方案

重写didUpdateWidget生命周期方法,对比新旧widget的channel参数,当参数变化时销毁旧控制器并重新初始化新视频源。修改后的VideoPlayerBox代码如下:

class _VideoPlayerBoxState extends State<VideoPlayerBox> {
  VideoPlayerController? _controller;
  ChewieController? _chewieController;

  @override
  void initState() {
    super.initState();
    _initializeVideo(widget.channel);
  }

  @override
  void didUpdateWidget(covariant VideoPlayerBox oldWidget) {
    super.didUpdateWidget(oldWidget);
    // 检测频道是否变化,变化则更新视频源
    if (oldWidget.channel != widget.channel) {
      _disposeControllers();
      _initializeVideo(widget.channel);
    }
  }

  Future<void> _initializeVideo(Map channel) async {
    log(channel['link']);
    _controller = VideoPlayerController.network(channel['link']);
    await _controller!.initialize();

    setState(() {
      _chewieController = ChewieController(
        videoPlayerController: _controller!,
        autoPlay: true,
        isLive: true,
      );
    });
  }

  void _disposeControllers() {
    _controller?.dispose();
    _chewieController?.dispose();
    _controller = null;
    _chewieController = null;
  }

  @override
  void dispose() {
    _disposeControllers();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return _chewieController != null
        ? SizedBox(
            width: context.width(),
            height: context.height(),
            child: Chewie(controller: _chewieController!),
          )
        : const SizedBox(
            width: double.infinity,
            height: double.infinity,
          );
  }
}

关键修改说明

  • 移除冗余的_videoSource变量,直接使用widget.channel
  • 提取_initializeVideo和_disposeControllers方法,复用控制器初始化与销毁逻辑
  • 通过didUpdateWidget监听参数变化,触发视频源更新
  • 优化控制器的空安全处理,避免潜在空指针问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:20:22