import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/main/lockDetail/videoLog/videoLog/videoLog_entity.dart'; import 'package:star_lock/main/lockDetail/videoLog/videoLogDetail/controlsOverlay_page.dart'; import 'package:star_lock/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_state.dart'; import 'package:star_lock/tools/dateTool.dart'; import 'package:video_player/video_player.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; import 'videoLogDetail_logic.dart'; class VideoLogDetailPage extends StatefulWidget { const VideoLogDetailPage({Key? key}) : super(key: key); @override State createState() => _VideoLogDetailPageState(); } class _VideoLogDetailPageState extends State { final VideoLogDetailLogic logic = Get.put(VideoLogDetailLogic()); final VideoLogDetailState state = Get.find().state; @override void initState() { super.initState(); state.videoController = VideoPlayerController.networkUrl( Uri.parse(state.recordData.value.videoUrl!), videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true), ); state.videoController.addListener(() { setState(() {}); }); state.videoController.setLooping(false); state.videoController.initialize(); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( barTitle: '视频播放'.tr, haveBack: true, backgroundColor: AppColors.mainColor, ), body: Column( children: [ AspectRatio( aspectRatio: state.videoController.value.aspectRatio, child: Stack( alignment: Alignment.bottomCenter, children: [ VideoPlayer(state.videoController), ControlsOverlay( controller: state.videoController, recordData: state.recordData.value, ), if (state.videoController.value.isPlaying || state.videoController.value.isBuffering) Container() else VideoProgressIndicator(state.videoController, colors: VideoProgressColors( playedColor: AppColors.mainColor), allowScrubbing: true), ], ), ), Container( margin: EdgeInsets.only(left: 20.w, top: 15.w), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ Row( children: [ Text( DateTool().dateToYMDString( state.recordData.value.operateDate.toString()), style: TextStyle(fontSize: 20.sp)), ], ), SizedBox(height: 15.h), Row( children: [ videoItem(true, state.recordData.value), ], ), ], )), Expanded( child: ListView.builder( itemCount: state.videoLogList.length, itemBuilder: (BuildContext c, int index) { CloudStorageData item = state.videoLogList[index]; return Column( children: [ Container( margin: EdgeInsets.only( left: 20.w, top: 15.w, bottom: 15.w), child: Row(children: [ Text(item.date ?? '', style: TextStyle(fontSize: 20.sp)), ])), mainListView(index, item) ], ); })) // Expanded( // child: ListView.builder( // itemCount: state.videoLogList.value.length, // itemBuilder: (c, index) { // return Column( // children: [ // Container( // margin: EdgeInsets.only( // left: 20.w, top: 15.w, bottom: 15.w), // child: Row(children: [ // Text("2023.10.23", // style: TextStyle(fontSize: 20.sp)), // ])), // mainListView() // ], // ); // }), // ), ], ), ); } double itemW = (1.sw - 15.w * 4) / 3; double itemH = (1.sw - 15.w * 4) / 3 + 40.h; Widget mainListView(int index, CloudStorageData itemData) { return GridView.builder( padding: EdgeInsets.only(left: 15.w, right: 15.w), itemCount: itemData.recordList!.length, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( //横轴元素个数 crossAxisCount: 3, //纵轴间距 mainAxisSpacing: 10.w, // 横轴间距 crossAxisSpacing: 15.w, //子组件宽高长度比例 childAspectRatio: itemW / itemH), itemBuilder: (BuildContext context, int index) { return videoItem(false, itemData.recordList![index]); }, ); } Widget videoItem(bool isPlay, RecordListData itemData) { return SizedBox( width: itemW, height: itemH, child: Stack( children: [ Column( children: [ ClipRRect( borderRadius: BorderRadius.circular(10.w), child: Stack(children: [ Container( width: itemW, height: itemW, margin: const EdgeInsets.all(0), color: Colors.white, child: ClipRRect( borderRadius: BorderRadius.circular(10.w), child: Image( fit: BoxFit.cover, image: Image.network(itemData.imagesUrl ?? 'images/icon_video_placeholder.jpg') .image), ), ), Positioned( left: 8.w, bottom: 5.h, child: Text( formatString(state.videoController.value.duration), style: TextStyle(color: Colors.grey, fontSize: 20.sp))), Visibility( visible: isPlay, child: Positioned( left: 0, right: 0, top: 0, bottom: 0, child: Container( // padding: EdgeInsets.only(right: 10.w, left: 10.w), color: const Color.fromRGBO(0, 0, 0, 0.3), child: Center( child: Text('播放中'.tr, style: TextStyle( color: Colors.white, fontSize: 22.sp))), )), ) ]), ), SizedBox(height: 5.h), Text( DateTool().dateToYMDHNString(itemData.operateDate.toString()), style: TextStyle(fontSize: 18.sp)) ], ), ], ), ); } String formatString(time) { String shortName = time.toString().substring(2, 7); return shortName; } @override void dispose() { super.dispose(); state.videoController.dispose(); } }