From af59247c46c5f20e7d8d96f714480a739c2eff47 Mon Sep 17 00:00:00 2001 From: Daisy <> Date: Thu, 25 Apr 2024 17:33:07 +0800 Subject: [PATCH] =?UTF-8?q?1=EF=BC=8C=E6=9B=B4=E6=96=B0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=99=A8=E6=8F=92=E4=BB=B6=E7=89=88=E6=9C=AC?= =?UTF-8?q?=202=EF=BC=8C=E6=96=B0=E5=A2=9E=E8=A7=86=E9=A2=91=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E4=BA=91=E5=AD=98=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E5=8F=8A=E8=A7=86=E9=A2=91=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=86=203=EF=BC=8C=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E7=82=B9=E5=87=BB=E4=BA=91=E5=AD=98=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E5=BD=93=E5=89=8DMP4=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E7=9A=84=E8=A7=86=E9=A2=91=E4=BB=A5=E5=8F=8A=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=80=BB=E8=BE=91=E5=A4=84=E7=90=86=204?= =?UTF-8?q?=EF=BC=8C=E6=96=B0=E5=A2=9E=E7=BC=96=E8=BE=91=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3=E5=AF=B9?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../android/app/src/main/AndroidManifest.xml | 2 +- star_lock/images/icon_video_placeholder.jpg | Bin 0 -> 9609 bytes star_lock/images/lan/lan_en.json | 10 +- star_lock/images/lan/lan_keys.json | 10 +- star_lock/images/lan/lan_zh.json | 10 +- .../editVideoLog/editVideoLog_page.dart | 151 +++++++------ .../editVideoLog/editVideoLog_state.dart | 13 +- .../videoLog/videoLog/videoLog_entity.dart | 90 ++++++++ .../videoLog/videoLog/videoLog_logic.dart | 2 +- .../videoLog/videoLog/videoLog_page.dart | 79 ++++--- .../videoLogDetail/controlsOverlay_page.dart | 98 +++++--- .../videoLogDetail/videoLogDetail_page.dart | 209 +++++++++++------- .../videoLogDetail/videoLogDetail_state.dart | 19 +- star_lock/lib/network/api_repository.dart | 6 +- star_lock/pubspec.yaml | 2 +- 15 files changed, 471 insertions(+), 230 deletions(-) create mode 100644 star_lock/images/icon_video_placeholder.jpg create mode 100644 star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_entity.dart diff --git a/star_lock/android/app/src/main/AndroidManifest.xml b/star_lock/android/app/src/main/AndroidManifest.xml index 25a509a4..afb5fd51 100644 --- a/star_lock/android/app/src/main/AndroidManifest.xml +++ b/star_lock/android/app/src/main/AndroidManifest.xml @@ -46,7 +46,7 @@ - + diff --git a/star_lock/images/icon_video_placeholder.jpg b/star_lock/images/icon_video_placeholder.jpg new file mode 100644 index 0000000000000000000000000000000000000000..161ad0f026a2c2fee34c437a5e7eba35e486ce8f GIT binary patch literal 9609 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 literal 0 HcmV?d00001 diff --git a/star_lock/images/lan/lan_en.json b/star_lock/images/lan/lan_en.json index 0ffa372b..625c2edd 100644 --- a/star_lock/images/lan/lan_en.json +++ b/star_lock/images/lan/lan_en.json @@ -779,5 +779,13 @@ "添加和使用面容开锁时:":"Add and use Face when unlocking:", "关锁":"close lock", "功能":"function", - "配件":"parts" + "配件":"parts", + "云存":"Cloud storage", + "本地":"This locality", + "3天滚动储存":"3 days rolling storage", + "去升级":"Upgrade Now", + "下载列表":"Download list", + "已下载":"Downloaded", + "全部视频":"All videos", + "已为本设备免费提供3大滚动视频储存服务":"Three scrolling video storage services have been provided for this device free of charge" } diff --git a/star_lock/images/lan/lan_keys.json b/star_lock/images/lan/lan_keys.json index 1a9e0990..66b4b37b 100644 --- a/star_lock/images/lan/lan_keys.json +++ b/star_lock/images/lan/lan_keys.json @@ -778,5 +778,13 @@ "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网":"经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网", "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。":"打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。", "门未开时间":"门未开时间", - "添加和使用面容开锁时:":"添加和使用面容开锁时:" + "添加和使用面容开锁时:":"添加和使用面容开锁时:", + "云存":"云存", + "本地":"本地", + "3天滚动储存":"3天滚动储存", + "去升级":"去升级", + "下载列表":"下载列表", + "已下载":"已下载", + "全部视频":"全部视频", + "已为本设备免费提供3大滚动视频储存服务":"已为本设备免费提供3大滚动视频储存服务" } diff --git a/star_lock/images/lan/lan_zh.json b/star_lock/images/lan/lan_zh.json index 12cbd4d7..a7ca0e21 100644 --- a/star_lock/images/lan/lan_zh.json +++ b/star_lock/images/lan/lan_zh.json @@ -781,5 +781,13 @@ "经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网":"经过以上设定的时间,锁没有被开启,系统会给指定对象发送提醒消息,该功能需要锁联网", "打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。":"打开提醒后,当锁电量低于20%、10%和5%,系统会给指定对象发送提醒消息。电量读取方式:网关读取或APP读取。", "门未开时间":"门未开时间", - "添加和使用面容开锁时:":"添加和使用面容开锁时:" + "添加和使用面容开锁时:":"添加和使用面容开锁时:", + "云存":"云存", + "本地":"本地", + "3天滚动储存":"3天滚动储存", + "去升级":"去升级", + "下载列表":"下载列表", + "已下载":"已下载", + "全部视频":"全部视频", + "已为本设备免费提供3大滚动视频储存服务":"已为本设备免费提供3大滚动视频储存服务" } diff --git a/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_page.dart b/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_page.dart index 3889695f..a8f94f11 100644 --- a/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_page.dart +++ b/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_page.dart @@ -1,7 +1,8 @@ - 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/tools/dateTool.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; @@ -41,20 +42,23 @@ class _EditVideoLogPageState extends State { body: Column( children: [ Expanded( - child: ListView.builder( - itemCount: 5, + child: Obx(() => ListView.builder( + itemCount: state.videoLogList.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(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) + ], + ); + })), ), bottomBottomBtnWidget() ], @@ -62,35 +66,31 @@ class _EditVideoLogPageState extends State { ); } - var itemW = (1.sw - 15.w*4)/3; - var itemH = (1.sw - 15.w*4)/3+40.h; - Widget mainListView(int index){ - return Container( - // margin: EdgeInsets.only(left: 10.w, right: 10.w, top: 40.h), - // color: Colors.blue, - child: GridView.builder( - padding: EdgeInsets.only(left: 15.w, right: 15.w), - itemCount: index+1, - shrinkWrap: true, - physics: const NeverScrollableScrollPhysics(), - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + var itemW = (1.sw - 15.w * 4) / 3; + var 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: (context, index) { - return Obx(() => videoItem()); - }, - ), + crossAxisCount: 3, + //纵轴间距 + mainAxisSpacing: 10.w, + // 横轴间距 + crossAxisSpacing: 15.w, + //子组件宽高长度比例 + childAspectRatio: itemW / itemH), + itemBuilder: (context, index) { + RecordListData recordData = itemData.recordList![index]; + return videoItem(recordData, index); + }, ); } - Widget videoItem(){ + Widget videoItem(RecordListData recordData, int index) { return SizedBox( width: itemW, height: itemH, @@ -98,12 +98,26 @@ class _EditVideoLogPageState extends State { children: [ Column( children: [ - ClipRRect( - borderRadius: BorderRadius.circular(10.w), - child: Image(width: itemW, height: itemW, fit: BoxFit.fill, image: const AssetImage("images/main/icon_lockDetail_monitoringvoiceFrist.png")), + 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(recordData.imagesUrl ?? + "images/icon_video_placeholder.jpg") + .image), + ), ), - SizedBox(height:5.h), - Text("2023.10.23 10:00", style: TextStyle(fontSize: 20.sp)) + SizedBox(height: 5.h), + Text( + DateTool() + .dateToYMDHNString(recordData.operateDate.toString()), + textAlign: TextAlign.center, + style: TextStyle(fontSize: 18.sp)) ], ), Visibility( @@ -112,36 +126,41 @@ class _EditVideoLogPageState extends State { top: 0.w, right: 0.w, child: GestureDetector( - onTap: (){ - - }, - child: Image(width: 40.w, height: 40.w, image: state.isSelectAll.value ? const AssetImage("images/icon_round_select.png") : const AssetImage("images/icon_round_unSelect.png")) - ) - ), + onTap: () {}, + child: Obx(() => Image( + width: 36.w, + height: 36.w, + image: state.isSelectAll.value + ? const AssetImage("images/icon_round_select.png") + : const AssetImage( + "images/icon_round_unSelect.png"))))), ) ], ), ); } - Widget bottomBottomBtnWidget(){ + Widget bottomBottomBtnWidget() { return Container( width: 1.sw, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - bottomBtnItemWidget("images/main/icon_lockDetail_monitoringDownloadVideo.png", "下载", Colors.white,(){ - - }), - SizedBox(width:100.w), - bottomBtnItemWidget("images/main/icon_lockDetail_monitoringDeletVideo.png", "删除", AppColors.mainColor,(){ - - }) - ]), + child: Row(mainAxisAlignment: MainAxisAlignment.center, children: [ + bottomBtnItemWidget( + "images/main/icon_lockDetail_monitoringDownloadVideo.png", + "下载", + Colors.white, + () {}), + SizedBox(width: 100.w), + bottomBtnItemWidget( + "images/main/icon_lockDetail_monitoringDeletVideo.png", + "删除", + AppColors.mainColor, + () {}) + ]), ); } - Widget bottomBtnItemWidget(String iconUrl, String name, Color backgroundColor, Function() onClick) { + Widget bottomBtnItemWidget( + String iconUrl, String name, Color backgroundColor, Function() onClick) { var wh = 40.w; return GestureDetector( onTap: onClick, @@ -153,10 +172,12 @@ class _EditVideoLogPageState extends State { SizedBox(height: 30.w), Image.asset(iconUrl, width: wh, height: wh, fit: BoxFit.fitWidth), SizedBox(height: 10.w), - Expanded(child: Text(name, style: TextStyle(fontSize: 22.sp), textAlign: TextAlign.center)) + Expanded( + child: Text(name, + style: TextStyle(fontSize: 22.sp), + textAlign: TextAlign.center)) ], )), ); } - } diff --git a/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_state.dart b/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_state.dart index 900badec..7d4a7fe0 100644 --- a/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_state.dart +++ b/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_state.dart @@ -1,10 +1,15 @@ - - import 'package:get/get.dart'; -class EditVideoLogState{ - +class EditVideoLogState { var selectVideoLog = 0.obs; + var selectVideoLogList = [].obs; var isSelectAll = false.obs; + var videoLogList = [].obs; + EditVideoLogState() { + Map map = Get.arguments; + if (map['videoDataList'] != null) { + videoLogList.value = map['videoDataList']; + } + } } diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_entity.dart b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_entity.dart new file mode 100644 index 00000000..7c7a90fd --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_entity.dart @@ -0,0 +1,90 @@ +class VideoLogEntity { + int? errorCode; + String? description; + String? errorMsg; + List? data; + + VideoLogEntity({this.errorCode, this.description, this.errorMsg, this.data}); + + VideoLogEntity.fromJson(Map json) { + errorCode = json['errorCode']; + description = json['description']; + errorMsg = json['errorMsg']; + if (json['data'] != null) { + data = []; + json['data'].forEach((v) { + data!.add(CloudStorageData.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = {}; + data['errorCode'] = errorCode; + data['description'] = description; + data['errorMsg'] = errorMsg; + if (this.data != null) { + data['data'] = this.data!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class CloudStorageData { + String? date; + List? recordList; + + CloudStorageData({this.date, this.recordList}); + + CloudStorageData.fromJson(Map json) { + date = json['date']; + if (json['recordList'] != null) { + recordList = []; + json['recordList'].forEach((v) { + recordList!.add(RecordListData.fromJson(v)); + }); + } + } + + Map toJson() { + final Map data = {}; + data['date'] = date; + if (recordList != null) { + data['recordList'] = recordList!.map((v) => v.toJson()).toList(); + } + return data; + } +} + +class RecordListData { + int? recordId; + int? operateDate; + String? imagesUrl; + String? videoUrl; + int? recordType; + + RecordListData( + {this.recordId, + this.operateDate, + this.imagesUrl, + this.videoUrl, + this.recordType}); + + RecordListData.fromJson(Map json) { + recordId = json['recordId']; + operateDate = json['operateDate']; + imagesUrl = json['imagesUrl']; + videoUrl = json['videoUrl']; + recordType = json['recordType']; + } + + Map toJson() { + final Map data = {}; + data['recordId'] = recordId; + data['operateDate'] = operateDate; + data['imagesUrl'] = imagesUrl; + data['videoUrl'] = videoUrl; + data['recordType'] = recordType; + return data; + } +} diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_logic.dart b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_logic.dart index 17418e0b..be027017 100644 --- a/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_logic.dart +++ b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_logic.dart @@ -10,7 +10,7 @@ class VideoLogLogic extends BaseGetXController { lockId: state.getLockId.value, ); if (entity.errorCode!.codeIsSuccessful) { - state.videoLogList.value = entity.data!.list!; + state.videoLogList.value = entity.data!; state.videoLogList.refresh(); } } diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart index 17ec61c8..44ce3e3f 100644 --- a/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart +++ b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart @@ -2,6 +2,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; +import 'package:star_lock/flavors.dart'; +import 'package:star_lock/main/lockDetail/videoLog/videoLog/videoLog_entity.dart'; +import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/noData.dart'; import '../../../../app_settings/app_colors.dart'; @@ -43,25 +46,26 @@ class _VideoLogPageState extends State { Visibility(visible: state.isNavLocal.value, child: localTip()), // title加编辑按钮 editVideoTip(), - Visibility( + Obx(() => Visibility( visible: !state.isNavLocal.value, child: Expanded( child: ListView.builder( - itemCount: 5, + itemCount: state.videoLogList.length, itemBuilder: (c, 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("2023.10.2$index", + Text(item.date ?? "", style: TextStyle(fontSize: 20.sp)), ])), - mainListView(index) + mainListView(index, item) ], ); - }))), + })))), // 本地顶部 Visibility( visible: state.isNavLocal.value, @@ -79,7 +83,7 @@ class _VideoLogPageState extends State { Text("2023.10.2$index", style: TextStyle(fontSize: 20.sp)), ])), - mainListView(index) + mainListView(index, CloudStorageData()), ], ); }) @@ -103,7 +107,7 @@ class _VideoLogPageState extends State { state.isNavLocal.value = false; }); }, - child: Obx(() => Text("云存", + child: Obx(() => Text("云存".tr, style: state.isNavLocal.value == true ? TextStyle( color: Colors.grey, @@ -119,7 +123,7 @@ class _VideoLogPageState extends State { state.isNavLocal.value = true; }); }, - child: Obx(() => Text("本地", + child: Obx(() => Text("本地".tr, style: state.isNavLocal.value == true ? TextStyle( color: Colors.white, @@ -154,14 +158,14 @@ class _VideoLogPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text("3天滚动储存", style: TextStyle(fontSize: 24.sp)), + Text("3天滚动储存".tr, style: TextStyle(fontSize: 24.sp)), SizedBox(height: 10.h), - Text("星锁已为本设备免费提供3大滚动视频储存服务", + Text("${F.navTitle}${"已为本设备免费提供3大滚动视频储存服务".tr}", style: TextStyle(fontSize: 22.sp, color: Colors.grey)), ], )), SizedBox(width: 15.w), - Text("去升级", style: TextStyle(fontSize: 22.sp)), + Text("去升级".tr, style: TextStyle(fontSize: 22.sp)), Image( width: 40.w, height: 24.w, @@ -193,9 +197,9 @@ class _VideoLogPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ // SizedBox(height: 20.h), - Text("下载列表", style: TextStyle(fontSize: 24.sp)), + Text("下载列表".tr, style: TextStyle(fontSize: 24.sp)), SizedBox(height: 15.h), - Text("暂无下载内容", + Text("暂无下载内容".tr, style: TextStyle(fontSize: 22.sp, color: Colors.grey)), ], )), @@ -218,7 +222,7 @@ class _VideoLogPageState extends State { child: Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text(state.isNavLocal.value == true ? "已下载" : "全部视频", + Text(state.isNavLocal.value == true ? "已下载".tr : "全部视频".tr, style: TextStyle(fontSize: 26.sp, fontWeight: FontWeight.w500)), Expanded(child: SizedBox(width: 10.w)), IconButton( @@ -230,7 +234,8 @@ class _VideoLogPageState extends State { iconSize: 30, color: Colors.black54, onPressed: () { - Get.toNamed(Routers.editVideoLogPage); + Get.toNamed(Routers.editVideoLogPage, + arguments: {"videoDataList": state.videoLogList.value}); }, ) // TextButton( @@ -248,10 +253,10 @@ class _VideoLogPageState extends State { var itemH = (1.sw - 15.w * 4) / 3 + 40.h; // 云存列表 - Widget mainListView(int index) { + Widget mainListView(int index, CloudStorageData itemData) { return GridView.builder( padding: EdgeInsets.only(left: 15.w, right: 15.w), - itemCount: index + 1, + itemCount: itemData.recordList!.length, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( @@ -264,32 +269,44 @@ class _VideoLogPageState extends State { //子组件宽高长度比例 childAspectRatio: itemW / itemH), itemBuilder: (context, index) { - return videoItem(() { - Get.toNamed(Routers.videoLogDetailPage); - }); + RecordListData recordData = itemData.recordList![index]; + return videoItem(recordData); }, ); } - Widget videoItem(Function() action) { + Widget videoItem(RecordListData recordData) { return GestureDetector( - onTap: action, + onTap: () { + Get.toNamed(Routers.videoLogDetailPage, arguments: { + "recordData": recordData, + "videoDataList": state.videoLogList.value + }); + }, child: SizedBox( width: itemW, height: itemH, child: Column( children: [ - ClipRRect( - borderRadius: BorderRadius.circular(10.w), - child: Image( - width: itemW, - height: itemW, - fit: BoxFit.fill, - image: const AssetImage( - "images/main/icon_lockDetail_monitoringvoiceFrist.png")), + 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(recordData.imagesUrl ?? + "images/icon_video_placeholder.jpg") + .image), + ), ), SizedBox(height: 5.h), - Text("2023.10.23 10:00", style: TextStyle(fontSize: 20.sp)) + Text( + DateTool().dateToYMDHNString(recordData.operateDate.toString()), + textAlign: TextAlign.center, + style: TextStyle(fontSize: 18.sp)) ], ), ), diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/controlsOverlay_page.dart b/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/controlsOverlay_page.dart index f6a7d75d..b1d56954 100644 --- a/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/controlsOverlay_page.dart +++ b/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/controlsOverlay_page.dart @@ -1,10 +1,13 @@ - import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:star_lock/main/lockDetail/videoLog/videoLog/videoLog_entity.dart'; +import 'package:star_lock/tools/dateTool.dart'; import 'package:video_player/video_player.dart'; class ControlsOverlay extends StatelessWidget { - const ControlsOverlay({required this.controller}); + const ControlsOverlay( + {Key? key, required this.controller, required this.recordData}) + : super(key: key); static const List _exampleCaptionOffsets = [ Duration(seconds: -10), @@ -29,6 +32,7 @@ class ControlsOverlay extends StatelessWidget { ]; final VideoPlayerController controller; + final RecordListData recordData; @override Widget build(BuildContext context) { @@ -40,18 +44,18 @@ class ControlsOverlay extends StatelessWidget { child: controller.value.isPlaying ? const SizedBox.shrink() : Container( - color: Colors.black26, - child: const Center( - child: - // CircularProgressIndicator() - Icon( - Icons.play_arrow, - color: Colors.white, - size: 60.0, - semanticLabel: 'Play', - ), - ), - ), + color: Colors.black26, + child: const Center( + child: + // CircularProgressIndicator() + Icon( + Icons.play_arrow, + color: Colors.white, + size: 60.0, + semanticLabel: 'Play', + ), + ), + ), ), GestureDetector( onTap: () { @@ -123,32 +127,47 @@ class ControlsOverlay extends StatelessWidget { left: 0.h, right: 0.h, child: Container( - margin: EdgeInsets.only(left:20.w, right:20.w), + margin: EdgeInsets.only(left: 20.w, right: 20.w), // color: const Color(0xC83C3F41), child: Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Text("星锁 2023/10/23", style: TextStyle(color: Colors.white, fontSize: 20.sp)), + Text( + DateTool() + .dateToYMDHNString(recordData.operateDate.toString()), + style: TextStyle(color: Colors.white, fontSize: 20.sp)), Expanded(child: SizedBox(width: 10.w)), Container( width: 50.w, height: 50.w, padding: EdgeInsets.all(10.w), - child: Image(width: 50.w, height: 50.w, image: const AssetImage("images/main/icon_lockDetail_monitoringShareVideo_white.png")), + child: Image( + width: 50.w, + height: 50.w, + image: const AssetImage( + "images/main/icon_lockDetail_monitoringShareVideo_white.png")), ), SizedBox(width: 20.w), Container( width: 50.w, height: 50.w, padding: EdgeInsets.all(10.w), - child: Image(width: 50.w, height: 50.w, image: const AssetImage("images/main/icon_lockDetail_monitoringDownloadVideo_white.png")), + child: Image( + width: 50.w, + height: 50.w, + image: const AssetImage( + "images/main/icon_lockDetail_monitoringDownloadVideo_white.png")), ), SizedBox(width: 20.w), Container( width: 50.w, height: 50.w, padding: EdgeInsets.all(10.w), - child: Image(width: 50.w, height: 50.w, image: const AssetImage("images/main/icon_lockDetail_monitoringDeletVideo_white.png")), + child: Image( + width: 50.w, + height: 50.w, + image: const AssetImage( + "images/main/icon_lockDetail_monitoringDeletVideo_white.png")), ), ], ), @@ -164,37 +183,50 @@ class ControlsOverlay extends StatelessWidget { color: const Color.fromRGBO(0, 0, 0, 0.5), height: 60.h, child: Row( - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, + mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ //暂停按钮 InkWell( - child: controller.value.isPlaying ? const Icon(Icons.pause, size: 30, color: Color(0xffefefef)) : const Icon(Icons.play_arrow, size: 30, color: Color(0xffefefef)), + child: controller.value.isPlaying + ? const Icon(Icons.pause, + size: 30, color: Color(0xffefefef)) + : const Icon(Icons.play_arrow, + size: 30, color: Color(0xffefefef)), onTap: () { // if(controller.value.isBuffering == false){ // return; // } - controller.value.isPlaying ? controller.pause() : controller.play(); + controller.value.isPlaying + ? controller.pause() + : controller.play(); }, ), //当前播放进度 - Text(formatString(controller.value.position), style: TextStyle(fontSize: 22.sp, color: const Color(0xffefefef)),), + Text( + formatString(controller.value.position), + style: TextStyle( + fontSize: 22.sp, color: const Color(0xffefefef)), + ), //进度条 Expanded( - - child: Slider(activeColor: const Color(0xFFFFFFFF), max: controller.value.duration.inMilliseconds.truncateToDouble(), - value: controller.value.position.inMilliseconds.truncateToDouble(), + child: Slider( + activeColor: const Color(0xFFFFFFFF), + max: controller.value.duration.inMilliseconds + .truncateToDouble(), + value: controller.value.position.inMilliseconds + .truncateToDouble(), onChanged: (newRating) { controller - .seekTo(Duration( - milliseconds: - newRating - .truncate())); + .seekTo(Duration(milliseconds: newRating.truncate())); }, ), ), //总视频进度 - Text(formatString(controller.value.duration), style: TextStyle(fontSize: 22.sp, color: const Color(0xffefefef)),), + Text( + formatString(controller.value.duration), + style: TextStyle( + fontSize: 22.sp, color: const Color(0xffefefef)), + ), //倍速下拉菜单 // DropdownButtonHideUnderline( // child: DropdownButton2( @@ -261,4 +293,4 @@ class ControlsOverlay extends StatelessWidget { var shortName = time.toString().substring(2, 7); return shortName; } -} \ No newline at end of file +} diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_page.dart b/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_page.dart index 8ddc5a56..1f5a1d34 100644 --- a/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_page.dart +++ b/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_page.dart @@ -1,11 +1,12 @@ - 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/tools/dateTool.dart'; import '../../../../app_settings/app_colors.dart'; import '../../../../tools/titleAppBar.dart'; -import 'controlsOverlay_page.dart'; import 'videoLogDetail_logic.dart'; import 'package:video_player/video_player.dart'; @@ -20,34 +21,20 @@ class _VideoLogDetailPageState extends State { final logic = Get.put(VideoLogDetailLogic()); final state = Get.find().state; - late VideoPlayerController _controller; - - // Future _loadCaptions() async { - // final String fileContents = await DefaultAssetBundle.of(context) - // .loadString('images/bumble_bee_captions.vtt'); - // return WebVTTCaptionFile( - // fileContents); // For vtt files, use WebVTTCaptionFile - // } - @override void initState() { super.initState(); - _controller = VideoPlayerController.networkUrl( - Uri.parse('https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4'), - // closedCaptionFile: _loadCaptions(), - // videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true), + + state.videoController = VideoPlayerController.networkUrl( + Uri.parse(state.recordData.value.videoUrl!), + videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true), ); - _controller.addListener(() { - setState(() { - print("controller.value.isBuffering:${_controller.value.isBuffering}"); - }); + state.videoController.addListener(() { + setState(() {}); }); - - _controller.setLooping(false); - // _controller.setVolume(1); - _controller.initialize(); - + state.videoController.setLooping(false); + state.videoController.initialize(); } @override @@ -55,90 +42,119 @@ class _VideoLogDetailPageState extends State { return Scaffold( backgroundColor: Colors.white, appBar: TitleAppBar( - barTitle: "本地视频播放", + barTitle: "视频播放", haveBack: true, backgroundColor: AppColors.mainColor, ), body: Column( children: [ AspectRatio( - aspectRatio: 16/9, + aspectRatio: state.videoController.value.aspectRatio, child: Stack( alignment: Alignment.bottomCenter, children: [ - VideoPlayer(_controller), - // ClosedCaption(text: _controller.value.caption.text), - ControlsOverlay(controller: _controller), - (_controller.value.isPlaying || _controller.value.isBuffering) ? Container() : VideoProgressIndicator(_controller, colors:VideoProgressColors(playedColor:AppColors.mainColor), allowScrubbing: true), + VideoPlayer(state.videoController), + ControlsOverlay( + controller: state.videoController, + recordData: state.recordData.value, + ), + (state.videoController.value.isPlaying || + state.videoController.value.isBuffering) + ? Container() + : VideoProgressIndicator(state.videoController, + colors: VideoProgressColors( + playedColor: AppColors.mainColor), + allowScrubbing: true), ], ), ), Container( - margin: EdgeInsets.only(left:20.w, top: 15.w), + margin: EdgeInsets.only(left: 20.w, top: 15.w), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ Row( children: [ - Text("2023.10.23", style: TextStyle(fontSize: 20.sp)), + Text( + DateTool().dateToYMDString( + state.recordData.value.operateDate.toString()), + style: TextStyle(fontSize: 20.sp)), ], ), SizedBox(height: 15.h), Row( children: [ - videoItem(true), + videoItem(true, state.recordData.value), ], ), ], )), Expanded( - child: ListView.builder( - itemCount: 4, - 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() - ],); - }), - ), + child: ListView.builder( + itemCount: state.videoLogList.length, + itemBuilder: (c, 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() + // ], + // ); + // }), + // ), ], ), ); } - - var itemW = (1.sw - 15.w*4)/3; - var itemH = (1.sw - 15.w*4)/3+40.h; - Widget mainListView(){ + var itemW = (1.sw - 15.w * 4) / 3; + var 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: 4, + itemCount: itemData.recordList!.length, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - //横轴元素个数 + //横轴元素个数 crossAxisCount: 3, //纵轴间距 mainAxisSpacing: 10.w, // 横轴间距 crossAxisSpacing: 15.w, //子组件宽高长度比例 - childAspectRatio: itemW/itemH - ), + childAspectRatio: itemW / itemH), itemBuilder: (context, index) { - return videoItem(false); + return videoItem(false, itemData.recordList![index]); }, ); } - Widget videoItem(bool isPlay){ + Widget videoItem(bool isPlay, RecordListData itemData) { return SizedBox( width: itemW, height: itemH, @@ -148,33 +164,50 @@ class _VideoLogDetailPageState extends State { children: [ ClipRRect( borderRadius: BorderRadius.circular(10.w), - child: Stack( - children: [ - Image(width: itemW, height: itemW, fit: BoxFit.fill, image: const AssetImage("images/main/icon_lockDetail_monitoringvoiceFrist.png")), - Positioned( - left: 8.w, - bottom: 5.h, - child: Text("00:06", style: TextStyle(color: Colors.white, 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("播放中", style: TextStyle(color: Colors.white, fontSize: 22.sp))), - ) - ), - ) - ] - ), + 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("播放中", + style: TextStyle( + color: Colors.white, fontSize: 22.sp))), + )), + ) + ]), ), - SizedBox(height:5.h), - Text("2023.10.23 10:00", style: TextStyle(fontSize: 20.sp)) + SizedBox(height: 5.h), + Text( + DateTool().dateToYMDHNString(itemData.operateDate.toString()), + style: TextStyle(fontSize: 18.sp)) ], ), ], @@ -182,10 +215,14 @@ class _VideoLogDetailPageState extends State { ); } + String formatString(time) { + var shortName = time.toString().substring(2, 7); + return shortName; + } + @override void dispose() { super.dispose(); - _controller.dispose(); + state.videoController.dispose(); } - } diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_state.dart b/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_state.dart index b4240f09..a936dd64 100644 --- a/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_state.dart +++ b/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_state.dart @@ -1,5 +1,20 @@ +import 'package:get/get.dart'; +import 'package:star_lock/main/lockDetail/videoLog/videoLog/videoLog_entity.dart'; +import 'package:video_player/video_player.dart'; +class VideoLogDetailState { + var recordData = RecordListData().obs; + late VideoPlayerController videoController; + var videoLogList = [].obs; -class VideoLogDetailState{ + VideoLogDetailState() { + Map map = Get.arguments; + if (map['recordData'] != null) { + recordData.value = map['recordData']; + } -} \ No newline at end of file + if (map['videoDataList'] != null) { + videoLogList.value = map['videoDataList']; + } + } +} diff --git a/star_lock/lib/network/api_repository.dart b/star_lock/lib/network/api_repository.dart index e443848e..c29f283f 100644 --- a/star_lock/lib/network/api_repository.dart +++ b/star_lock/lib/network/api_repository.dart @@ -12,6 +12,7 @@ import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/coerceOpen import 'package:star_lock/main/lockDetail/messageWarn/msgNotification/msgNotification/msgNotification_entity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKeyList/passwordKeyListEntity.dart'; import 'package:star_lock/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKeyEntity.dart'; +import 'package:star_lock/main/lockDetail/videoLog/videoLog/videoLog_entity.dart'; import 'package:star_lock/mine/mall/lockMall_entity.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoEditAccount/minePersonInfoEditAccount/mineUnbindPhoneOrEmail_entity.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart'; @@ -1961,10 +1962,9 @@ class ApiRepository { } // 获取云存列表 - Future getLockCloudStorageList( - {required int lockId}) async { + Future getLockCloudStorageList({required int lockId}) async { final res = await apiProvider.getLockCloudStorageList(lockId); - return CoerceFingerprintListEntity.fromJson(res.body); + return VideoLogEntity.fromJson(res.body); } // 设置微信公众号推送 diff --git a/star_lock/pubspec.yaml b/star_lock/pubspec.yaml index e4fb4ea6..611d3013 100644 --- a/star_lock/pubspec.yaml +++ b/star_lock/pubspec.yaml @@ -135,7 +135,7 @@ dependencies: jpush_flutter: ^2.5.1 #视频播放器 - video_player: ^2.7.1 + video_player: ^2.8.5 #控制横竖屏控件 auto_orientation: ^2.3.1 audioplayers: ^5.2.1