首页 > 解决方案 > 仅在视频播放完毕时启用按钮 - 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();
  }
}

标签: flutterdart

解决方案


您无需使用 禁用/启用 Flutter 中的按钮AbsorbPointer,只需将按钮的onPressed回调设置为null

FlatButton(
  child: Text('Completed'),
  onPressed: hasVideoFinished ? () => Navigatior.of(context).pop() : null,
),

hasVideoFinished在代码中的某处定义一个布尔值并调用setState().


推荐阅读