如何在YoutubePlayerScaffold中实现ListView.separated滚动并避免全屏退出渲染错误
解决方案:同时实现ListView滚动与避免全屏退出后的RenderFlex错误
问题核心在于:用Expanded包裹ListView时,YouTube播放器全屏切换后的布局尺寸波动会引发RenderFlex错误;而用SingleChildScrollView包裹Column虽能解决错误,却会让ListView失去独立滚动能力。
可以通过以下两步解决:
- 固定YouTube播放器的宽高比:用
AspectRatio组件包裹player,指定16:9的标准视频比例,避免播放器尺寸突变引发布局约束冲突。 - 让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
相关产品推荐
相关产品推荐

