flutter - 仅在视频播放完毕时启用按钮 - Flutter
问题描述
我正在使用 video_player 和chewie 在这个应用程序中播放视频。如果视频仍在播放,我需要启用一个按钮以仅在视频播放完毕时弹出页面我想禁用该按钮。我使用 AbsorbPointer 来启用和禁用我的按钮,但这不起作用。
widget.videoPlayerController.addListener(() {
if (widget.videoPlayerController.value.position ==
widget.videoPlayerController.value.duration) {
print('video completed.');
}
});
上面的代码在视频播放完毕后打印出消息,但这并不能帮助我启用我的按钮。
class VideoPlayerWidget extends StatefulWidget {
final VideoPlayerController videoPlayerController;
const VideoPlayerWidget({
Key key,
@required this.videoPlayerController,
}) : super(key: key);
@override
_VideoPlayerWidgetState createState() => _VideoPlayerWidgetState();
}
class _VideoPlayerWidgetState extends State<VideoPlayerWidget> {
ChewieController _chewieController;
@override
void initState() {
super.initState();
_chewieController = ChewieController(
//fullScreenByDefault: true,
videoPlayerController: widget.videoPlayerController,
aspectRatio: 16 / 9,
autoInitialize: true,
autoPlay: true,
allowedScreenSleep: false,
allowFullScreen: true,
deviceOrientationsAfterFullScreen: [
DeviceOrientation.landscapeRight,
DeviceOrientation.landscapeLeft,
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
],
errorBuilder: (context, e) {
return Center(
child: Text('Some error occurred'),
);
},
);
_chewieController.addListener(() {
if (_chewieController.isFullScreen) {
SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeRight,
DeviceOrientation.landscapeLeft,
]);
} else {
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
}
});
widget.videoPlayerController.addListener(() {
if (widget.videoPlayerController.value.position ==
widget.videoPlayerController.value.duration) {
print('video completed.');
}
});
}
@override
Widget build(BuildContext context) {
final length = MediaQuery.of(context).size;
return SingleChildScrollView(
child: Stack(
children: <Widget>[
Column(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[
SizedBox(height: length.height * 0.2),
Padding(
padding: const EdgeInsets.all(8.0),
child: Chewie(
controller: _chewieController,
),
),
SizedBox(height: length.height * 0.2),
],
),
Align(
alignment: Alignment.bottomCenter,
child: AbsorbPointer(
absorbing: (widget.videoPlayerController.value.position ==
widget.videoPlayerController.value.duration)
? true
: false,
child: FlatButton(child: Text('Completed'),
onPressed:()=> Navigatior.of(context).pop()),
),
),
],
),
);
}
@override
void dispose() {
widget.videoPlayerController.dispose();
_chewieController.dispose();
SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeRight,
DeviceOrientation.landscapeLeft,
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
super.dispose();
}
}
解决方案
您无需使用 禁用/启用 Flutter 中的按钮AbsorbPointer
,只需将按钮的onPressed
回调设置为null
:
FlatButton(
child: Text('Completed'),
onPressed: hasVideoFinished ? () => Navigatior.of(context).pop() : null,
),
hasVideoFinished
在代码中的某处定义一个布尔值并调用setState()
.