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

如何在YoutubePlayerScaffold中实现ListView.separated滚动并避免全屏退出渲染错误

解决方案:同时实现ListView滚动与避免全屏退出后的RenderFlex错误

问题核心在于:用Expanded包裹ListView时,YouTube播放器全屏切换后的布局尺寸波动会引发RenderFlex错误;而用SingleChildScrollView包裹Column虽能解决错误,却会让ListView失去独立滚动能力。

可以通过以下两步解决:

  1. 固定YouTube播放器的宽高比:用AspectRatio组件包裹player,指定16:9的标准视频比例,避免播放器尺寸突变引发布局约束冲突。
  2. 让ListView占据剩余空间:移除SingleChildScrollView,将Column设置为占满父容器(mainAxisSize: MainAxisSize.max),并用Expanded包裹ListView,同时去掉shrinkWrap: true(Expanded已为ListView提供明确的可用空间)。

修改后的完整代码:

import 'package:flutter/material.dart';
import 'package:youtube_player_iframe/youtube_player_iframe.dart';

class PlyrOneScreen extends StatelessWidget {
  final String url;
  PlyrOneScreen({Key? key, required this.url}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: YoutubePlayerScaffold(
        builder: (context, player) {
          return Column(
            mainAxisSize: MainAxisSize.max,
            children: [
              // 固定播放器宽高比,避免布局波动
              AspectRatio(
                aspectRatio: 16 / 9,
                child: player,
              ),
              // Expanded让ListView占据剩余空间,支持独立滚动
              Expanded(
                child: ListView.separated(
                  itemBuilder: (context, index) {
                    return Text(
                      'data $index',
                      style: TextStyle(color: Colors.white, fontSize: 15),
                    );
                  },
                  separatorBuilder: (context, index) {
                    return Divider(
                      height: 3,
                    );
                  },
                  itemCount: 100,
                ),
              ),
            ],
          );
        },
        controller: YoutubePlayerController.fromVideoId(
          videoId: 'Nen3UXaWDDE',
          params: const YoutubePlayerParams(
            showFullscreenButton: true,
          ),
        ),
      ),
    );
  }
}

原理说明:

  • AspectRatio确保播放器始终保持16:9比例,无论屏幕横竖切换,布局尺寸计算都有明确依据,不会出现约束模糊的情况。
  • Column设置mainAxisSize: MainAxisSize.max后会占满父容器的可用空间,Expanded将剩余空间分配给ListView,使其拥有独立的滚动区域,同时避免了RenderFlex错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:35:18