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,
)