Flutter 引发了另一个异常:必须提供控制器才能播放视频
我想播放一个视频并将其暂停在“后退”按钮上,但当我单击该按钮时,我遇到了一个错误。此错误显示引发了另一个异常:您必须提供一个控制器来播放我没有得到的视频,而我丢失了播放该视频的控制器Flutter 引发了另一个异常:必须提供控制器才能播放视频,flutter,dart,Flutter,Dart,我想播放一个视频并将其暂停在“后退”按钮上,但当我单击该按钮时,我遇到了一个错误。此错误显示引发了另一个异常:您必须提供一个控制器来播放我没有得到的视频,而我丢失了播放该视频的控制器 import 'package:chewie/chewie.dart'; import 'package:flutter/material.dart'; import 'package:video_player/video_player.dart'; class ChewieListItem extends St
import 'package:chewie/chewie.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
class ChewieListItem extends StatefulWidget {
VideoPlayerController videoPlayerController;
bool looping;
// This will contain the URL/asset path which we want to play
@override
_ChewieListItemState createState() => _ChewieListItemState();
}
class _ChewieListItemState extends State<ChewieListItem> {
final videoPlayerController = VideoPlayerController.network('https://bk7l2g37dx53-hls-live.5centscdn.com/adom/5b97b7d64a64c7cd54c18b07e93570a1.sdp/index.m3u8');
ChewieController _chewieController;
@override
void initState() {
super.initState();
// Wrapper on top of the videoPlayerController
_chewieController = ChewieController(
videoPlayerController: widget.videoPlayerController,
aspectRatio: 16 / 9,
// Prepare the video to be played and display the first frame
autoInitialize: true,
looping: widget.looping,
// Errors can occur for example when trying to play a video
// from a non-existent URL
errorBuilder: (context, errorMessage) {
return Center(
child: Text(
errorMessage,
style: TextStyle(color: Colors.white),
),
);
},
);
}
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Chewie(
controller: _chewieController,
),
);
}
@override
void dispose() {
super.dispose();
// IMPORTANT to dispose of all the used resources
widget.videoPlayerController.dispose();
_chewieController.dispose();
}
}
import'包:chuie/chuie.dart';
进口“包装:颤振/材料.省道”;
导入“package:video_player/video_player.dart”;
类chuvieListItem扩展StatefulWidget{
视频播放控制器;
布尔循环;
//这将包含我们想要播放的URL/资产路径
@凌驾
_ChevieListItemState createState()=>\u ChevieListItemState();
}
类_chuvieListItemState扩展状态{
最终videoPlayerController=videoPlayerController.network('https://bk7l2g37dx53-hls-live.5centscdn.com/adom/5b97b7d64a64c7cd54c18b07e93570a1.sdp/index.m3u8');
咀嚼控制器;
@凌驾
void initState(){
super.initState();
//videoPlayerController顶部的包装
_咀嚼控制器=咀嚼控制器(
videoPlayerController:widget.videoPlayerController,
专题:16/9,
//准备要播放的视频并显示第一帧
自动初始化:true,
循环:widget.looping,
//例如,尝试播放视频时可能会发生错误
//从一个不存在的URL
errorBuilder:(上下文,errorMessage){
返回中心(
子:文本(
错误消息,
样式:TextStyle(颜色:Colors.white),
),
);
},
);
}
@凌驾
小部件构建(构建上下文){
返回填充(
填充:常数边集全部(8.0),
孩子:朱伊(
控制器:_cheuicontroller,
),
);
}
@凌驾
无效处置(){
super.dispose();
//重要的是要处置所有已使用的资源
widget.videoPlayerController.dispose();
_chouicontroller.dispose();
}
}
widget.videoPlayerController引用了类chuvieListItem中的变量,它没有初始化。您初始化的是类_chuvieListItemState内的
您可以从类chuvieListItem中删除变量,并在不使用widget单词的情况下使用它:
import 'package:chewie/chewie.dart';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
class ChewieListItem extends StatefulWidget {
bool looping;
// This will contain the URL/asset path which we want to play
@override
_ChewieListItemState createState() => _ChewieListItemState();
}
class _ChewieListItemState extends State<ChewieListItem> {
final videoPlayerController = VideoPlayerController.network('https://bk7l2g37dx53-hls-live.5centscdn.com/adom/5b97b7d64a64c7cd54c18b07e93570a1.sdp/index.m3u8');
ChewieController _chewieController;
@override
void initState() {
super.initState();
// Wrapper on top of the videoPlayerController
_chewieController = ChewieController(
videoPlayerController: videoPlayerController,
aspectRatio: 16 / 9,
// Prepare the video to be played and display the first frame
autoInitialize: true,
looping: widget.looping,
// Errors can occur for example when trying to play a video
// from a non-existent URL
errorBuilder: (context, errorMessage) {
return Center(
child: Text(
errorMessage,
style: TextStyle(color: Colors.white),
),
);
},
);
}
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Chewie(
controller: _chewieController,
),
);
}
@override
void dispose() {
super.dispose();
// IMPORTANT to dispose of all the used resources
widget.videoPlayerController.dispose();
_chewieController.dispose();
}
}
import'包:chuie/chuie.dart';
进口“包装:颤振/材料.省道”;
导入“package:video_player/video_player.dart”;
类chuvieListItem扩展StatefulWidget{
布尔循环;
//这将包含我们想要播放的URL/资产路径
@凌驾
_ChevieListItemState createState()=>\u ChevieListItemState();
}
类_chuvieListItemState扩展状态{
最终videoPlayerController=videoPlayerController.network('https://bk7l2g37dx53-hls-live.5centscdn.com/adom/5b97b7d64a64c7cd54c18b07e93570a1.sdp/index.m3u8');
咀嚼控制器;
@凌驾
void initState(){
super.initState();
//videoPlayerController顶部的包装
_咀嚼控制器=咀嚼控制器(
videoPlayerController:videoPlayerController,
专题:16/9,
//准备要播放的视频并显示第一帧
自动初始化:true,
循环:widget.looping,
//例如,尝试播放视频时可能会发生错误
//从一个不存在的URL
errorBuilder:(上下文,errorMessage){
返回中心(
子:文本(
错误消息,
样式:TextStyle(颜色:Colors.white),
),
);
},
);
}
@凌驾
小部件构建(构建上下文){
返回填充(
填充:常数边集全部(8.0),
孩子:朱伊(
控制器:_cheuicontroller,
),
);
}
@凌驾
无效处置(){
super.dispose();
//重要的是要处置所有已使用的资源
widget.videoPlayerController.dispose();
_chouicontroller.dispose();
}
}
我对您的代码进行了更改。请查看它是否有效getter“videoPlayerController”未为类“chuvieListItem”定义。我在此行小部件上发现此错误。videoPlayerController.dispose();我刚刚从这个声明widget.videoPlayerController.dispose()中删除了widget关键字;现在一切都很好。Stel你是个很棒的人非常非常感谢你保佑你让我再浪费两天