import 'dart:async'; import 'dart:io'; import 'package:android_intent/android_intent.dart'; import 'package:device_apps/device_apps.dart'; import 'package:flutter/material.dart'; import 'package:sport/bean/feed_back.dart'; import 'package:sport/bean/game.dart'; import 'package:sport/pages/my/feedback_detail_page.dart'; import 'package:sport/pages/web/web_page.dart'; import 'package:sport/router/navigator_util.dart'; import 'package:sport/services/api/inject_api.dart'; import 'package:sport/services/game_manager.dart'; import 'package:sport/sharesdk/wechat.dart'; import 'package:sport/utils/DateFormat.dart'; import 'package:sport/utils/toast.dart'; import 'package:sport/widgets/dialog/alert_dialog.dart'; import 'package:sport/widgets/dialog/request_dialog.dart'; import 'package:sport/widgets/image.dart'; import 'package:sport/widgets/misc.dart'; import 'package:sport/widgets/popmenu_bg.dart'; import 'package:video_player/video_player.dart'; class GameDetailsVideo extends StatefulWidget { final Function changeIsFullScreen; final bool _isFullScreen; final VideoPlayerController controller; bool isLoading; final GameInfoData data; GameDetailsVideo(this.changeIsFullScreen, this._isFullScreen, this.controller, this.isLoading, this.data, {Key? key}) : super(key: key); @override State createState() { return _GameDetailsVideoState(); } } class _GameDetailsVideoState extends State with WechatMixin, InjectLoginApi { void changeIsFullScreen; Timer? timer; var opacity = 1.0; late VoidCallback _listener; ValueNotifier timeEnd = ValueNotifier(Duration()); // 播放的时间 ValueNotifier timeStart = ValueNotifier(Duration()); // bool isPlaying = false; @override void initState() { super.initState(); widget.controller.addListener(_listener = () { if (!mounted) return; timeStart.value = widget.controller.value.position; timeEnd.value = widget.controller.value.duration; setState(() { isPlaying = widget.controller.value.isPlaying; }); }); } @override void dispose() { super.dispose(); timer?.cancel(); widget.controller.removeListener(_listener); timeStart.dispose(); timeEnd.dispose(); } void initdelay() { if (timer != null) { timer!.cancel(); } setState(() { opacity = 1; }); timer = Timer(new Duration(seconds: 3), () { setState(() { if (mounted) opacity = 0; }); }); } @override Widget build(BuildContext context) { bool isLoading = widget.isLoading; VideoPlayerController controller = widget.controller; Widget body = Stack( children: [ isLoading == false ? InkWell( child: Center(child: AspectRatio(aspectRatio: controller.value.aspectRatio,child: (VideoPlayer(controller)))), onTap: () { initdelay(); }, onDoubleTap: () { if (isPlaying) { controller.pause(); isPlaying = false; } else { controller.play(); } }, ) : Center(child: CircularProgressIndicator()), isPlaying != true && isLoading == false ? Container( width: double.infinity, height: double.infinity, color: Colors.black45, child: Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ SizedBox( height: 20, ), InkWell( child: Center( child: Image.asset( "lib/assets/img/game_icon_play.png", width: 50, height: 50, )), onTap: () async { if (isPlaying) { controller.pause(); } else { if (controller.value.position.compareTo(controller.value.duration) == 0) { controller.seekTo(Duration.zero); } else { initdelay(); } controller.play(); } }, ), SizedBox( height: 5, ), Text( "运动演示", style: TextStyle(color: Colors.white, fontSize: 14.0), ), ], ), ), ) : Container(), if (widget._isFullScreen == true) Positioned( left: 0, right: 0, child: AnimatedOpacity( duration: new Duration(seconds: 1), opacity: opacity, child: Container( padding: EdgeInsets.symmetric(horizontal: 0), // color: Colors.red, decoration: BoxDecoration( gradient: LinearGradient(begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Color(0xFF000000).withOpacity(.5), Color(0x00000000) // Color(0x00000000), ])), child: SafeArea( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ IconButton( onPressed: () { if (widget._isFullScreen) { widget.changeIsFullScreen(); } else { // 原生的返回上一页? Navigator.pop(context); } }, icon: Image.asset( "lib/assets/img/topbar_return_white.png", width: 26, height: 38, ), ), ], ), right: false, ), ), ), ), if (isPlaying == true) widget._isFullScreen == true ? Positioned( bottom: 0, left: 0, right: 0, child: AnimatedOpacity( duration: new Duration(seconds: 1), opacity: opacity, child: Container( padding: EdgeInsets.symmetric(horizontal: 8), decoration: BoxDecoration( gradient: LinearGradient(begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Color(0x00000000), Color(0xFF000000).withOpacity(.5) // Color(0x00000000), ])), child: Column( mainAxisSize: MainAxisSize.min, children: [ Row( // mainAxisAlignment: MainAxisAlignment.end, children: [ InkWell( child: isPlaying != true ? Image.asset( "lib/assets/img/gamevideo_play_white.png", width: 26, height: 38, ) : Image.asset( "lib/assets/img/gamevideo_suspend.png", width: 26, height: 38, ), onTap: () { if (isPlaying) { controller.pause(); } else { if (controller.value.position.compareTo(controller.value.duration) == 0) { controller.seekTo(Duration.zero); } else { initdelay(); } controller.play(); } }, ), Padding( padding: EdgeInsets.symmetric(horizontal: 5.0), child: ValueListenableBuilder( valueListenable: timeStart, builder: (_, v, __) { int second = v.inSeconds; return Text(DateFormat.toTime(second), style: TextStyle(color: Colors.white)); }), ), Expanded( child: SizedBox( height: 3, child: VideoProgressIndicator(controller, allowScrubbing: true, // 是否可以拖动 padding: const EdgeInsets.all(0), colors: VideoProgressColors(playedColor: Theme.of(context).accentColor))), ), Padding( padding: EdgeInsets.symmetric(horizontal: 5.0), child: ValueListenableBuilder( valueListenable: timeEnd, builder: (_, v, __) { int second = v.inSeconds; return Text(DateFormat.toTime(second), style: TextStyle(color: Colors.white)); }), ), InkWell( // 全屏按钮 child: Image.asset( "lib/assets/img/gamevideo_fullscreen.png", width: 26, height: 38, ), onTap: () { widget.changeIsFullScreen(); }) ], ), ], ), ), ), ):Positioned( bottom: 0, left: 0, right: 0, child: AnimatedOpacity( duration: new Duration(seconds: 1), opacity: opacity, child: Container( padding: EdgeInsets.symmetric(horizontal: 8), // decoration: BoxDecoration( // gradient: LinearGradient(begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ // Color(0x00000000), Color(0xFF000000).withOpacity(.5) // // Color(0x00000000), // ])), child: Column( mainAxisSize: MainAxisSize.min, children: [ Row( // mainAxisAlignment: MainAxisAlignment.end, children: [ // InkWell( // child: isPlaying != true // ? Image.asset( // "lib/assets/img/gamevideo_play_white.png", // width: 26, // height: 38, // ) // : Image.asset( // "lib/assets/img/gamevideo_suspend.png", // width: 26, // height: 38, // ), // onTap: () { // if (isPlaying) { // controller.pause(); // } else { // if (controller.value.position.compareTo(controller.value.duration) == 0) { // controller.seekTo(Duration.zero); // } else { // initdelay(); // } // controller.play(); // } // }, // ), // Padding( // padding: EdgeInsets.symmetric(horizontal: 5.0), // child: ValueListenableBuilder( // valueListenable: timeStart, // builder: (_, v, __) { // int second = v.inSeconds; // return Text(DateFormat.toTime(second), style: TextStyle(color: Colors.white)); // }), // ), // Expanded( // child: SizedBox( // height: 3, // child: VideoProgressIndicator(controller, // allowScrubbing: true, // 是否可以拖动 // padding: const EdgeInsets.all(0), // colors: VideoProgressColors(playedColor: Theme.of(context).accentColor))), // ), // Padding( // padding: EdgeInsets.symmetric(horizontal: 5.0), // child: ValueListenableBuilder( // valueListenable: timeEnd, // builder: (_, v, __) { // int second = v.inSeconds; // return Text(DateFormat.toTime(second), style: TextStyle(color: Colors.white)); // }), // ), InkWell( // 全屏按钮 child: Image.asset( "lib/assets/img/gamevideo_fullscreen.png", width: 26, height: 38, ), onTap: () { widget.changeIsFullScreen(); }) ], ), ], ), ), ), ), // ClosedCaption(text: _controller.value.caption.text), ], ); return Container( color: Colors.black, // 约束宽高的 child: widget._isFullScreen ? body : AspectRatio( aspectRatio: 1.78, child: body, )); } _onPopMenuSelected(var val) async { switch (val) { case '运动记录': NavigatorUtil.goGameHistory(context, widget.data); break; case '操作指引': NavigatorUtil.goPage(context, (context) => WebPage(url: "http://xie-web.hiyd.com/index.html#/game_guide?id=${widget.data.id}")); break; case '问题反馈': FeedTypeInfoData? group; await request(context, () async { FeedTypeInfo _feedTypeInfo = await loginApi.getFeedBackTypes(); if (_feedTypeInfo.code == 0) { group = _feedTypeInfo.data?.singleWhere((element) => element.groupId == '3'); } }); if (group != null) { NavigatorUtil.goPage(context, (context) => FeedbackDetailPage(group!)); } break; case '删除运动': if (Platform.isAndroid) { var installed = await DeviceApps.isAppInstalled(widget.data.packageNameAndroid ?? ""); if (installed == true) { if (await showDialog( context: context, builder: (context) => CustomAlertDialog(title: '是否删除运动', ok: () => Navigator.of(context).pop(true)), ) == true) { GameManager.deleteFile(widget.data); if (Platform.isAndroid) { AndroidIntent intent = AndroidIntent( action: 'android.intent.action.DELETE', data: 'package:${widget.data.packageNameAndroid}', ); await intent.launch(); setState(() {}); } } } else {} } break; } } }