Flutter 播放器(video_player)切换源

作者:
淡白
创建时间:
2020-04-27 15:22:40
Flutter

摘要:这段代码主要是关于使用chewie和video_player库来实现视频播放的。首先定义了_videoPlayerController和_chewieController两个变量,用来控制视频播放。然后在dispose方法中,对这两个控制器进行释放。接下来是_initController方法,初始化_videoPlayerController和_chewieController,并设置相关参数,其中使用了VideoPlayerController和ChewieController类。最后是_loadVideo方法,根据传入的视频链接初始化控制器,如果已经有视频在播放,则先将旧的控制器处理掉。在build方法中,使用Container和Chewie组件来展示视频播放界面。

依赖

chewie: ^0.9.10 video_player: ^0.10.8+1

代码

定义变量

 VideoPlayerController _videoPlayerController;
  ChewieController _chewieController;

主要代码

 @override
  void dispose() {
    // 退出处理
    super.dispose();
    if (_videoPlayerController != null) {
      _videoPlayerController.dispose();
      _chewieController.dispose();
      _videoPlayerController = null;
      _chewieController = null;
    }
  }

//初始化控制器
  void _initController(String link) {
    _videoPlayerController = VideoPlayerController.network(link)
      ..initialize().then((_) {
        _chewieController = ChewieController(
          customControls: CustomControls(),
          allowedScreenSleep: false,
          videoPlayerController: _videoPlayerController,
          aspectRatio: _videoPlayerController.value.aspectRatio,
          autoPlay: true,
          looping: true,
        );
        setState(() {});
      });
  }

  //加载视频
  _loadVideo(String url) async {
    if (_videoPlayerController == null) {
      //没有视频在播放
      _initController(url);
    } else {
      // 如果有控制器,我们需要先处理旧的
      final oldController = _videoPlayerController;
      // 为下一帧的结束注册回调
      // 处理一个旧控制器
      // (调用setState后不再使用)
      WidgetsBinding.instance.addPostFrameCallback((_) async {
        await oldController.dispose();
      });
      // 通过将其设置为null来确保没有使用该控制器
      setState(() {
        _videoPlayerController = null;
        _initController(url);
      });
    }
  }


在build中...
	Container(
              child: _videoPlayerController != null &&
                      _chewieController != null &&
                      _videoPlayerController.value.initialized
                  ? Chewie(
                      controller: _chewieController,
                    )
                  : null,
            )