import 'dart:math';
import 'package:flutter/material.dart';
import 'package:video_player/video_player.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: IosVideoDisappear());
}
}
class IosVideoDisappear extends StatefulWidget {
@override
_IosVideoDisappearState createState() => _IosVideoDisappearState();
}
class _IosVideoDisappearState extends State<IosVideoDisappear> {
VideoPlayerController controller1;
VideoPlayerController controller2;
@override
void initState() {
super.initState();
initVideoPlayerController();
}
Future<void> initVideoPlayerController() async {
VideoPlayerController initController(String url) {
var controller = url.startsWith('http')
? VideoPlayerController.network(url)
: VideoPlayerController.asset(url);
controller.addListener(() {
setState(() {});
});
controller.setLooping(false);
controller.initialize().then((value) => setState(() {}));
controller.play();
return controller;
}
controller1 = initController(getRandomUrl());
controller2 = initController(getRandomUrl());
}
Future<void> changeVideo() async {
controller1.pause();
controller2.pause();
var lastController1 = controller1;
var lastController2 = controller2;
await initVideoPlayerController();
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
lastController1.dispose();
lastController2.dispose();
});
}
String getRandomUrl() {
return videoUrls[Random().nextInt(videoUrls.length)];
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
Stack(
children: [
SizedBox(
width: 960,
height: 600,
child: _buildVideoView(controller1),
),
SizedBox(
width: 300,
height: 200,
child: _buildVideoView(controller2),
),
],
),
Wrap(
spacing: 10,
children: [
RaisedButton(
onPressed: () {
controller1?.pause();
},
child: Text('VideoLarge pause'),
),
RaisedButton(
onPressed: () {
controller1?.seekTo(Duration(seconds: 0));
controller1?.play();
},
child: Text('VideoLarge play'),
),
RaisedButton(
onPressed: changeVideo,
child: Text('Random change'),
),
RaisedButton(
onPressed: () {
controller2?.pause();
},
child: Text('VideoSmall pause'),
),
RaisedButton(
onPressed: () {
controller2?.seekTo(Duration(seconds: 0));
controller2?.play();
},
child: Text('VideoSmall play'),
),
],
),
],
),
);
}
Widget _buildVideoView(VideoPlayerController controller) {
return Column(
children: [
AspectRatio(
aspectRatio: (controller?.value?.initialized ?? false)
? controller.value.aspectRatio
: 16 / 9,
child: (controller?.value?.initialized ?? false)
? VideoPlayer(controller)
: Container(
color: Colors.black12,
),
),
Text(
_getPosition(controller),
),
],
);
}
String _getPosition(VideoPlayerController controller) {
return '${controller?.value?.position}/${controller?.value?.duration}';
}
}
List<String> videoUrls = [
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/5.1.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/5.3.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/5.5.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/5.7.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/6.1.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/6.3.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/6.5.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/6.7.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/7.1.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/7.3.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/7.5.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/7.7.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/8.1.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/8.3.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/8.5.ppt.mp4',
'https://focus-resource.oss-cn-beijing.aliyuncs.com/camp/video/test/8.7.ppt.mp4',
];
Steps to Reproduce
flutter create bug.Expected results:every time press the "Random change" button will change the video, and the postion text can update
Actual results:about 2% chance will encounter the case: no video frame is rendered but the VideoPlayerController.value keep updating the position; press the pause /seek play button can controll the position but the frame of video is still not rendered
this is the demo video:
video_demo.zip
Logs