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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 04:33:24