Flutter 点击“传递URL动态”并加载视频以播放

Flutter 点击“传递URL动态”并加载视频以播放,flutter,video-player,Flutter,Video Player,如何使视频播放器动态播放,而单击列表通过传递视频URL播放视频 当我点击时,我已经传递了URL,并试图重新初始化并开始播放它不工作,状态不变 这是我的密码 videoplayerscreen.dart class VideoPlayerScreen extends StatefulWidget { int playBackTime; int playBackTotalTime; String setPlayTime; String setPlayDuration; doubl

如何使视频播放器动态播放,而单击列表通过传递视频URL播放视频

当我点击时,我已经传递了URL,并试图重新初始化并开始播放它不工作,状态不变

这是我的密码

videoplayerscreen.dart

class VideoPlayerScreen extends StatefulWidget {
  int playBackTime;
  int playBackTotalTime;
  String setPlayTime;
  String setPlayDuration;
  double aspectRatio;
  String videoUrl;
  bool isForward;
  bool isFullScreen;
  bool allowFullScreen;
  bool showControls;
  bool isAutoPlay;
  int startWithinSeconds;

  VideoPlayerScreen({
    Key key,
    this.playBackTime = 0,
    this.playBackTotalTime = 0,
    this.setPlayTime = "00:00",
    this.setPlayDuration = "00:00",
    this.aspectRatio = 16 / 9,
    this.videoUrl =
        "",
    this.isForward = true,
    this.isFullScreen = false,
    this.allowFullScreen = false,
    this.showControls = true,
    this.isAutoPlay = false,
    this.startWithinSeconds = 0,
  }) : super(key: key);

  @override
  _VideoPlayerScreenState createState() => _VideoPlayerScreenState();
}

class _VideoPlayerScreenState extends State<VideoPlayerScreen> {
  VideoPlayerController _controller;

  void initPlayer() async {
    _controller = VideoPlayerController.network(widget.videoUrl);
    await _controller.initialize();
    _controller.setLooping(true);
    _controller.seekTo(Duration(seconds: widget.startWithinSeconds));
    if (widget.isAutoPlay) {
      _controller.play();
    }
    _controller.addListener(() {
      setState(() {
        widget.playBackTime = _controller.value.position.inSeconds;
        widget.setPlayTime = timeFormatter(widget.playBackTime);
      });
    });
  }

  @override
  void initState() {
    initPlayer();
    super.initState();
  }

 @override
  void dispose() {
    _controller.dispose();
    SystemChrome.setPreferredOrientations([
      DeviceOrientation.landscapeRight,
      DeviceOrientation.landscapeLeft,
      DeviceOrientation.portraitUp,
      DeviceOrientation.portraitDown,
    ]);
    super.dispose();
  }
手势检测器(
**在这里,我正在改变状态**
onTap:(){
设置状态(){
_playUrl=视频列表['course\u video\u url'];
});
},
孩子:填充(
衬垫:
仅限边集(左:10.0,右:20.0,顶部:2.0,底部:5.0),
孩子:排(
mainAxisSize:mainAxisSize.max,
mainAxisAlignment:mainAxisAlignment.start,
儿童:[
正文(
“${videolist['snu no']}”,
textAlign:textAlign.center,
样式:TextStyle(
尺码:18,
fontWeight:fontWeight.bold,
颜色:颜色。黑色45,
fontFamily:“Oswald SemiBold”),
),
纵队(
crossAxisAlignment:crossAxisAlignment.start,
儿童:[
填充物(
填充:仅限边缘设置(左:10.0),
子:文本(
“${videolist['course\u video\u title']}”,
textAlign:textAlign.left,
样式:TextStyle(
尺寸:14,
fontWeight:fontWeight.bold,
颜色:颜色。黑色45,
fontFamily:“Oswald SemiBold”),
),
),
划船(
儿童:[
填充物(
填充:仅限边缘设置(左:10.0),
子:文本(
“视频-${videolist['course\u Video\u duration']}”,
textAlign:textAlign.left,
样式:TextStyle(
尺寸:12,
fontWeight:fontWeight.bold,
颜色:颜色。灰色,
fontFamily:“Oswald SemiBold”),
),
),
填充物(
填充:仅限边缘设置(左侧:5.0),
儿童:视频列表[“观看的课程”]
?影像资产(
“assets/images/green_tick_icon.png”,
宽度:12.0,
身高:12.0,
)
:null),
],
),
],
),
],
),
),
)

我根据您的评论修改了我的回复。您只需要将视频url放在一个类变量上,然后使用setState进行更改。然后在小部件上检查变量是否存在,并决定显示
VideoPlayerScreen
小部件或空框

String videoUrl = '';

@override
Widget build(BuildContext context) {
  return Column(
    children: <Widget>[
      videoUrl == '' ? SizedBox() : VideoPlayerScreen(videoUrl: videoUrl),
      RaisedButton(
        onPressed: () {
          setState((){
            videoUrl == videoLists['course_video_url'];
          });
        }
      ),
    ],
  );
}
String videoUrl='';
@凌驾
小部件构建(构建上下文){
返回列(
儿童:[
videoUrl=''?SizedBox():视频播放器屏幕(videoUrl:videoUrl),
升起的按钮(
已按下:(){
设置状态(){
videoUrl==视频列表['course\u video\u url'];
});
}
),
],
);
}

您可以通过创建传递URL的有状态小部件来实现这一点。然后在init方法中,您可以这样做

class ViewVideo extends StatefulWidget {
  final link;
  ViewVideo(this.link);
  @override
  _ViewVideoState createState() => _ViewVideoState(this.link);
}

class _ViewVideoState extends State<ViewVideo> {
  final link;
  _ViewVideoState(this.link);

  @override
  void initState() {
    super.initState();
    //Write your video player code here
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(),
    );
  }

  @override
  void dispose() {
     //Here you can close the video player
     super.dispose();
  }
}
class ViewVideo扩展StatefulWidget{
最后一环;
ViewVideo(this.link);
@凌驾
_ViewVideoState createState()=>\u ViewVideoState(this.link);
}
类_ViewVideoState扩展了状态{
最后一环;
_ViewVideoState(this.link);
@凌驾
void initState(){
super.initState();
//在此处编写视频播放器代码
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
主体:容器(),
);
}
@凌驾
无效处置(){
//在这里您可以关闭视频播放器
super.dispose();
}
}

谢谢您的回复。我得到了解决方案:

Build
函数中,我检查了是否发生了url更改。若发生了更改,我会处理旧的控制器并重新初始化视频控制器。那么,它对我来说很好

@override
Widget build(BuildContext context) {
    if (currentObjectVideoUrl != widget.videoUrl) {
       _controller.dispose();
       initPlayer();
    }
}

您能解释一下您在
onTap
上的
setState
中对此类初始化所做的操作吗?这段代码中很少有让人困惑的地方,这让我们很难帮助您调试。您确定我会解释,实际上我已经创建了两个类,1.VideoPlayerScreen 2.CoursedDetails in CoursedDetails.dart,我正在调用rest api以获取VideoURL列表并显示在listview中,当用户单击特定列表项时,将调用该onTap。当时,我将URL传递到VideoPlayerScreen.dart以播放视频,因此,在第一次播放视频时,下一次单击视频URL传递但视频未播放,请帮助我修复它如何使Dynamicly在传递URL@Joãosareshi时播放视频播放器,但我在一个屏幕中进行,这里我附加了设计的图像,()在这个URL的图片列表中,点击我正在播放顶部@João的视频Soares@Jai我已经修改了我的回复,以符合您的评论。@Jao Soares和我做的一样,但仍然不起作用,请检查我的问题,我已经简单地添加了代码done@JaiVideoPlayerScreen类中显示视频的构建方法在哪里,您可以共享吗?VideoPlayerScreen构建方法,`@override Widget build(BuildContext context){if(_controller.value.initialized){AspectRatio(aspectRatio:widget.aspectRatio,child:VideoPlayer(_controller),)}`@Joao Soaresi也尝试过同样的方法,但仍然不起作用,它没有破坏旧视频,也没有破坏pla
class ViewVideo extends StatefulWidget {
  final link;
  ViewVideo(this.link);
  @override
  _ViewVideoState createState() => _ViewVideoState(this.link);
}

class _ViewVideoState extends State<ViewVideo> {
  final link;
  _ViewVideoState(this.link);

  @override
  void initState() {
    super.initState();
    //Write your video player code here
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(),
    );
  }

  @override
  void dispose() {
     //Here you can close the video player
     super.dispose();
  }
}
@override
Widget build(BuildContext context) {
    if (currentObjectVideoUrl != widget.videoUrl) {
       _controller.dispose();
       initPlayer();
    }
}