flutter - 按下返回按钮时,在颤动中处理后使用了 Videoplayercontroller 的错误
问题描述
我正在使用 Chewie 视频包以全屏横向模式播放一个视频。当我按下移动设备的后退按钮时,我遇到了 videoplayercontroller 在被处理后使用的问题。首先,我处置了我的咀嚼控制器,然后在处置方法中处置了视频控制器,但我仍然遇到了这个问题。我找不到问题所在,所以按下后退按钮时出现错误。下面是我的代码...
import 'package:chewie/chewie.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:video_player/video_player.dart';
import 'package:newrit/main.dart';
import 'package:wakelock/wakelock.dart';
class StoryVideoPlayer extends StatefulWidget {
final String video_url;
const StoryVideoPlayer({Key key, this.video_url}) : super(key: key);
@override
_StoryVideoPlayerState createState() => _StoryVideoPlayerState(video_url);
}
class _StoryVideoPlayerState extends State<StoryVideoPlayer> {
final String video_url;
_StoryVideoPlayerState(this.video_url);
VideoPlayerController controller;
ChewieController _chewieController;
@override
void initState() {
// TODO: implement initState
super.initState();
Wakelock.enable();
SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeRight,
DeviceOrientation.landscapeLeft,
]);
print('video_url: $video_url');
controller = VideoPlayerController.network(video_url);
controller.addListener(() {
setState(() {});
checkVideo();
});
_chewieController = ChewieController(
videoPlayerController: controller,
allowFullScreen: false,
allowMuting: false,
fullScreenByDefault: true,
looping: false,
autoPlay: true,
allowedScreenSleep: false,
deviceOrientationsAfterFullScreen: const [
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
],
);
}
@override
Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
]);
return WillPopScope(
onWillPop: (){
Navigator.pop(context, true);
},
child: SafeArea(
child: Scaffold(
body: Stack(
alignment: Alignment.bottomCenter,
children: <Widget>[
Chewie(
controller: _chewieController,
),
Align(
alignment: FractionalOffset.topLeft,
child: Padding(
padding: const EdgeInsets.only(left: 15.0, top: 15.0),
child: Material(
type: MaterialType.transparency, //Makes it usable on any background color, thanks @IanSmith
child: Ink(
decoration: BoxDecoration(
border: Border.all(color: Colors.white, width: 4.0),
shape: BoxShape.circle,
),
child: InkWell(
onTap: () => Navigator.pop(context, true),
child: Padding(
padding: const EdgeInsets.fromLTRB(5.0,5.0,7.0,5.0),
child: Icon(Icons.arrow_back_ios,
size: useMobileLayout ? 22.0 : 35.0, color: Colors.white,),
)),
),
),
),
),
],
),
),
),
);
}
void checkVideo() {
if(controller.value.position == Duration(seconds: 0, minutes: 0, hours: 0)) {
}
if(controller.value.position == controller.value.duration) {
print('video Ended');
}
}
@override
void dispose() {
_dispose();
super.dispose();
}
void _dispose() async{
SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
]);
_chewieController.dispose();
await controller.dispose();
Wakelock.disable();
}
}
解决方案
推荐阅读
- visual-studio-code - 每当左侧相应的 EPS 发生变化时,如何自动更新右侧查看的 PDF?
- javascript - 如何使用 JavaScript 访问不同级别的嵌套 graphql 响应?
- linux - 如何使用 AWK 或 SED 替换 CSV 文件中的多个列?
- r - mutate() + group_by() 不起作用
- c - 从 GPS 模块读取 UART RX 缓冲区时程序挂起
- c# - 有没有办法在 ASP.NET Core Identity 中动态添加用户属性
- css - Tailwind CSS:如何应用具有线性渐变的背景图像?
- php - 条码图像未使用 php 中的barcode_encode_genbarcode 函数生成,它显示空白条码图像
- python - ImportError:尝试安装包时没有名为“打字”的模块
- android - MediaPlayer.setDataSource() 在 Play 商店发布新版本后抛出 IOException