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