Flutter Chewie视频播放报错_chewieController未初始化求助
Flutter视频播放组件初始化报错修复
报错核心信息
- 触发场景:点击播放按钮后组件构建阶段直接抛错
- 异常类型:
LateInitializationError - 异常提示:
Field '_chewieController@50055179' has not been initialized. - 异常定位:自定义
Video组件状态类_VideoState,Chewie控制器未完成初始化就被build方法引用
报错控制台截图
问题根因
- 核心错误:生命周期方法拼写错误。
_VideoState中重写的初始化方法错写为iniState(),Flutter框架在组件初始化时只会调用固定命名的initState()方法,拼写错误导致自定义的初始化逻辑完全不执行,标记为late的_chewieController从未被赋值,构建时读取直接报错。 - 潜在隐患:
VideoPlayerController直接在build方法内实例化,每次组件重建都会生成新的控制器对象,会造成内存泄漏、播放状态异常重置问题。
修复后完整代码
import 'package:chewie/chewie.dart'; import 'package:flutter/material.dart'; import 'package:video_player/video_player.dart'; class Video extends StatefulWidget { final VideoPlayerController videoPlayerController; final bool loop; Video({ required this.videoPlayerController, required this.loop, Key? key, }) : super(key: key); @override _VideoState createState() => _VideoState(); } class _VideoState extends State<Video> { late ChewieController _chewieController; @override void initState() { super.initState(); _chewieController = ChewieController( videoPlayerController: widget.videoPlayerController, looping: widget.loop, aspectRatio: 16 / 9, autoInitialize: true); } @override Widget build(BuildContext context) { return Chewie( controller: _chewieController, ); } @override void dispose() { _chewieController.dispose(); widget.videoPlayerController.dispose(); super.dispose(); } } class Videoplayers extends StatefulWidget { final String videodata; Videoplayers({required this.videodata}); @override _VideoplayersState createState() => _VideoplayersState(); } class _VideoplayersState extends State<Videoplayers> { late VideoPlayerController _videoPlayerController; @override void initState() { super.initState(); // 将视频控制器初始化移到状态类初始化生命周期中,避免build重复创建 _videoPlayerController = VideoPlayerController.network(widget.videodata); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Colors.white, title: const Text( "Video Player", style: TextStyle(color: Colors.black), ), leading: const Image( image: AssetImage("images/logo.png"), )), body: Center( child: Padding( padding: const EdgeInsets.all(8.0), child: Video( loop: true, videoPlayerController: _videoPlayerController, ), ), )); } @override void dispose() { _videoPlayerController.dispose(); super.dispose(); } }
修复要点说明
- 修正生命周期方法名:将错写的
iniState()改为框架识别的initState(),保证Chewie控制器初始化逻辑正常执行 - 调整控制器初始化位置:将
VideoPlayerController的实例化逻辑从build方法移到父组件的initState生命周期中,避免重复创建实例 - 调整dispose顺序:先释放Chewie控制器、再释放视频播放器控制器,最后调用父类dispose方法,避免释放顺序导致的资源访问异常
内容的提问来源于stack exchange,提问作者Develkins Target
相关产品推荐
相关产品推荐

