Flutter应用中使用video_player无法播放assets视频问题求助
Flutter video_player播放Assets视频不显示的解决办法
你的代码存在几个关键问题导致视频无法正常加载显示,以下是具体修复方案:
1. 必须完成控制器初始化
VideoPlayerController.asset()仅创建了控制器实例,但未完成视频资源的初始化操作,视频无法加载渲染。你需要调用initialize()方法,并等待初始化完成后再展示VideoPlayer组件。
方案一:用FutureBuilder包裹组件
final controller = VideoPlayerController.asset('assets/camion.mp4'); Positioned( top: MediaQuery.of(context).size.height * 0.4, left: MediaQuery.of(context).size.width * 0.3, child: Container( width: 200, height: 200, child: FutureBuilder( future: controller.initialize(), builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { // 初始化完成,显示视频 return VideoPlayer(controller); } else { // 加载中显示占位指示器 return const Center(child: CircularProgressIndicator()); } }, ), ), )
方案二:在StatefulWidget的initState中初始化
如果是在有状态组件中,可以提前在初始化生命周期里完成控制器准备:
late VideoPlayerController controller; @override void initState() { super.initState(); controller = VideoPlayerController.asset('assets/camion.mp4') ..initialize().then((_) { setState(() {}); // 触发UI更新 controller.play(); // 可选:设置自动播放 }); } @override void dispose() { controller.dispose(); // 销毁控制器,避免内存泄漏 super.dispose(); } // build方法中使用 Positioned( top: MediaQuery.of(context).size.height * 0.4, left: MediaQuery.of(context).size.width * 0.3, child: Container( width: 200, height: 200, child: controller.value.isInitialized ? VideoPlayer(controller) : const Center(child: CircularProgressIndicator()), ), )
2. 确认pubspec.yaml中正确配置Assets路径
即使视频文件存在于assets文件夹,也必须在pubspec.yaml中声明资源路径,否则Flutter无法识别:
flutter: assets: - assets/camion.mp4
注意缩进格式,assets:及下方路径需与flutter:保持层级对齐。
3. 可选:用AspectRatio适配视频比例
如果视频出现拉伸变形问题,可以用AspectRatio组件基于控制器的比例适配:
AspectRatio( aspectRatio: controller.value.aspectRatio, child: VideoPlayer(controller), )
内容的提问来源于stack exchange,提问作者ASMA
相关产品推荐
相关产品推荐

