sample screen of video player attached below 如何让视频播放器动态播放,同时列表的onclick通过传入视频地址来播放视频?
单击时,我传递了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();
}在配置中,
video_player: ^0.10.5
调用其他类CourseDetails.dart,
Container(
padding: EdgeInsets.only(left: 20.0, right: 20.0),
child: ClipRRect(
borderRadius: BorderRadius.circular(8.0),
child: _playUrl != null
? VideoPlayerScreen(videoUrl: _playUrl)
: Image.asset(
'assets/images/test_video_player_screen.png'),
),
)GestureDetector(
**here i am changing the state **
onTap: () {
setState(() {
_playUrl = videoLists['course_video_url'];
});
},
child: Padding(
padding:
EdgeInsets.only(left: 10.0, right: 20.0, top: 2.0, bottom: 5.0),
child: Row(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
Text(
"${videoLists['sn_no']}",
textAlign: TextAlign.center,
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.black45,
fontFamily: 'Oswald-SemiBold'),
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Padding(
padding: EdgeInsets.only(left: 10.0),
child: Text(
"${videoLists['course_video_title']}",
textAlign: TextAlign.left,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,
color: Colors.black45,
fontFamily: 'Oswald-SemiBold'),
),
),
Row(
children: <Widget>[
Padding(
padding: EdgeInsets.only(left: 10.0),
child: Text(
"Video - ${videoLists['course_video_duration']}",
textAlign: TextAlign.left,
style: TextStyle(
fontSize: 12,
fontWeight: FontWeight.bold,
color: Colors.grey,
fontFamily: 'Oswald-SemiBold'),
),
),
Padding(
padding: EdgeInsets.only(left: 5.0),
child: videoLists['course_watched']
? Image.asset(
'assets/images/green_tick_icon.png',
width: 12.0,
height: 12.0,
)
: null),
],
),
],
),
],
),
),
)发布于 2020-01-29 15:01:42
谢谢你所有的回复。我得到了解决方案:
在Build函数中,我检查了url是否发生了变化。如果发生变化,我会清除旧控制器,并重新初始化视频控制器。然后,它对我来说工作得很好。
@override
Widget build(BuildContext context) {
if (currentObjectVideoUrl != widget.videoUrl) {
_controller.dispose();
initPlayer();
}
}发布于 2020-01-27 21:36:42
您可以通过创建传递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();
}
}发布于 2020-01-27 19:35:02
我已经根据你的评论修改了我的回复。您只需将视频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'];
});
}
),
],
);
}https://stackoverflow.com/questions/59928309
复制相似问题