From 8dfd3d717cf9698bcc352dbd2b097f86c81f2a21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=8F=E5=B0=91=E9=98=B3?= <786612630@qq.com> Date: Sat, 18 Nov 2023 10:38:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=A7=86=E9=A2=91=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E3=80=81=E7=9B=91=E6=8E=A7=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/images/bumble_bee_captions.vtt | 7 + star_lock/images/icon_round_white_unSelet.png | Bin 0 -> 3137 bytes star_lock/images/icon_test20231113.png | Bin 0 -> 101497 bytes .../main/icon_lockDetail_messageReminding.png | Bin 0 -> 2495 bytes .../icon_lockDetail_monitoringCloseVoice.png | Bin 0 -> 2127 bytes .../icon_lockDetail_monitoringDeletVideo.png | Bin 0 -> 1665 bytes ..._lockDetail_monitoringDeletVideo_white.png | Bin 0 -> 1913 bytes ...con_lockDetail_monitoringDownloadVideo.png | Bin 0 -> 1476 bytes ...ckDetail_monitoringDownloadVideo_white.png | Bin 0 -> 1894 bytes .../icon_lockDetail_monitoringEditVoice.png | Bin 0 -> 2761 bytes .../icon_lockDetail_monitoringOpenVoice.png | Bin 0 -> 2711 bytes ...n_lockDetail_monitoringScreenRecording.png | Bin 0 -> 1905 bytes .../icon_lockDetail_monitoringScreenshot.png | Bin 0 -> 2107 bytes ..._lockDetail_monitoringShareVideo_white.png | Bin 0 -> 1683 bytes .../icon_lockDetail_monitoringTalkback.png | Bin 0 -> 2883 bytes .../main/icon_lockDetail_monitoringUnlock.png | Bin 0 -> 1871 bytes .../icon_lockDetail_monitoringvoiceFrist.png | Bin 0 -> 19410 bytes .../images/main/icon_lockDetail_videoLog.png | Bin 0 -> 1429 bytes star_lock/lib/appRouters.dart | 32 +- star_lock/lib/blue/blue_manage.dart | 2 + .../blue/io_protocol/io_configuringWifi.dart | 4 +- star_lock/lib/blue/io_tool/io_tool.dart | 1 - star_lock/lib/blue/reciver_data.dart | 6 + star_lock/lib/blue/sender_manage.dart | 2 +- .../configuringWifi_logic.dart | 92 ++++-- .../configuringWifi/configuringWifi_page.dart | 8 +- .../configuringWifi_state.dart | 7 +- .../lcokSet/lockSet/lockSet_page.dart | 13 +- .../msgNotification/msgNotification_page.dart | 20 +- .../lockDetail/lockDetail_page.dart | 42 +-- .../monitoring/lockMonitoring_logic.dart | 9 + .../monitoring/lockMonitoring_page.dart | 170 +++++++++++ .../monitoring/lockMonitoring_state.dart | 7 + .../monitoringRealTimeScreen_logic.dart | 8 + .../monitoringRealTimeScreen_page.dart | 142 +++++++++ .../monitoringRealTimeScreen_state.dart | 7 + .../videoLog/common/after_layout.dart | 12 + .../common/video/controller_widget.dart | 33 +++ .../common/video/video_player_UI.dart | 209 ++++++++++++++ .../common/video/video_player_control.dart | 273 ++++++++++++++++++ .../common/video/video_player_pan.dart | 246 ++++++++++++++++ .../common/video/video_player_slider.dart | 131 +++++++++ .../editVideoLog/editVideoLog_logic.dart | 8 + .../editVideoLog/editVideoLog_page.dart | 162 +++++++++++ .../editVideoLog/editVideoLog_state.dart | 10 + .../videoLog/videoLog/videoLog_logic.dart | 8 + .../videoLog/videoLog/videoLog_page.dart | 262 +++++++++++++++++ .../videoLog/videoLog/videoLog_state.dart | 8 + .../videoLogDetail/controlsOverlay_page.dart | 264 +++++++++++++++++ .../videoLogDetail/videoLogDetail_logic.dart | 10 + .../videoLogDetail/videoLogDetail_page.dart | 191 ++++++++++++ .../videoLogDetail/videoLogDetail_state.dart | 5 + .../videoLogDownLoad_logic.dart | 9 + .../videoLogDownLoad_page.dart | 103 +++++++ .../videoLogDownLoad_state.dart | 5 + .../demoModeLockDetail_page.dart | 9 + .../demoModeLockSet/demoModeLockSet_page.dart | 124 ++++---- .../mine/addLock/saveLock/saveLock_logic.dart | 1 + .../lib/mine/mine/starLockMine_page.dart | 10 +- .../valueAddedServicesList_page.dart | 9 +- star_lock/lib/network/api_provider_base.dart | 2 + star_lock/lib/tools/noData.dart | 3 +- star_lock/pubspec.yaml | 7 +- 63 files changed, 2548 insertions(+), 145 deletions(-) create mode 100644 star_lock/images/bumble_bee_captions.vtt create mode 100644 star_lock/images/icon_round_white_unSelet.png create mode 100644 star_lock/images/icon_test20231113.png create mode 100644 star_lock/images/main/icon_lockDetail_messageReminding.png create mode 100644 star_lock/images/main/icon_lockDetail_monitoringCloseVoice.png create mode 100644 star_lock/images/main/icon_lockDetail_monitoringDeletVideo.png create mode 100644 star_lock/images/main/icon_lockDetail_monitoringDeletVideo_white.png create mode 100644 star_lock/images/main/icon_lockDetail_monitoringDownloadVideo.png create mode 100644 star_lock/images/main/icon_lockDetail_monitoringDownloadVideo_white.png create mode 100644 star_lock/images/main/icon_lockDetail_monitoringEditVoice.png create mode 100644 star_lock/images/main/icon_lockDetail_monitoringOpenVoice.png create mode 100644 star_lock/images/main/icon_lockDetail_monitoringScreenRecording.png create mode 100644 star_lock/images/main/icon_lockDetail_monitoringScreenshot.png create mode 100644 star_lock/images/main/icon_lockDetail_monitoringShareVideo_white.png create mode 100644 star_lock/images/main/icon_lockDetail_monitoringTalkback.png create mode 100644 star_lock/images/main/icon_lockDetail_monitoringUnlock.png create mode 100644 star_lock/images/main/icon_lockDetail_monitoringvoiceFrist.png create mode 100644 star_lock/images/main/icon_lockDetail_videoLog.png create mode 100644 star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart create mode 100644 star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart create mode 100644 star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart create mode 100644 star_lock/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_logic.dart create mode 100644 star_lock/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_page.dart create mode 100644 star_lock/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_state.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/common/after_layout.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/common/video/controller_widget.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/common/video/video_player_UI.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/common/video/video_player_control.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/common/video/video_player_pan.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/common/video/video_player_slider.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_logic.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_page.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_state.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_logic.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_state.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/videoLogDetail/controlsOverlay_page.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_logic.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_page.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_state.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_logic.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_page.dart create mode 100644 star_lock/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_state.dart diff --git a/star_lock/images/bumble_bee_captions.vtt b/star_lock/images/bumble_bee_captions.vtt new file mode 100644 index 00000000..1dca2c58 --- /dev/null +++ b/star_lock/images/bumble_bee_captions.vtt @@ -0,0 +1,7 @@ +WEBVTT + +00:00:00.200 --> 00:00:01.750 +[ Birds chirping ] + +00:00:02.300 --> 00:00:05.000 +[ Buzzing ] diff --git a/star_lock/images/icon_round_white_unSelet.png b/star_lock/images/icon_round_white_unSelet.png new file mode 100644 index 0000000000000000000000000000000000000000..99135fc4aea388b6d4ee73720f1baf6825b5eca7 GIT binary patch literal 3137 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 literal 0 HcmV?d00001 diff --git a/star_lock/images/icon_test20231113.png b/star_lock/images/icon_test20231113.png new file mode 100644 index 0000000000000000000000000000000000000000..f30018c71af542f6d37572326931747378254e8c GIT binary patch literal 101497 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 J8vL33e*qpq;kEz( literal 0 HcmV?d00001 diff --git a/star_lock/images/main/icon_lockDetail_monitoringDeletVideo_white.png b/star_lock/images/main/icon_lockDetail_monitoringDeletVideo_white.png new file mode 100644 index 0000000000000000000000000000000000000000..2ac7f119bb48fff07fba02aa3b37ac0447175cb2 GIT binary patch literal 1913 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 ZEH$FWv|;M=Wrb2Q!OPv(t-_Tj{0q^8O>qDK literal 0 HcmV?d00001 diff --git a/star_lock/images/main/icon_lockDetail_monitoringDownloadVideo_white.png b/star_lock/images/main/icon_lockDetail_monitoringDownloadVideo_white.png new file mode 100644 index 0000000000000000000000000000000000000000..94c4fbb66155e5dc36ea6c280eafeb3e488b00c1 GIT binary patch literal 1894 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 RE@St#fs2znz1|@xq$)-g0DyFMqU@7L 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 literal 0 HcmV?d00001 diff --git a/star_lock/images/main/icon_lockDetail_monitoringUnlock.png b/star_lock/images/main/icon_lockDetail_monitoringUnlock.png new file mode 100644 index 0000000000000000000000000000000000000000..d885721e3808f58befd9be3e7875ffd0ab52cc16 GIT binary patch literal 1871 zcmeH|`BxJ70>!@|D54ZP=0YW|S(z&~W@i-4y~W5}8cfYmhp|md(bPsztI0R`w8^E^ z&<S%>rD43ch;*&8|ResVd}pk4Df$~;3Mu}O;JhED&+hO#{S zL-VNS0J9|xpaCkV^kZ*KFkc9Hy?CObh09%H5|Rc@IB-5`KWSAfG@ESIjMR&DoZ1XaMnlx!({9Y2%sb;^9BRCq?(rCFLd!~SVIhB&7&f#{#fl_;Nfs?gLKS#mwg zhE?P4W>4;LSh=L3)3kebaLlfVu)z`97AK0Q<9!S6z523Q2BEqBy54DG$IAOud_-St ziHm;nv@Ozp<=UxNjnY5NRkzrh?Ra2oW~Kpz%Mu~Nzz%2Vc{=a{>_)Nmjp8FOLmiHq zL0ta=`*7Iy)2&y6;qJ|889tLfKTd0+P)f9!8hG~mxwl~oQfi+p+u7n5F|21->U}8< zlU@dD)v-cuHGX~>1zf_Ri@yZU+kHG#)8kgmBvhRvtcXpsDG_EWG!A=hZLNrZo_f=I zK*Y&aZ`V4*lt@twSOAY(Kpfp4cR1%)JG~! z$WGZgaZ(v=FF6^!DQCDY$2g6KwXS~(I3{w;=EvBJ?nm!h`bxpksuu~Y}wp7wXsJL(z+RxW<0AVi)^C*m_S4pIzrgv*k8Nq zxJh0(lNhXuOlc$Q$HiazXtRK!5|MfUwx!TH*tug}l(^P9tG-oLgEolE%z`3j^+>!Q;Kx74?&AtD-r^iSsKYCep@t8-VxV-d3He zJhwR+pbOxj;-nUYXyK^Q;{kNgEME^8;oi_bq8@}uU?1G31t^!F5JF%C$Xl7eJLu`` zf>N{q-2L(YO67Int{*d`l_XhHtf`Wc;MSzmRlH z2Egd5G-1u(jO+ask#5lrpcej`ktxZxcFR!lm**VS0f(BBw|@?(sw_x#chLppic3=5 zx5>pl_v(5oW+-y8_u_7zv)6&mD?d+*FgM}+KPN{|j=bkaHy$d<2~0R1t^>XprlY|) z`acw`E67!}vDhH?b|EeYd{DMoSwcSS+D|ru@TdO_4utZLo$V$-Y47#8RWMpnPjMOy zJhZv^vpR5m{Jb&B91N9BXqtfozh4p@28}*l2Hqfcbu>Tk z{{wNVhmo|-$afiZuQ8rjTtE?C45RR{^ zv8Y&duIvO8LW6}x?4B~6OuSr8f(x&nu9Hm1t47uAK!GFsGWgFbR@B4AyrR>oh>+~Z zwj=IzBwtuAzjC#f!|C-HRa+Lv)TemJ7!*a{;01F^$Qb6ny*2Q^TU#B#fTP*&lR4uk7wnFN|O*JJ{{aOnU)=xz literal 0 HcmV?d00001 diff --git a/star_lock/images/main/icon_lockDetail_monitoringvoiceFrist.png b/star_lock/images/main/icon_lockDetail_monitoringvoiceFrist.png new file mode 100644 index 0000000000000000000000000000000000000000..cc5f8781ab4baa225eff507c825666a7dc1084a1 GIT binary patch literal 19410 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 const LowBatteryReminderPage()), GetPage( name: Routers.coerceFingerprintListPage, - page: () => const CoerceFingerprintListPage()) + page: () => const CoerceFingerprintListPage()), + GetPage( + name: Routers.lockMonitoringPage, + page: () => const LockMonitoringPage()), + GetPage( + name: Routers.monitoringRealTimeScreenPage, + page: () => const MonitoringRealTimeScreenPage()), + GetPage( + name: Routers.videoLogPage, + page: () => const VideoLogPage()), + GetPage( + name: Routers.editVideoLogPage, + page: () => const EditVideoLogPage()), + GetPage( + name: Routers.videoLogDetailPage, + page: () => const VideoLogDetailPage()), + GetPage( + name: Routers.videoLogDownLoadPage, + page: () => const VideoLogDownLoadPage()), ]; } diff --git a/star_lock/lib/blue/blue_manage.dart b/star_lock/lib/blue/blue_manage.dart index 773bf791..0ca50143 100644 --- a/star_lock/lib/blue/blue_manage.dart +++ b/star_lock/lib/blue/blue_manage.dart @@ -82,6 +82,7 @@ class BlueManage{ } else { _scanDevices.add(device); } + scanResultCallBack(_scanDevices); } }else{ @@ -94,6 +95,7 @@ class BlueManage{ } else { _scanDevices.add(device); } + // print("_scanDevices:$_scanDevices"); scanResultCallBack(_scanDevices); } } diff --git a/star_lock/lib/blue/io_protocol/io_configuringWifi.dart b/star_lock/lib/blue/io_protocol/io_configuringWifi.dart index 00575c68..d7865623 100644 --- a/star_lock/lib/blue/io_protocol/io_configuringWifi.dart +++ b/star_lock/lib/blue/io_protocol/io_configuringWifi.dart @@ -16,7 +16,7 @@ class SenderConfiguringWifiCommand extends SenderProtocol { String? ssid; String? password; int? numberOfServers; - int? listOfServers; + List? listOfServers; List? token; int? needAuthor; List? publicKey; @@ -76,7 +76,7 @@ class SenderConfiguringWifiCommand extends SenderProtocol { subData.add(numberOfServers!); // listOfServers - subData.add(listOfServers!); + subData.addAll(listOfServers!); // token // subData.addAll(token!); diff --git a/star_lock/lib/blue/io_tool/io_tool.dart b/star_lock/lib/blue/io_tool/io_tool.dart index 3d20b000..18fc8e69 100644 --- a/star_lock/lib/blue/io_tool/io_tool.dart +++ b/star_lock/lib/blue/io_tool/io_tool.dart @@ -3,7 +3,6 @@ import 'dart:typed_data'; import 'package:crypto/crypto.dart'; import 'package:flutter/services.dart'; -import 'package:encrypt/encrypt.dart' as ddd; List changeIntListToStringList(List list){ List strList = []; diff --git a/star_lock/lib/blue/reciver_data.dart b/star_lock/lib/blue/reciver_data.dart index 9776e72b..4f3c34f3 100644 --- a/star_lock/lib/blue/reciver_data.dart +++ b/star_lock/lib/blue/reciver_data.dart @@ -252,6 +252,12 @@ class CommandReciverManager { reply = SenderReferEventRecordTimeReply.parseData(commandType, data); } break; + // case 50: + // { + // // wifi配网 + // reply = SenderConfiguringWifiReply.parseData(commandType, data); + // } + // break; case 51: { // wifi配网结果 diff --git a/star_lock/lib/blue/sender_manage.dart b/star_lock/lib/blue/sender_manage.dart index 13ea1133..35fdc17f 100644 --- a/star_lock/lib/blue/sender_manage.dart +++ b/star_lock/lib/blue/sender_manage.dart @@ -516,7 +516,7 @@ class IoSenderManage { required String? ssid, required String? password, required int? numberOfServers, - required int? listOfServers, + required List? listOfServers, required List? token, required int? needAuthor, required List? publicKey, diff --git a/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart b/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart index a9464f88..2573a862 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_logic.dart @@ -5,6 +5,7 @@ import 'package:flutter_reactive_ble/flutter_reactive_ble.dart'; import 'package:network_info_plus/network_info_plus.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/tools/toast.dart'; import '../../../../blue/blue_manage.dart'; import '../../../../blue/io_protocol/io_configuringWifi.dart'; @@ -24,6 +25,23 @@ class ConfiguringWifiLogic extends BaseGetXController{ var entity = await ApiRepository.to.getWifiLockServiceIpAndPort(); if(entity.errorCode! == 0){ state.configuringWifiEntity.value = entity; + + // var serversList = []; + // for(int i = 0; i _replySubscription; void _initReplySubscription() { _replySubscription = EventBusManager().eventBus!.on().listen((reply) async { - // 配置wifi + // WIFI配网结果 if(reply is SenderConfiguringWifiReply) { _replySenderConfiguringWifi(reply); } }); } - // 开门数据解析 + // WIFI配网结果 Future _replySenderConfiguringWifi(Reply reply) async { - var privateKey = await Storage.getStringList(saveBluePrivateKey); - List getPrivateKeyList = changeStringListToIntList(privateKey!); - - var signKey = await Storage.getStringList(saveBlueSignKey); - List signKeyDataList = changeStringListToIntList(signKey!); - - var tokenData = reply.data.sublist(2, 6); - var saveStrList = changeIntListToStringList(tokenData); - print("openDoorToken:$tokenData"); - Storage.setStringList(saveBlueToken, saveStrList); - int status = reply.data[6]; print("status:$status"); @@ -58,20 +65,48 @@ class ConfiguringWifiLogic extends BaseGetXController{ case 0x00: //成功 print("${reply.commandType}数据解析成功"); - + Toast.show(msg: "配网成功"); break; case 0x06: //无权限 print("${reply.commandType}需要鉴权"); - IoSenderManage.senderOpenLock( - keyID: "1", + var privateKey = await Storage.getStringList(saveBluePrivateKey); + List getPrivateKeyList = changeStringListToIntList(privateKey!); + + var publicKey = await Storage.getStringList(saveBluePublicKey); + List publicKeyDataList = changeStringListToIntList(publicKey!); + + var tokenData = reply.data.sublist(7, 10); + var saveStrList = changeIntListToStringList(tokenData); + print("openDoorToken:$tokenData"); + Storage.setStringList(saveBlueToken, saveStrList); + + var serversList = []; + for(int i = 0; i[]; + for(int i = 0; i { configuringWifiTFWidget(TranslationLoader.lanKeys!.wifiPassward!.tr, TranslationLoader.lanKeys!.pleaseEnterWifiPwd!.tr, state.wifiPWDController), SizedBox(height: 50.h,), SubmitBtn(btnName: TranslationLoader.lanKeys!.sure!.tr, onClick: () { - + logic.senderConfiguringWifiAction(); }), ], )); @@ -51,14 +51,14 @@ class _ConfiguringWifiPageState extends State { leftTitel: titleStr, rightTitle: "", isHaveRightWidget: true, - rightWidget: getTFWidget(rightTitle)), + rightWidget: getTFWidget(rightTitle, controller)), Container(height: 10.h), ], ); } // 接受者信息输入框 - Widget getTFWidget(String tfStr) { + Widget getTFWidget(String tfStr, TextEditingController controller) { return Container( height: 50.h, width: 300.w, @@ -68,7 +68,7 @@ class _ConfiguringWifiPageState extends State { child: TextField( //输入框一行 maxLines: 1, - // controller: _controller, + controller: controller, autofocus: false, textAlign: TextAlign.end, decoration: InputDecoration( diff --git a/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_state.dart b/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_state.dart index a7b72204..011dae01 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_state.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/configuringWifi/configuringWifi_state.dart @@ -3,15 +3,20 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import '../lockSet/lockSetInfo_entity.dart'; import 'configuringWifiEntity.dart'; class ConfiguringWifiState{ var configuringWifiEntity = ConfiguringWifiEntity().obs; + var lockSetInfoData = LockSetInfoData().obs; + var lockBasicInfo = LockBasicInfo().obs; TextEditingController wifiNameController = TextEditingController(); TextEditingController wifiPWDController = TextEditingController(); ConfiguringWifiState() { - // wifiNameController.text = emailOrPhone.value; + var map = Get.arguments; + lockSetInfoData.value = map["lockSetInfoData"]; + lockBasicInfo.value = lockSetInfoData.value.lockBasicInfo!; } } \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart index fe56b58b..f8a1b2e3 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/lockSet/lockSet_page.dart @@ -1,4 +1,3 @@ -import 'dart:async'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -421,14 +420,20 @@ class _LockSetPageState extends State with RouteAware { () => Visibility( visible: state.lockFeature.value.wifi == 1 ? true : false, - child: CommonItem( + child: + CommonItem( leftTitel: TranslationLoader.lanKeys!.wifiDistributionNetwork!.tr, rightTitle: "", isHaveLine: true, isHaveDirection: true, action: () { - Get.toNamed(Routers.configuringWifiPage); - })), + Get.toNamed(Routers.configuringWifiPage, + arguments: { + 'lockSetInfoData': + state.lockSetInfoData.value + }); + }) + ), ), // Obx(() => // 锁时间 diff --git a/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_page.dart b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_page.dart index de53e6b6..e65d973c 100644 --- a/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_page.dart +++ b/star_lock/lib/main/lockDetail/lcokSet/msgNotification/msgNotification_page.dart @@ -81,16 +81,16 @@ class _MsgNotificationPageState extends State { Get.toNamed(Routers.nDaysUnopenedPage); }, ), - SizedBox( - height: 20.h, - ), - Obx(() => CommonItem( - leftTitel: '离家开门', - rightTitle: "", - isHaveLine: false, - isHaveRightWidget: true, - rightWidget: - SizedBox(width: 60.w, height: 50.h, child: _switch(1)))), + // SizedBox( + // height: 20.h, + // ), + // Obx(() => CommonItem( + // leftTitel: '离家开门', + // rightTitle: "", + // isHaveLine: false, + // isHaveRightWidget: true, + // rightWidget: + // SizedBox(width: 60.w, height: 50.h, child: _switch(1)))), SizedBox( height: 20.h, ), diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart index ef19d95a..7d8f8e8d 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -72,7 +72,10 @@ class _LockDetailPageState extends State height: 1.sh - ScreenUtil().statusBarHeight * 2, color: Colors.white, child: Column( - children: [topWidget(), Expanded(child: bottomWidget())], + children: [ + topWidget(), + Expanded(child: bottomWidget()) + ], ), ); } @@ -114,7 +117,7 @@ class _LockDetailPageState extends State Stack( alignment: Alignment.center, children: [ - Container( + SizedBox( width: 1.sw - 120.w * 2, child: Center( child: Text( @@ -124,22 +127,15 @@ class _LockDetailPageState extends State ))), Positioned( child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text( - "100%", - style: TextStyle( - fontSize: 18.sp, color: AppColors.darkGrayTextColor), - ), - SizedBox(width: 2.w), - Image.asset( - 'images/main/icon_main_cell.png', - width: 30.w, - height: 24.w, - ), - SizedBox(width: 30.w), - ], - )) + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text("100%", style: TextStyle(fontSize: 18.sp, color: AppColors.darkGrayTextColor)), + SizedBox(width: 2.w), + Image.asset('images/main/icon_main_cell.png', width: 30.w, height: 24.w), + SizedBox(width: 30.w), + ], + ) + ) ], ), SizedBox(height: 30.h), @@ -383,7 +379,10 @@ class _LockDetailPageState extends State bottomItem('images/main/icon_catEyes.png', '监控', () { // Navigator.pushNamed(context, Routers.otherTypeKeyListPage, // arguments: 1); - Toast.show(msg: "功能暂未开放"); + // Toast.show(msg: "功能暂未开放"); + Get.toNamed(Routers.lockMonitoringPage, arguments: { + "lockId": widget.lockListInfoItemEntity.lockId + }); }), ); } @@ -402,11 +401,12 @@ class _LockDetailPageState extends State arguments: {"keyInfo": widget.lockListInfoItemEntity}); }), // 视频日志 - bottomItem('images/main/icon_main_set.png', "视频日志", () { + bottomItem('images/main/icon_lockDetail_videoLog.png', "视频日志", () { //视频日志 + Get.toNamed(Routers.videoLogPage); }), // 消息提醒 - bottomItem('images/main/icon_main_set.png', "消息提醒", () { + bottomItem('images/main/icon_lockDetail_messageReminding.png', "消息提醒", () { Get.toNamed(Routers.msgNotificationPage); }), // 设置 diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart new file mode 100644 index 00000000..4ddd39ef --- /dev/null +++ b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_logic.dart @@ -0,0 +1,9 @@ + +import '../../../../tools/baseGetXController.dart'; +import 'lockMonitoring_state.dart'; + +class LockMonitoringLogic extends BaseGetXController { + final LockMonitoringState state = LockMonitoringState(); + + +} \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart new file mode 100644 index 00000000..c4cfd9c6 --- /dev/null +++ b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_page.dart @@ -0,0 +1,170 @@ + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../../../appRouters.dart'; +import '../../../../app_settings/app_colors.dart'; +import 'lockMonitoring_logic.dart'; + + +class LockMonitoringPage extends StatefulWidget { + const LockMonitoringPage({Key? key}) : super(key: key); + + @override + State createState() => _LockMonitoringPageState(); +} + +class _LockMonitoringPageState extends State { + final logic = Get.put(LockMonitoringLogic()); + final state = Get.find().state; + + @override + Widget build(BuildContext context) { + return Container( + width: 1.sw, + height: 1.sh, + color: Colors.white, + child: Column( + children: [ + Stack( + // alignment: Alignment.bottomCenter, + children: [ + Image.asset("images/icon_test20231113.png", width: 1.sw, height: 1.sh, fit: BoxFit.cover), + Positioned( + top: ScreenUtil().statusBarHeight + 30.h, + child: Row( + children: [ + SizedBox(width: 30.w), + GestureDetector( + onTap: () { + Get.back(); + }, + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(30.h) + ), + padding: EdgeInsets.all(10.w), + child: Image(width: 40.w, height: 40.w, image: const AssetImage("images/icon_left_black.png"),), + ), + ), + ]), + ), + Positioned( + bottom: 10.w, + child: Container( + width: 1.sw - 30.w*2, + // height: 300.h, + margin: EdgeInsets.all(30.w), + decoration: BoxDecoration( + color: const Color(0xC83C3F41), + borderRadius: BorderRadius.circular(20.h) + ), + child: Column( + children: [ + SizedBox(height: 20.h), + bottomTopBtnWidget(), + SizedBox(height: 20.h), + bottomBottomBtnWidget(), + SizedBox(height: 20.h), + ], + ), + )) + ], + ), + ], + ), + ); + } + + Widget bottomTopBtnWidget(){ + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // 打开关闭声音 + GestureDetector( + onTap: () { + state.isOpenVoice.value = !state.isOpenVoice.value; + }, + child: Container( + width: 50.w, + height: 50.w, + padding: EdgeInsets.all(5.w), + child: Obx(() => Image( + width: 40.w, + height: 40.w, + image: state.isOpenVoice.value + ? const AssetImage("images/main/icon_lockDetail_monitoringCloseVoice.png") + : const AssetImage("images/main/icon_lockDetail_monitoringOpenVoice.png") + )), + ), + ), + SizedBox(width: 60.w), + // 截图 + GestureDetector( + onTap: () { + // Get.toNamed(Routers.monitoringRealTimeScreenPage); + }, + child: Container( + width: 50.w, + height: 50.w, + padding: EdgeInsets.all(5.w), + child: Image(width: 40.w, height: 40.w, image: const AssetImage("images/main/icon_lockDetail_monitoringScreenshot.png")), + ), + ), + SizedBox(width: 60.w), + // 录制 + GestureDetector( + onTap: () { + // Get.toNamed(Routers.monitoringRealTimeScreenPage); + }, + child: Container( + width: 50.w, + height: 50.w, + padding: EdgeInsets.all(5.w), + child: Image(width: 40.w, height: 40.w, image: const AssetImage("images/main/icon_lockDetail_monitoringScreenRecording.png")), + ), + ), + ]); + } + + Widget bottomBottomBtnWidget(){ + return Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + bottomBtnItemWidget("images/main/icon_lockDetail_monitoringTalkback.png", "点击对讲", Colors.white,(){ + + }), + bottomBtnItemWidget("images/main/icon_lockDetail_monitoringUnlock.png", "长按开锁", AppColors.mainColor,(){ + + }) + ]); + } + + Widget bottomBtnItemWidget(String iconUrl, String name, Color backgroundColor, Function() onClick) { + var wh = 80.w; + return GestureDetector( + onTap: onClick, + child: SizedBox( + height: 140.h, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: wh, + height: wh, + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular((wh+ 10.w*2)/2) + ), + padding: EdgeInsets.all(20.w), + child: Image.asset(iconUrl, fit: BoxFit.fitWidth), + ), + SizedBox(height: 20.w), + Expanded(child: Text(name, style: TextStyle(fontSize: 20.sp, color: Colors.white), textAlign: TextAlign.center)) + ], + )), + ); + } +} diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart new file mode 100644 index 00000000..991d59bf --- /dev/null +++ b/star_lock/lib/main/lockDetail/monitoring/monitoring/lockMonitoring_state.dart @@ -0,0 +1,7 @@ + +import 'package:get/get.dart'; + +class LockMonitoringState { + var isOpenVoice = false.obs; + +} \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_logic.dart b/star_lock/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_logic.dart new file mode 100644 index 00000000..954a497a --- /dev/null +++ b/star_lock/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_logic.dart @@ -0,0 +1,8 @@ + +import 'package:star_lock/tools/baseGetXController.dart'; +import 'monitoringRealTimeScreen_state.dart'; + +class MonitoringRealTimeScreenLogic extends BaseGetXController{ + MonitoringRealTimeScreenState state = MonitoringRealTimeScreenState(); + +} \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_page.dart b/star_lock/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_page.dart new file mode 100644 index 00000000..5a27981c --- /dev/null +++ b/star_lock/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_page.dart @@ -0,0 +1,142 @@ + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/titleAppBar.dart'; +import 'monitoringRealTimeScreen_logic.dart'; + +class MonitoringRealTimeScreenPage extends StatefulWidget { + const MonitoringRealTimeScreenPage({Key? key}) : super(key: key); + + @override + State createState() => _MonitoringRealTimeScreenPageState(); +} + +class _MonitoringRealTimeScreenPageState extends State { + final logic = Get.put(MonitoringRealTimeScreenLogic()); + final state = Get.find().state; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: AppColors.mainBackgroundColor, + appBar: TitleAppBar( + barTitle: "实时播放", + haveBack: true, + backgroundColor: AppColors.mainColor, + ), + body: Stack( + alignment: Alignment.bottomCenter, + children: [ + Column( + children: [ + Image.asset("images/icon_test20231113.png", width: 1.sw, height: 1.sw/5*4, fit: BoxFit.cover), + middleWidget(), + ], + ), + Positioned( + bottom: 60.h, + child: bottomBtnWidget() + ), + ], + ), + ); + } + + Widget middleWidget(){ + return Container( + color: Colors.grey, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + // 打开关闭声音 + GestureDetector( + onTap: () { + state.isOpenVoice.value = !state.isOpenVoice.value; + }, + child: Container( + width: 50.w, + height: 50.w, + padding: EdgeInsets.all(5.w), + child: Obx(() => Image( + width: 40.w, + height: 40.w, + image: state.isOpenVoice.value + ? const AssetImage("images/main/icon_lockDetail_monitoringCloseVoice.png") + : const AssetImage("images/main/icon_lockDetail_monitoringOpenVoice.png") + )), + ), + ), + // SizedBox(width: 60.w), + // 截图 + GestureDetector( + onTap: () { + + }, + child: Container( + width: 50.w, + height: 50.w, + padding: EdgeInsets.all(5.w), + child: Image(width: 40.w, height: 40.w, image: const AssetImage("images/main/icon_lockDetail_monitoringScreenshot.png")), + ), + ), + // SizedBox(width: 60.w), + // 录制 + GestureDetector( + onTap: () { + + }, + child: Container( + width: 50.w, + height: 50.w, + padding: EdgeInsets.all(5.w), + child: Image(width: 40.w, height: 40.w, image: const AssetImage("images/main/icon_lockDetail_monitoringScreenRecording.png")), + ), + ), + ]), + ); + } + + Widget bottomBtnWidget(){ + return Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + bottomBtnItemWidget("images/main/icon_lockDetail_monitoringTalkback.png", "点击对讲", Colors.white, (){ + + }), + SizedBox(width: (1.sw - 80.w)/3), + bottomBtnItemWidget("images/main/icon_lockDetail_monitoringUnlock.png", "长按开锁", AppColors.mainColor, (){ + + }) + ]); + } + + Widget bottomBtnItemWidget(String iconUrl, String name, Color backgroundColor, Function() onClick) { + var wh = 80.w; + return GestureDetector( + onTap: onClick, + child: SizedBox( + height: 140.h, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + width: wh, + height: wh, + decoration: BoxDecoration( + color: backgroundColor, + borderRadius: BorderRadius.circular((wh+ 10.w*2)/2) + ), + padding: EdgeInsets.all(20.w), + child: Image.asset(iconUrl, fit: BoxFit.fitWidth), + ), + SizedBox(height: 20.w), + Expanded(child: Text(name, style: TextStyle(fontSize: 20.sp, color: Colors.black), textAlign: TextAlign.center)) + ], + )), + ); + } + +} diff --git a/star_lock/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_state.dart b/star_lock/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_state.dart new file mode 100644 index 00000000..66a5461e --- /dev/null +++ b/star_lock/lib/main/lockDetail/monitoring/monitoringRealTimeScreen/monitoringRealTimeScreen_state.dart @@ -0,0 +1,7 @@ + +import 'package:get/get.dart'; + +class MonitoringRealTimeScreenState{ + var isOpenVoice = false.obs; + +} \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/videoLog/common/after_layout.dart b/star_lock/lib/main/lockDetail/videoLog/common/after_layout.dart new file mode 100644 index 00000000..343b6357 --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/common/after_layout.dart @@ -0,0 +1,12 @@ +import 'package:flutter/material.dart'; + +mixin AfterLayoutMixin on State { + @override + void initState() { + super.initState(); + WidgetsBinding.instance + .addPostFrameCallback((_) => afterFirstLayout(context)); + } + + void afterFirstLayout(BuildContext context); +} \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/videoLog/common/video/controller_widget.dart b/star_lock/lib/main/lockDetail/videoLog/common/video/controller_widget.dart new file mode 100644 index 00000000..d342986b --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/common/video/controller_widget.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; +import 'package:video_player/video_player.dart'; + +import 'video_player_control.dart'; + +class ControllerWidget extends InheritedWidget { + final String title; + final GlobalKey controlKey; + final Widget child; + final VideoPlayerController controller; + final bool videoInit; + + ControllerWidget( + {Key? key, + required this.controlKey, + required this.child, + required this.controller, + required this.videoInit, + required this.title + }) : super(key: key, child: child); + + //定义一个便捷方法,方便子树中的widget获取共享数据 + static ControllerWidget? of(BuildContext context) { + return context.dependOnInheritedWidgetOfExactType(); + } + + @override + bool updateShouldNotify(InheritedWidget oldWidget) { + // TODO: implement updateShouldNotify + return false; + } + +} \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/videoLog/common/video/video_player_UI.dart b/star_lock/lib/main/lockDetail/videoLog/common/video/video_player_UI.dart new file mode 100644 index 00000000..2b32e04d --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/common/video/video_player_UI.dart @@ -0,0 +1,209 @@ +import 'dart:io'; +import 'dart:ui'; +import 'package:flutter/material.dart'; +// import 'package:screen/screen.dart'; +import 'package:video_player/video_player.dart'; +import 'controller_widget.dart'; +import 'video_player_control.dart'; +import 'video_player_pan.dart'; + +enum VideoPlayerType { network, asset, file } + +class VideoPlayerUI extends StatefulWidget { + VideoPlayerUI.network({ + Key? key, + required String this.url, // 当前需要播放的地址 + required this.width, // 播放器尺寸(大于等于视频播放区域) + required this.height, + this.title = '', // 视频需要显示的标题 + }) : type = VideoPlayerType.network, + super(key: key); + + VideoPlayerUI.asset({ + Key? key, + required String dataSource, // 当前需要播放的地址 + this.width = double.infinity, // 播放器尺寸(大于等于视频播放区域) + this.height = double.infinity, + this.title = '', // 视频需要显示的标题 + }) : type = VideoPlayerType.asset, + url = dataSource, + super(key: key); + + const VideoPlayerUI.file({ + Key? key, + required File file, // 当前需要播放的地址 + this.width = double.infinity, // 播放器尺寸(大于等于视频播放区域) + this.height = double.infinity, + this.title = '', // 视频需要显示的标题 + }) : type = VideoPlayerType.file, + url = file, + super(key: key); + + final url; + final VideoPlayerType type; + final double width; + final double height; + final String title; + + @override + _VideoPlayerUIState createState() => _VideoPlayerUIState(); +} + +class _VideoPlayerUIState extends State { + final GlobalKey _key = + GlobalKey(); + + ///指示video资源是否加载完成,加载完成后会获得总时长和视频长宽比等信息 + bool _videoInit = false; + bool _videoError = false; + + late VideoPlayerController _controller; // video控件管理器 + + /// 记录是否全屏 + bool get _isFullScreen => + MediaQuery.of(context).orientation == Orientation.landscape; + + Size get _window => MediaQueryData.fromWindow(window).size; + + @override + void initState() { + super.initState(); + _urlChange(); // 初始进行一次url加载 + // Screen.keepOn(true); // 设置屏幕常亮 + } + + @override + void didUpdateWidget(VideoPlayerUI oldWidget) { + if (oldWidget.url != widget.url) { + _urlChange(); // url变化时重新执行一次url加载 + } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() async { + super.dispose(); + if (_controller != null) { + _controller.removeListener(_videoListener); + _controller.dispose(); + } + // Screen.keepOn(false); + } + + @override + Widget build(BuildContext context) { + return SafeArea( + top: !_isFullScreen, + bottom: !_isFullScreen, + left: !_isFullScreen, + right: !_isFullScreen, + child: Container( + width: _isFullScreen ? _window.width : widget.width, + height: _isFullScreen ? _window.height : widget.height, + child: _isHadUrl(), + ), + ); + } + +// 判断是否有url + Widget _isHadUrl() { + if (widget.url != null) { + return ControllerWidget( + controlKey: _key, + controller: _controller, + videoInit: _videoInit, + title: widget.title, + child: VideoPlayerPan( + child: Container( + alignment: Alignment.center, + width: double.infinity, + height: double.infinity, + color: Colors.black, + child: _isVideoInit(), + ), + ), + ); + } else { + return Center( + child: Text( + '暂无视频信息', + style: TextStyle(color: Colors.white), + ), + ); + } + } + +// 加载url成功时,根据视频比例渲染播放器 + Widget _isVideoInit() { + if (_videoInit) { + return AspectRatio( + aspectRatio: _controller.value.aspectRatio, + child: VideoPlayer(_controller), + ); + } else if (_controller != null && _videoError) { + return Text( + '加载出错', + style: TextStyle(color: Colors.white), + ); + } else { + return SizedBox( + width: 30, + height: 30, + child: CircularProgressIndicator( + strokeWidth: 2, + ), + ); + } + } + + void _urlChange() async { + if (widget.url == null || widget.url == '') return; + if (_controller != null) { + /// 如果控制器存在,清理掉重新创建 + _controller.removeListener(_videoListener); + _controller.dispose(); + } + setState(() { + /// 重置组件参数 + _videoInit = false; + _videoError = false; + }); + if (widget.type == VideoPlayerType.file) { + _controller = VideoPlayerController.file(widget.url); + } else if (widget.type == VideoPlayerType.asset) { + _controller = VideoPlayerController.asset(widget.url); + } else { + _controller = VideoPlayerController.network(widget.url); + } + + /// 加载资源完成时,监听播放进度,并且标记_videoInit=true加载完成 + _controller.addListener(_videoListener); + await _controller.initialize(); + setState(() { + _videoInit = true; + _videoError = false; + _controller.play(); + }); + } + + void _videoListener() async { + if (_controller.value.hasError) { + setState(() { + _videoError = true; + }); + } else { + Duration? res = await _controller.position; + if (res! >= _controller.value.duration) { + await _controller.seekTo(Duration(seconds: 0)); + await _controller.pause(); + } + if (_controller.value.isPlaying && _key.currentState != null) { + /// 减少build次数 + _key.currentState!.setPosition( + position: res, + totalDuration: _controller.value.duration, + ); + } + } + } +} diff --git a/star_lock/lib/main/lockDetail/videoLog/common/video/video_player_control.dart b/star_lock/lib/main/lockDetail/videoLog/common/video/video_player_control.dart new file mode 100644 index 00000000..94cb335b --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/common/video/video_player_control.dart @@ -0,0 +1,273 @@ +import 'dart:async'; + +import 'package:auto_orientation/auto_orientation.dart'; +import 'package:common_utils/common_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:video_player/video_player.dart'; + +import 'controller_widget.dart'; +import 'video_player_slider.dart'; + +class VideoPlayerControl extends StatefulWidget { + VideoPlayerControl({ + Key? key, + }) : super(key: key); + + @override + VideoPlayerControlState createState() => VideoPlayerControlState(); +} + +class VideoPlayerControlState extends State { + VideoPlayerController get controller => ControllerWidget.of(context)!.controller; + bool get videoInit => ControllerWidget.of(context)!.videoInit; + String get title=>ControllerWidget.of(context)!.title; + // 记录video播放进度 + Duration _position = Duration(seconds: 0); + Duration _totalDuration = Duration(seconds: 0); + late Timer _timer; // 计时器,用于延迟隐藏控件ui + bool _hidePlayControl = true; // 控制是否隐藏控件ui + double _playControlOpacity = 0; // 通过透明度动画显示/隐藏控件ui + /// 记录是否全屏 + bool get _isFullScreen => + MediaQuery.of(context).orientation == Orientation.landscape; + + @override + void dispose() { + super.dispose(); + if (_timer != null) { + _timer.cancel(); + } + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onDoubleTap: _playOrPause, + onTap: _togglePlayControl, + child: Container( + width: double.infinity, + height: double.infinity, + color: Colors.transparent, + child: WillPopScope( + child: Offstage( + offstage: _hidePlayControl, + child: AnimatedOpacity( + // 加入透明度动画 + opacity: _playControlOpacity, + duration: Duration(milliseconds: 300), + child: Column( + children: [_top(), _middle(), _bottom(context)], + ), + ), + ), + onWillPop: _onWillPop, + ), + ), + ); + } + + // 拦截返回键 + Future _onWillPop() async { + if (_isFullScreen) { + _toggleFullScreen(); + return false; + } + return true; + } + + // 供父组件调用刷新页面,减少父组件的build + void setPosition({position, totalDuration}) { + setState(() { + _position = position; + _totalDuration = totalDuration; + }); + } + + Widget _bottom(BuildContext context) { + return Container( + // 底部控件的容器 + width: double.infinity, + height: 40, + decoration: BoxDecoration( + gradient: LinearGradient( + // 来点黑色到透明的渐变优雅一下 + begin: Alignment.bottomCenter, + end: Alignment.topCenter, + colors: [Color.fromRGBO(0, 0, 0, .7), Color.fromRGBO(0, 0, 0, .1)], + ), + ), + child: Row( + // 加载完成时才渲染,flex布局 + children: [ + IconButton( + // 播放按钮 + padding: EdgeInsets.zero, + iconSize: 26, + icon: Icon( + // 根据控制器动态变化播放图标还是暂停 + controller.value.isPlaying ? Icons.pause : Icons.play_arrow, + color: Colors.white, + ), + onPressed: _playOrPause, + ), + Expanded( + // 相当于前端的flex: 1 + child: VideoPlayerSlider( + startPlayControlTimer: _startPlayControlTimer, + timer: _timer, + ), + ), + Container( + // 播放时间 + margin: EdgeInsets.only(left: 10), + child: Text( + '${DateUtil.formatDateMs( + _position!.inMilliseconds, + format: 'mm:ss', + )}/${DateUtil.formatDateMs( + _totalDuration!.inMilliseconds, + format: 'mm:ss', + )}', + style: TextStyle(color: Colors.white), + ), + ), + IconButton( + // 全屏/横屏按钮 + padding: EdgeInsets.zero, + iconSize: 26, + icon: Icon( + // 根据当前屏幕方向切换图标 + _isFullScreen ? Icons.fullscreen_exit : Icons.fullscreen, + color: Colors.white, + ), + onPressed: () { + // 点击切换是否全屏 + _toggleFullScreen(); + }, + ), + ], + ), + ); + } + + Widget _middle() { + return Expanded( + child: Container(), + ); + } + + Widget _top() { + return Container( + width: double.infinity, + height: 40, + decoration: BoxDecoration( + gradient: LinearGradient( + // 来点黑色到透明的渐变优雅一下 + begin: Alignment.bottomCenter, + end: Alignment.topCenter, + colors: [Color.fromRGBO(0, 0, 0, .7), Color.fromRGBO(0, 0, 0, .1)], + ), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + //在最上层或者不是横屏则隐藏按钮 + ModalRoute.of(context)!.isFirst && !_isFullScreen + ? Container() + : IconButton( + icon: Icon( + Icons.arrow_back, + color: Colors.white, + ), + onPressed: backPress), + Text( + title, + style: TextStyle(color: Colors.white), + ), + //在最上层或者不是横屏则隐藏按钮 + ModalRoute.of(context)!.isFirst && !_isFullScreen + ? Container() + : IconButton( + icon: Icon( + Icons.arrow_back, + color: Colors.transparent, + ), + onPressed: () {}, + ), + ], + ), + ); + } + + void backPress() { + print(_isFullScreen); + // 如果是全屏,点击返回键则关闭全屏,如果不是,则系统返回键 + if (_isFullScreen) { + _toggleFullScreen(); + } else if(ModalRoute.of(context)!.isFirst) { + SystemNavigator.pop(); + }else{ + Navigator.pop(context); + } + } + + void _playOrPause() { + /// 同样的,点击动态播放或者暂停 + if (videoInit) { + controller.value.isPlaying ? controller.pause() : controller.play(); + _startPlayControlTimer(); // 操作控件后,重置延迟隐藏控件的timer + } + } + + void _togglePlayControl() { + setState(() { + if (_hidePlayControl) { + /// 如果隐藏则显示 + _hidePlayControl = false; + _playControlOpacity = 1; + _startPlayControlTimer(); // 开始计时器,计时后隐藏 + } else { + /// 如果显示就隐藏 + if (_timer != null) _timer.cancel(); // 有计时器先移除计时器 + _playControlOpacity = 0; + Future.delayed(Duration(milliseconds: 500)).whenComplete(() { + _hidePlayControl = true; // 延迟500ms(透明度动画结束)后,隐藏 + }); + } + }); + } + + void _startPlayControlTimer() { + /// 计时器,用法和前端js的大同小异 + if (_timer != null) _timer.cancel(); + _timer = Timer(Duration(seconds: 3), () { + /// 延迟3s后隐藏 + setState(() { + _playControlOpacity = 0; + Future.delayed(Duration(milliseconds: 500)).whenComplete(() { + _hidePlayControl = true; + }); + }); + }); + } + + void _toggleFullScreen() { + setState(() { + if (_isFullScreen) { + /// 如果是全屏就切换竖屏 + AutoOrientation.portraitAutoMode(); + + ///显示状态栏,与底部虚拟操作按钮 + SystemChrome.setEnabledSystemUIMode( + SystemUiMode.manual, overlays: [SystemUiOverlay.top, SystemUiOverlay.bottom]); + } else { + AutoOrientation.landscapeAutoMode(); + + ///关闭状态栏,与底部虚拟操作按钮 + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []); + } + _startPlayControlTimer(); // 操作完控件开始计时隐藏 + }); + } +} diff --git a/star_lock/lib/main/lockDetail/videoLog/common/video/video_player_pan.dart b/star_lock/lib/main/lockDetail/videoLog/common/video/video_player_pan.dart new file mode 100644 index 00000000..bbbb43c1 --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/common/video/video_player_pan.dart @@ -0,0 +1,246 @@ +import 'package:common_utils/common_utils.dart'; +import 'package:flutter/material.dart'; + +//import 'package:screen/screen.dart'; +import 'package:video_player/video_player.dart'; + +import '../after_layout.dart'; +import 'controller_widget.dart'; +import 'video_player_control.dart'; + +class VideoPlayerPan extends StatefulWidget { + VideoPlayerPan({ +// this.controlKey, + required this.child, + }); + +// final GlobalKey controlKey; + final Widget child; + + @override + _VideoPlayerPanState createState() => _VideoPlayerPanState(); +} + +class _VideoPlayerPanState extends State + with AfterLayoutMixin { + late Offset startPosition; // 起始位置 + late double movePan; // 偏移量累计总和 + late double layoutWidth; // 组件宽度 + late double layoutHeight; // 组件高度 + String volumePercentage = ''; // 组件位移描述 + double playDialogOpacity = 0.0; + bool allowHorizontal = false; // 是否允许快进 + Duration position = Duration(seconds: 0); // 当前时间 + double brightness = 0.0; //亮度 + bool brightnessOk = false; // 是否允许调节亮度 + + VideoPlayerController get controller => ControllerWidget.of(context)!.controller; + bool get videoInit => ControllerWidget.of(context)!.videoInit; + String get title=>ControllerWidget.of(context)!.title; + + @override + void afterFirstLayout(BuildContext context) { + _reset(context); + } + + @override + void dispose() { + super.dispose(); + brightnessOk = false; + allowHorizontal = false; + } + + @override + Widget build(BuildContext context) { + return GestureDetector( + onVerticalDragStart: _onVerticalDragStart, + onVerticalDragUpdate: _onVerticalDragUpdate, + onVerticalDragEnd: _onVerticalDragEnd, + onHorizontalDragStart: _onHorizontalDragStart, + onHorizontalDragUpdate: _onHorizontalDragUpdate, + onHorizontalDragEnd: _onHorizontalDragEnd, + child: Container( + child: Stack( + children: [ + widget.child, + Center( + child: AnimatedOpacity( + opacity: playDialogOpacity, + duration: Duration(milliseconds: 500), + child: Container( + padding: EdgeInsets.symmetric(vertical: 5.0, horizontal: 6.0), + decoration: BoxDecoration( + color: Colors.black87, + borderRadius: BorderRadius.all(Radius.circular(5.0))), + child: Text( + volumePercentage, + style: TextStyle(color: Colors.white, fontSize: 12), + ), + ), + ), + ), + VideoPlayerControl( + key: ControllerWidget.of(context)!.controlKey, + ) + ], + ), + ), + ); + } + + void _onVerticalDragStart(details) async { + _reset(context); + startPosition = details.globalPosition; + if (startPosition.dx < (layoutWidth / 2)) { + /// 左边触摸 + // brightness = await Screen.brightness; + brightnessOk = true; + } + } + + void _onVerticalDragUpdate(details) { + if (!videoInit) { + return; + } + + /// 累计计算偏移量(下滑减少百分比,上滑增加百分比) + movePan += (-details.delta.dy); + if (startPosition.dx < (layoutWidth / 2)) { + /// 左边触摸 + if (brightnessOk = true) { + setState(() { + volumePercentage = '亮度:${(_setBrightnessValue() * 100).toInt()}%'; + playDialogOpacity = 1.0; + }); + } + } else { + /// 右边触摸 + setState(() { + volumePercentage = '音量:${(_setVerticalValue(num: 2) * 100).toInt()}%'; + playDialogOpacity = 1.0; + }); + } + } + + void _onVerticalDragEnd(_) async { + if (!videoInit) { + return; + } + if (startPosition.dx < (layoutWidth / 2)) { + if (brightnessOk) { + // await Screen.setBrightness(_setBrightnessValue()); + brightnessOk = false; + // 左边触摸 + setState(() { + playDialogOpacity = 0.0; + }); + } + } else { + // 右边触摸 + await controller.setVolume(_setVerticalValue()); + setState(() { + playDialogOpacity = 0.0; + }); + } + } + + double _setBrightnessValue() { + // 亮度百分控制 + double value = + double.parse((movePan / layoutHeight + brightness).toStringAsFixed(2)); + if (value >= 1.00) { + value = 1.00; + } else if (value <= 0.00) { + value = 0.00; + } + return value; + } + + double _setVerticalValue({int num = 1}) { + // 声音亮度百分控制 + double value = double.parse( + (movePan / layoutHeight + controller.value.volume) + .toStringAsFixed(num)); + if (value >= 1.0) { + value = 1.0; + } else if (value <= 0.0) { + value = 0.0; + } + return value; + } + + void _reset(BuildContext context) { + startPosition = Offset(0, 0); + movePan = 0; + layoutHeight = context.size!.height; + layoutWidth = context.size!.width; + volumePercentage = ''; + } + + void _onHorizontalDragStart(DragStartDetails details) async { + _reset(context); + if (!videoInit) { + return; + } + // 获取当前时间 + position = controller.value.position; + // 暂停成功后才允许快进手势 + allowHorizontal = true; + } + + void _onHorizontalDragUpdate(DragUpdateDetails details) { + if (!videoInit && !allowHorizontal) { + return; + } + // 累计计算偏移量 + movePan += details.delta.dx; + double value = _setHorizontalValue(); + // 用百分比计算出当前的秒数 + String currentSecond = DateUtil.formatDateMs( + (value * controller.value.duration.inMilliseconds).toInt(), + format: 'mm:ss', + ); + if (value >= 0) { + setState(() { + volumePercentage = '快进至:$currentSecond'; + playDialogOpacity = 1.0; + }); + } else { + setState(() { + volumePercentage = '快退至:${(value * 100).toInt()}%'; + playDialogOpacity = 1.0; + }); + } + } + + void _onHorizontalDragEnd(DragEndDetails details) async { + if (!videoInit && !allowHorizontal) { + return; + } + double value = _setHorizontalValue(); + int current = + (value * controller.value.duration.inMilliseconds).toInt(); + await controller.seekTo(Duration(milliseconds: current)); + allowHorizontal = false; + setState(() { + playDialogOpacity = 0.0; + }); + } + + double _setHorizontalValue() { + // 进度条百分控制 + double valueHorizontal = + double.parse((movePan / layoutWidth).toStringAsFixed(2)); + // 当前进度条百分比 + double currentValue = position.inMilliseconds / + controller.value.duration.inMilliseconds; + double value = + double.parse((currentValue + valueHorizontal).toStringAsFixed(2)); + if (value >= 1.00) { + value = 1.00; + } else if (value <= 0.00) { + value = 0.00; + } + return value; + } +} diff --git a/star_lock/lib/main/lockDetail/videoLog/common/video/video_player_slider.dart b/star_lock/lib/main/lockDetail/videoLog/common/video/video_player_slider.dart new file mode 100644 index 00000000..190abe6b --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/common/video/video_player_slider.dart @@ -0,0 +1,131 @@ +import 'dart:async'; + +import 'package:common_utils/common_utils.dart'; +import 'package:flutter/material.dart'; +import 'package:video_player/video_player.dart'; + +import 'controller_widget.dart'; + +class VideoPlayerSlider extends StatefulWidget { + final Function startPlayControlTimer; + final Timer timer; + + VideoPlayerSlider({required this.startPlayControlTimer, required this.timer}); + + @override + _VideoPlayerSliderState createState() => _VideoPlayerSliderState(); +} + +class _VideoPlayerSliderState extends State { + VideoPlayerController get controller => + ControllerWidget.of(context)!.controller; + + bool get videoInit => ControllerWidget.of(context)!.videoInit; + late double progressValue; //进度 + late String labelProgress; //tip内容 + bool handle = false; //判断是否在滑动的标识 + + @override + void initState() { + super.initState(); + progressValue = 0.0; + labelProgress = '00:00'; + } + + @override + void didUpdateWidget(VideoPlayerSlider oldWidget) { + super.didUpdateWidget(oldWidget); + if (!handle && videoInit) { + int position = controller.value.position.inMilliseconds; + int duration = controller.value.duration.inMilliseconds; + if(position>=duration){ + position=duration; + } + setState(() { + progressValue = position / duration * 100; + labelProgress = DateUtil.formatDateMs( + progressValue.toInt(), + format: 'mm:ss', + ); + }); + } + } + + @override + Widget build(BuildContext context) { + return SliderTheme( + //自定义风格 + data: SliderTheme.of(context).copyWith( + //进度条滑块左边颜色 + inactiveTrackColor: Colors.white, + overlayShape: RoundSliderOverlayShape( + //可继承SliderComponentShape自定义形状 + overlayRadius: 10, //滑块外圈大小 + ), + thumbShape: RoundSliderThumbShape( + //可继承SliderComponentShape自定义形状 + disabledThumbRadius: 7, //禁用是滑块大小 + enabledThumbRadius: 7, //滑块大小 + ), + ), + child: Slider( + value: progressValue, + label: labelProgress, + divisions: 100, + onChangeStart: _onChangeStart, + onChangeEnd: _onChangeEnd, + onChanged: _onChanged, + min: 0, + max: 100, + ), + ); + } + + void _onChangeEnd(_) { + if (!videoInit) { + return; + } + widget.startPlayControlTimer(); + // 关闭手动操作标识 + handle = false; + // 跳转到滑动时间 + int duration = controller.value.duration.inMilliseconds; + controller.seekTo( + Duration(milliseconds: (progressValue / 100 * duration).toInt()), + ); +// if (!controller.value.isPlaying) { +// controller.play(); +// } + } + + void _onChangeStart(_) { + if (!videoInit) { + return; + } + if (widget.timer != null) { + widget.timer.cancel(); + } + // 开始手动操作标识 + handle = true; +// if (controller.value.isPlaying) { +// controller.pause(); +// } + } + + void _onChanged(double value) { + if (!videoInit) { + return; + } + if (widget.timer != null) { + widget.timer.cancel(); + } + int duration = controller.value.duration.inMilliseconds; + setState(() { + progressValue = value; + labelProgress = DateUtil.formatDateMs( + (value / 100 * duration).toInt(), + format: 'mm:ss', + ); + }); + } +} diff --git a/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_logic.dart b/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_logic.dart new file mode 100644 index 00000000..8d45d5c7 --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_logic.dart @@ -0,0 +1,8 @@ + +import 'package:star_lock/tools/baseGetXController.dart'; +import 'editVideoLog_state.dart'; + +class EditVideoLogLogic extends BaseGetXController{ + EditVideoLogState state = EditVideoLogState(); + +} \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_page.dart b/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_page.dart new file mode 100644 index 00000000..3fb69069 --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_page.dart @@ -0,0 +1,162 @@ + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/titleAppBar.dart'; +import 'editVideoLog_logic.dart'; + +class EditVideoLogPage extends StatefulWidget { + const EditVideoLogPage({Key? key}) : super(key: key); + + @override + State createState() => _EditVideoLogPageState(); +} + +class _EditVideoLogPageState extends State { + final logic = Get.put(EditVideoLogLogic()); + final state = Get.find().state; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + barTitle: "已选${state.seletVideoLog.value}项", + haveBack: true, + backgroundColor: AppColors.mainColor, + actionsList: [ + TextButton( + child: Text( + "全选", + style: TextStyle(color: Colors.white, fontSize: 24.sp), + ), + onPressed: () async { + state.isSeletAll.value = !state.isSeletAll.value; + }, + ), + ], + ), + body: Column( + children: [ + Expanded( + child: ListView.builder( + itemCount: 5, + 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) + ],); + }), + ), + bottomBottomBtnWidget() + ], + ), + ); + } + + 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( + //横轴元素个数 + crossAxisCount: 3, + //纵轴间距 + mainAxisSpacing: 10.w, + // 横轴间距 + crossAxisSpacing: 15.w, + //子组件宽高长度比例 + childAspectRatio: itemW/itemH + ), + itemBuilder: (context, index) { + return Obx(() => videoItem()); + }, + ), + ); + } + + Widget videoItem(){ + return SizedBox( + width: itemW, + height: itemH, + child: Stack( + 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")), + ), + SizedBox(height:5.h), + Text("2023.10.23 10:00", style: TextStyle(fontSize: 20.sp)) + ], + ), + Visibility( + visible: true, + child: Positioned( + top: 0.w, + right: 0.w, + child: GestureDetector( + onTap: (){ + + }, + child: Image(width: 40.w, height: 40.w, image: state.isSeletAll.value ? const AssetImage("images/icon_round_selet.png") : const AssetImage("images/icon_round_unSelet.png")) + ) + ), + ) + ], + ), + ); + } + + 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,(){ + + }) + ]), + ); + } + + Widget bottomBtnItemWidget(String iconUrl, String name, Color backgroundColor, Function() onClick) { + var wh = 40.w; + return GestureDetector( + onTap: onClick, + child: Container( + height: 140.h, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + 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)) + ], + )), + ); + } + +} diff --git a/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_state.dart b/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_state.dart new file mode 100644 index 00000000..a5f8f4f5 --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/editVideoLog/editVideoLog_state.dart @@ -0,0 +1,10 @@ + + +import 'package:get/get.dart'; + +class EditVideoLogState{ + + var seletVideoLog = 0.obs; + var isSeletAll = false.obs; + +} \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_logic.dart b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_logic.dart new file mode 100644 index 00000000..c4ce560c --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_logic.dart @@ -0,0 +1,8 @@ + +import 'package:star_lock/tools/baseGetXController.dart'; +import 'videoLog_state.dart'; + +class VideoLogLogic extends BaseGetXController{ + VideoLogState state = VideoLogState(); + +} \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart new file mode 100644 index 00000000..73ee4ad7 --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart @@ -0,0 +1,262 @@ + +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/tools/noData.dart'; + +import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/titleAppBar.dart'; +import 'videoLog_logic.dart'; + +class VideoLogPage extends StatefulWidget { + const VideoLogPage({Key? key}) : super(key: key); + + @override + State createState() => _VideoLogPageState(); +} + +class _VideoLogPageState extends State { + final logic = Get.put(VideoLogLogic()); + final state = Get.find().state; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + haveTitleWidget: true, + titleWidget: navBtn(), + haveBack: true, + backgroundColor: AppColors.mainColor, + ), + body: Column( + children: [ + // 云存顶部 + Visibility( + visible: !state.isNavLocal.value, + child: vipTip() + ), + // 本地顶部 + Visibility( + visible: state.isNavLocal.value, + child: localTip() + ), + // title加编辑按钮 + editVideoTip(), + Visibility( + visible: !state.isNavLocal.value, + child: Expanded( + child: ListView.builder( + itemCount: 5, + 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.2$index", style: TextStyle(fontSize: 20.sp)), + ] + )), + mainListView(index) + ],); + }) + ) + ), + // 本地顶部 + Visibility( + visible: state.isNavLocal.value, + child: Expanded( + child: state.localList.isNotEmpty ? ListView.builder( + itemCount: 5, + 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.2$index", style: TextStyle(fontSize: 20.sp)), + ] + )), + mainListView(index) + ],); + }): const NoData() + ) + ), + ], + ), + ); + } + + // nav按钮 + Widget navBtn(){ + return SizedBox( + width: 300.w, + // color: Colors.white, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + TextButton( + onPressed: (){ + setState(() { + state.isNavLocal.value = false; + }); + }, + child: Obx(() => Text("云存", style: state.isNavLocal.value == true ? TextStyle(color: Colors.grey, fontSize: 26.sp) : TextStyle(color: Colors.white, fontSize: 28.sp))) + ), + TextButton( + onPressed: (){ + setState(() { + state.isNavLocal.value = true; + }); + }, + child: Obx(() => Text("本地", style: state.isNavLocal.value == true ? TextStyle(color: Colors.white, fontSize: 28.sp) : TextStyle(color: Colors.grey, fontSize: 26.sp))) + ), + ], + ), + ); + } + + // 云存顶部视频 + Widget vipTip(){ + return GestureDetector( + onTap: (){ + Get.toNamed(Routers.valueAddedServicesHighFunctionPage); + }, + child: Container( + height: 150.h, + margin: EdgeInsets.all(15.w), + padding: EdgeInsets.only(left:20.w, top:20.w, bottom:20.w, right: 10.w), + decoration: BoxDecoration( + color: const Color(0xFFF6F7F8), + borderRadius: BorderRadius.circular(20.h) + ), + child: Row( + children: [ + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text("3天滚动储存", style: TextStyle(fontSize: 26.sp)), + SizedBox(height: 10.h), + Text("星锁已为本设备免费提供3大滚动视频储存服务", style: TextStyle(fontSize: 22.sp, color: Colors.grey)), + ], + )), + SizedBox(width: 15.w), + Text("去升级", style: TextStyle(fontSize: 24.sp)), + Image(width: 40.w, height: 24.w, image: const AssetImage("images/icon_right_black.png")) + ], + ), + ), + ); + } + + // 本地顶部 + Widget localTip(){ + return GestureDetector( + onTap: (){ + Get.toNamed(Routers.videoLogDownLoadPage); + }, + child: Container( + // height: 130.h, + margin: EdgeInsets.all(15.w), + padding: EdgeInsets.only(left:20.w, top:30.w, bottom:30.w, right: 10.w), + decoration: BoxDecoration( + color: const Color(0xFFF6F7F8), + borderRadius: BorderRadius.circular(20.h) + ), + child: Row( + children: [ + Expanded(child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // SizedBox(height: 20.h), + Text("下载列表", style: TextStyle(fontSize: 26.sp)), + SizedBox(height: 15.h), + Text("暂无下载内容", style: TextStyle(fontSize: 22.sp, color: Colors.grey)), + ], + )), + SizedBox(width: 15.w), + // Text("去升级", style: TextStyle(fontSize: 24.sp)), + Image(width: 40.w, height: 24.w, image: const AssetImage("images/icon_right_black.png")) + ], + ), + ), + ); + } + + // 标题加编辑按钮 + Widget editVideoTip(){ + return Container( + margin: EdgeInsets.only(left:20.w), + child: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(state.isNavLocal.value == true ? "已下载":"全部视频", style: TextStyle(fontSize: 28.sp)), + Expanded(child: SizedBox(width: 10.w)), + IconButton( + icon: Image(width: 40.w, height: 40.w, image: const AssetImage("images/main/icon_lockDetail_monitoringEditVoice.png")), + iconSize: 30, + color: Colors.black54, onPressed: () { + Get.toNamed(Routers.editVideoLogPage); + }, + ) + // TextButton( + // onPressed: (){ + // + // }, + // child: Image(width: 40.w, height: 40.w, image: const AssetImage("images/main/icon_lockDetail_monitoringEditVoice.png"),) + // ), + ], + ), + ); + } + + var itemW = (1.sw - 15.w*4)/3; + var itemH = (1.sw - 15.w*4)/3+40.h; + + // 云存列表 + Widget mainListView(int index){ + return GridView.builder( + padding: EdgeInsets.only(left: 15.w, right: 15.w), + itemCount: index+1, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + //横轴元素个数 + crossAxisCount: 3, + //纵轴间距 + mainAxisSpacing: 15.w, + // 横轴间距 + crossAxisSpacing: 15.w, + //子组件宽高长度比例 + childAspectRatio: itemW/itemH + ), + itemBuilder: (context, index) { + return videoItem((){ + Get.toNamed(Routers.videoLogDetailPage); + }); + }, + ); + } + + Widget videoItem(Function() action){ + return GestureDetector( + onTap: action, + 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")), + ), + SizedBox(height:5.h), + Text("2023.10.23 10:00", style: TextStyle(fontSize: 20.sp)) + ], + ), + ), + ); + } + +} diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_state.dart b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_state.dart new file mode 100644 index 00000000..a2c060ed --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_state.dart @@ -0,0 +1,8 @@ + +import 'package:get/get.dart'; + +class VideoLogState{ + + var isNavLocal = false.obs; + var localList = []; +} \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/controlsOverlay_page.dart b/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/controlsOverlay_page.dart new file mode 100644 index 00000000..f6a7d75d --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/controlsOverlay_page.dart @@ -0,0 +1,264 @@ + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:video_player/video_player.dart'; + +class ControlsOverlay extends StatelessWidget { + const ControlsOverlay({required this.controller}); + + static const List _exampleCaptionOffsets = [ + Duration(seconds: -10), + Duration(seconds: -3), + Duration(seconds: -1, milliseconds: -500), + Duration(milliseconds: -250), + Duration.zero, + Duration(milliseconds: 250), + Duration(seconds: 1, milliseconds: 500), + Duration(seconds: 3), + Duration(seconds: 10), + ]; + static const List _examplePlaybackRates = [ + 0.25, + 0.5, + 1.0, + 1.5, + 2.0, + 3.0, + 5.0, + 10.0, + ]; + + final VideoPlayerController controller; + + @override + Widget build(BuildContext context) { + return Stack( + children: [ + AnimatedSwitcher( + duration: const Duration(milliseconds: 50), + reverseDuration: const Duration(milliseconds: 200), + 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', + ), + ), + ), + ), + GestureDetector( + onTap: () { + controller.value.isPlaying ? controller.pause() : controller.play(); + }, + ), + + // Align( + // alignment: Alignment.topLeft, + // child: PopupMenuButton( + // initialValue: controller.value.captionOffset, + // tooltip: 'Caption Offset', + // onSelected: (Duration delay) { + // controller.setCaptionOffset(delay); + // }, + // itemBuilder: (BuildContext context) { + // return >[ + // for (final Duration offsetDuration in _exampleCaptionOffsets) + // PopupMenuItem( + // value: offsetDuration, + // child: Text('${offsetDuration.inMilliseconds}ms'), + // ) + // ]; + // }, + // child: Padding( + // padding: const EdgeInsets.symmetric( + // // Using less vertical padding as the text is also longer + // // horizontally, so it feels like it would need more spacing + // // horizontally (matching the aspect ratio of the video). + // vertical: 12, + // horizontal: 16, + // ), + // child: Text('${controller.value.captionOffset.inMilliseconds}ms'), + // ), + // ), + // ), + // Align( + // alignment: Alignment.topRight, + // child: PopupMenuButton( + // initialValue: controller.value.playbackSpeed, + // tooltip: 'Playback speed', + // onSelected: (double speed) { + // controller.setPlaybackSpeed(speed); + // }, + // itemBuilder: (BuildContext context) { + // return >[ + // for (final double speed in _examplePlaybackRates) + // PopupMenuItem( + // value: speed, + // child: Text('${speed}x'), + // ) + // ]; + // }, + // child: Padding( + // padding: const EdgeInsets.symmetric( + // // Using less vertical padding as the text is also longer + // // horizontally, so it feels like it would need more spacing + // // horizontally (matching the aspect ratio of the video). + // vertical: 12, + // horizontal: 16, + // ), + // child: Text('${controller.value.playbackSpeed}x'), + // ), + // ), + // ), + + Positioned( + top: 0.h, + left: 0.h, + right: 0.h, + child: Container( + 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)), + 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")), + ), + 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")), + ), + 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")), + ), + ], + ), + ), + ), + + Positioned( + bottom: 0, + left: 0, + right: 0, + child: Container( + padding: EdgeInsets.only(right: 10.w, left: 10.w), + color: const Color.fromRGBO(0, 0, 0, 0.5), + height: 60.h, + child: Row( + 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)), + onTap: () { + // if(controller.value.isBuffering == false){ + // return; + // } + controller.value.isPlaying ? controller.pause() : controller.play(); + }, + ), + //当前播放进度 + 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(), + onChanged: (newRating) { + controller + .seekTo(Duration( + milliseconds: + newRating + .truncate())); + }, + ), + ), + //总视频进度 + Text(formatString(controller.value.duration), style: TextStyle(fontSize: 22.sp, color: const Color(0xffefefef)),), + //倍速下拉菜单 + // DropdownButtonHideUnderline( + // child: DropdownButton2( + // hint: Text( + // _selectedValue, + // style: TextStyle( + // fontSize: 18, + // color: + // Color(0xffefefef), + // ), + // ), + // items: items + // .map((item) => + // DropdownMenuItem< + // String>( + // value: item, + // child: Text( + // '${item}x', + // style: + // const TextStyle( + // fontSize: + // 16, + // ), + // ), + // )) + // .toList(), + // // value: _selectedValue, + // // icon: Visibility( + // // visible: false, + // // child: Icon(Icons + // // .arrow_downward)), + // onChanged: (value) async { + // double val = + // double.parse(value + // as String); + // _videoPlayerController + // .setPlaybackSpeed(val); + // setState(() { + // if (val == 1.0) { + // _selectedValue = + // '倍速'; + // } else { + // _selectedValue = + // '${value as String}x'; + // } + // }); + // }, + // // dropdownWidth: 100, + // // buttonWidth: 60, + // // iconSize: 36, + // // iconEnabledColor:Colors.white, + // // buttonPadding:const EdgeInsets.only(left: 10), + // ), + // ), + ], + ), + ), + ) + ], + ); + } + + String formatString(time) { + 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_logic.dart b/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_logic.dart new file mode 100644 index 00000000..42374bb1 --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_logic.dart @@ -0,0 +1,10 @@ + +import 'package:star_lock/tools/baseGetXController.dart'; + +import 'videoLogDetail_state.dart'; + +class VideoLogDetailLogic extends BaseGetXController{ + VideoLogDetailState state = VideoLogDetailState(); + + +} \ 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 new file mode 100644 index 00000000..8ddc5a56 --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_page.dart @@ -0,0 +1,191 @@ + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.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'; + +class VideoLogDetailPage extends StatefulWidget { + const VideoLogDetailPage({Key? key}) : super(key: key); + + @override + State createState() => _VideoLogDetailPageState(); +} + +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), + ); + + _controller.addListener(() { + setState(() { + print("controller.value.isBuffering:${_controller.value.isBuffering}"); + }); + }); + + _controller.setLooping(false); + // _controller.setVolume(1); + _controller.initialize(); + + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + barTitle: "本地视频播放", + haveBack: true, + backgroundColor: AppColors.mainColor, + ), + body: Column( + children: [ + AspectRatio( + aspectRatio: 16/9, + 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), + ], + ), + ), + Container( + 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)), + ], + ), + SizedBox(height: 15.h), + Row( + children: [ + videoItem(true), + ], + ), + ], + )), + 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() + ],); + }), + ), + ], + ), + ); + } + + + var itemW = (1.sw - 15.w*4)/3; + var itemH = (1.sw - 15.w*4)/3+40.h; + Widget mainListView(){ + return GridView.builder( + padding: EdgeInsets.only(left: 15.w, right: 15.w), + itemCount: 4, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + //横轴元素个数 + crossAxisCount: 3, + //纵轴间距 + mainAxisSpacing: 10.w, + // 横轴间距 + crossAxisSpacing: 15.w, + //子组件宽高长度比例 + childAspectRatio: itemW/itemH + ), + itemBuilder: (context, index) { + return videoItem(false); + }, + ); + } + + Widget videoItem(bool isPlay){ + return SizedBox( + width: itemW, + height: itemH, + child: Stack( + children: [ + Column( + 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))), + ) + ), + ) + ] + ), + ), + SizedBox(height:5.h), + Text("2023.10.23 10:00", style: TextStyle(fontSize: 20.sp)) + ], + ), + ], + ), + ); + } + + @override + void dispose() { + super.dispose(); + _controller.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 new file mode 100644 index 00000000..b4240f09 --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/videoLogDetail/videoLogDetail_state.dart @@ -0,0 +1,5 @@ + + +class VideoLogDetailState{ + +} \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_logic.dart b/star_lock/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_logic.dart new file mode 100644 index 00000000..5d8b977e --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_logic.dart @@ -0,0 +1,9 @@ + +import 'package:star_lock/tools/baseGetXController.dart'; +import 'videoLogDownLoad_state.dart'; + +class VideoLogDownLoadLogic extends BaseGetXController{ + VideoLogDownLoadState state = VideoLogDownLoadState(); + + +} \ No newline at end of file diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_page.dart b/star_lock/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_page.dart new file mode 100644 index 00000000..d5916fc1 --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_page.dart @@ -0,0 +1,103 @@ + + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; + +import '../../../../app_settings/app_colors.dart'; +import '../../../../tools/noData.dart'; +import '../../../../tools/titleAppBar.dart'; +import 'videoLogDownLoad_logic.dart'; + +class VideoLogDownLoadPage extends StatefulWidget { + const VideoLogDownLoadPage({Key? key}) : super(key: key); + + @override + State createState() => _VideoLogDownLoadPageState(); +} + +class _VideoLogDownLoadPageState extends State { + final logic = Get.put(VideoLogDownLoadLogic()); + final state = Get.find().state; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + barTitle: "下载列表", + haveBack: true, + backgroundColor: AppColors.mainColor, + ), + body: Column( + children: [ + Expanded( + child: state.localList.isNotEmpty ? ListView.builder( + itemCount: 5, + 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) + ],); + }): const NoData(), + ), + ], + ), + ); + } + + 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( + //横轴元素个数 + crossAxisCount: 3, + //纵轴间距 + mainAxisSpacing: 10.w, + // 横轴间距 + crossAxisSpacing: 15.w, + //子组件宽高长度比例 + childAspectRatio: itemW/itemH + ), + itemBuilder: (context, index) { + return videoItem(); + }, + ), + ); + } + + Widget videoItem(){ + return SizedBox( + width: itemW, + height: itemH, + child: Stack( + 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")), + ), + SizedBox(height:5.h), + Text("2023.10.23 10:00", style: TextStyle(fontSize: 20.sp)) + ], + ), + ], + ), + ); + } +} diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_state.dart b/star_lock/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_state.dart new file mode 100644 index 00000000..3e60e4d5 --- /dev/null +++ b/star_lock/lib/main/lockDetail/videoLog/videoLogDownLoad/videoLogDownLoad_state.dart @@ -0,0 +1,5 @@ + + +class VideoLogDownLoadState{ + var localList = []; +} \ No newline at end of file diff --git a/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart b/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart index 52747a4a..a43409ab 100644 --- a/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart +++ b/star_lock/lib/main/lockMian/demoMode/demoModeLockDetail/demoModeLockDetail_page.dart @@ -323,6 +323,15 @@ class _DemoModeLockDetailPageState extends State { Get.toNamed(Routers.lockOperatingRecordPage, arguments: {"keyInfo": LockListInfoItemEntity()}); }), + // 视频日志 + bottomItem('images/main/icon_lockDetail_videoLog.png', "视频日志", () { + //视频日志 + Get.toNamed(Routers.videoLogPage); + }), + // 消息提醒 + bottomItem('images/main/icon_lockDetail_messageReminding.png', "消息提醒", () { + Get.toNamed(Routers.msgNotificationPage); + }), // 设置 bottomItem( 'images/main/icon_main_set.png', TranslationLoader.lanKeys!.set!.tr, diff --git a/star_lock/lib/main/lockMian/demoMode/demoModeLockSet/demoModeLockSet_page.dart b/star_lock/lib/main/lockMian/demoMode/demoModeLockSet/demoModeLockSet_page.dart index 90faba47..16700a59 100644 --- a/star_lock/lib/main/lockMian/demoMode/demoModeLockSet/demoModeLockSet_page.dart +++ b/star_lock/lib/main/lockMian/demoMode/demoModeLockSet/demoModeLockSet_page.dart @@ -11,6 +11,7 @@ import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; import '../../../../tools/toast.dart'; import '../../../../translations/trans_lib.dart'; +import '../../../lockDetail/lcokSet/lockSet/lockSetInfo_entity.dart'; class DemoModeLockSetPage extends StatefulWidget { const DemoModeLockSetPage({Key? key}) : super(key: key); @@ -78,6 +79,24 @@ class _DemoModeLockSetPageState extends State { // Get.toNamed(Routers.wirelessKeyboardPage); // Toast.show(msg: "功能暂未开放"); }), + // 照明 + CommonItem( + leftTitel: '照明', + rightTitle: "", + isHaveLine: true, + isHaveDirection: true, + action: () { + gotoAddLock(); + }), + // 开门器 + CommonItem( + leftTitel: '开门器', + rightTitle: "", + isHaveLine: false, + isHaveDirection: true, + action: () { + gotoAddLock(); + }), SizedBox(height: 10.h), // 自动闭锁 CommonItem( @@ -148,54 +167,30 @@ class _DemoModeLockSetPageState extends State { }), SizedBox(height: 10.h), //---田总新增展示 - // Obx(() => CommonItem( leftTitel: '面容开锁', rightTitle: "", isHaveLine: true, - isHaveRightWidget: true, - rightWidget: - SizedBox(width: 60.w, child: _otherUnHaveDoneSwitch())), - // ), - // Obx(() => - CommonItem( - leftTitel: '感应距离', - rightTitle: "", - isHaveLine: true, isHaveDirection: true, action: () { gotoAddLock(); - } - ), - // ), - // Obx(() => + }), CommonItem( - leftTitel: '自动亮屏', + leftTitel: '消息提醒', rightTitle: "", isHaveLine: true, - isHaveRightWidget: true, - rightWidget: - SizedBox(width: 60.w, child: _otherUnHaveDoneSwitch())), - // ), - // Obx(() => + isHaveDirection: true, + action: () { + gotoAddLock(); + }), CommonItem( - leftTitel: '逗留警告', + leftTitel: '猫眼设置', rightTitle: "", isHaveLine: true, - isHaveRightWidget: true, - rightWidget: - SizedBox(width: 60.w, child: _otherUnHaveDoneSwitch())), - // ), - // Obx(() => - CommonItem( - leftTitel: '异常警告', - rightTitle: "", - isHaveLine: true, - isHaveRightWidget: true, - rightWidget: - SizedBox(width: 60.w, child: _otherUnHaveDoneSwitch())), - // ), - // Obx(() => + isHaveDirection: true, + action: () { + gotoAddLock(); + }), CommonItem( leftTitel: '开门方向设置', rightTitle: "", @@ -203,10 +198,7 @@ class _DemoModeLockSetPageState extends State { isHaveLine: true, action: () { gotoAddLock(); - } - ), - // ), - // Obx(() => + }), CommonItem( leftTitel: '电机功率设置', rightTitle: "", @@ -214,11 +206,18 @@ class _DemoModeLockSetPageState extends State { isHaveDirection: true, action: () { gotoAddLock(); - } - ), + }), + // 支持蓝牙广播(关闭则不能使用蓝牙主动开锁) + CommonItem( + leftTitel: '蓝牙广播', + rightTitle: "", + isHaveLine: false, + isHaveRightWidget: true, + rightWidget: _lockRemindSwitch()), // ), SizedBox(height: 10.h), //-----新增至此 + // 标记房态 CommonItem( leftTitel: TranslationLoader.lanKeys!.markedHouseState!.tr, @@ -228,22 +227,23 @@ class _DemoModeLockSetPageState extends State { action: () { gotoAddLock(); }), + // 考勤 CommonItem( leftTitel: TranslationLoader.lanKeys!.checkingIn!.tr, rightTitle: "", isHaveLine: true, isHaveRightWidget: true, - rightWidget: - SizedBox(width: 60.w, child: _openCheckInSwitch()) + rightWidget: _openCheckInSwitch() ), + // 开锁提醒 CommonItem( leftTitel: TranslationLoader.lanKeys!.unlockReminder!.tr, rightTitle: "", isHaveLine: false, isHaveRightWidget: true, - rightWidget: - SizedBox(width: 60.w, child: _lockRemindSwitch())), + rightWidget: _lockRemindSwitch()), SizedBox(height: 10.h), + // wifi配网 CommonItem( leftTitel: TranslationLoader .lanKeys!.wifiDistributionNetwork!.tr, @@ -253,6 +253,7 @@ class _DemoModeLockSetPageState extends State { action: () { gotoAddLock(); }), + // 锁时间 CommonItem( leftTitel: TranslationLoader.lanKeys!.lockTime!.tr, rightTitle: "", @@ -261,6 +262,7 @@ class _DemoModeLockSetPageState extends State { action: () { gotoAddLock(); }), + // 诊断 CommonItem( leftTitel: TranslationLoader.lanKeys!.diagnose!.tr, rightTitle: "", @@ -269,6 +271,7 @@ class _DemoModeLockSetPageState extends State { action: () { gotoAddLock(); }), + // 上传数据 CommonItem( leftTitel: TranslationLoader.lanKeys!.uploadData!.tr, rightTitle: "", @@ -277,15 +280,16 @@ class _DemoModeLockSetPageState extends State { action: () { gotoAddLock(); }), - CommonItem( - leftTitel: - TranslationLoader.lanKeys!.importOtherLockData!.tr, - rightTitle: "", - isHaveLine: true, - isHaveDirection: true, - action: () { - gotoAddLock(); - }), + // CommonItem( + // leftTitel: + // TranslationLoader.lanKeys!.importOtherLockData!.tr, + // rightTitle: "", + // isHaveLine: true, + // isHaveDirection: true, + // action: () { + // gotoAddLock(); + // }), + // 锁升级 CommonItem( leftTitel: TranslationLoader.lanKeys!.lockEscalation!.tr, rightTitle: "", @@ -335,18 +339,6 @@ class _DemoModeLockSetPageState extends State { ); } - CupertinoSwitch _otherUnHaveDoneSwitch() { - return CupertinoSwitch( - activeColor: CupertinoColors.activeBlue, - trackColor: CupertinoColors.systemGrey5, - thumbColor: CupertinoColors.white, - value: false, - onChanged: (value) { - gotoAddLock(); - }, - ); - } - void gotoAddLock(){ // Get.toNamed(Routers.seletLockTypePage); Toast.show(msg: "演示模式"); diff --git a/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart b/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart index 64b1397e..519ce1d9 100644 --- a/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart +++ b/star_lock/lib/mine/addLock/saveLock/saveLock_logic.dart @@ -110,6 +110,7 @@ class SaveLockLogic extends BaseGetXController { // 厂商名称 var vendor = reply.data.sublist(3, 23); + print("vendor:$vendor reply.data:${reply.data}"); var vendorStr = utf8String(vendor); state.lockInfo["vendor"] = vendorStr; // print("vendor:$vendor vendorStr:$vendorStr vendorStr.length${vendorStr.length}"); diff --git a/star_lock/lib/mine/mine/starLockMine_page.dart b/star_lock/lib/mine/mine/starLockMine_page.dart index 8ed2988b..20053c4d 100644 --- a/star_lock/lib/mine/mine/starLockMine_page.dart +++ b/star_lock/lib/mine/mine/starLockMine_page.dart @@ -128,7 +128,7 @@ class _StarLockMinePageState extends State with BaseWidget { // }), mineItem('images/mine/icon_mine_main_addLock.png', TranslationLoader.lanKeys!.addDevice!.tr, () { - Navigator.pushNamed(context, Routers.seletLockTypePage); + Get.toNamed(Routers.seletLockTypePage); }), // mineItem('images/mine/icon_mine_main_gateway.png', // TranslationLoader.lanKeys!.gateway!.tr, () { @@ -136,7 +136,7 @@ class _StarLockMinePageState extends State with BaseWidget { // }), mineItem('images/mine/icon_mine_main_message.png', TranslationLoader.lanKeys!.message!.tr, () { - Navigator.pushNamed(context, Routers.messageListPage); + Get.toNamed(Routers.messageListPage); // Toast.show(msg: "功能暂未开放"); }), //删除“客服”行 @@ -146,15 +146,15 @@ class _StarLockMinePageState extends State with BaseWidget { // }), mineItem('images/mine/icon_mine_main_set.png', TranslationLoader.lanKeys!.set!.tr, () { - Navigator.pushNamed(context, Routers.mineSetPage); + Get.toNamed(Routers.mineSetPage); }), mineItem('images/mine/icon_mine_main_vip.png', TranslationLoader.lanKeys!.valueAddedServices!.tr, () { - Navigator.pushNamed(context, Routers.valueAddedServicesPage); + Get.toNamed(Routers.valueAddedServicesPage); }), mineItem('images/mine/icon_mine_main_about.png', TranslationLoader.lanKeys!.about!.tr, () { - Navigator.pushNamed(context, Routers.abountPage); + Get.toNamed(Routers.abountPage); }), ], ), diff --git a/star_lock/lib/mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_page.dart b/star_lock/lib/mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_page.dart index d9be9057..8c4b4661 100644 --- a/star_lock/lib/mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_page.dart +++ b/star_lock/lib/mine/valueAddedServices/valueAddedServicesList/valueAddedServicesList_page.dart @@ -43,17 +43,14 @@ class _ValueAddedServicesPageListState // arguments: 2); // }), _valueAddedServicesItem( - Image.asset( - 'images/mine/icon_mine_valueAddedServices_realName.png'), + Image.asset('images/mine/icon_mine_valueAddedServices_realName.png'), TranslationLoader.lanKeys!.realNameAuthentication!.tr, () { - Navigator.pushNamed( - context, Routers.valueAddedServicesRealNamePage); + Get.toNamed(Routers.valueAddedServicesRealNamePage); }), _valueAddedServicesItem( Image.asset('images/mine/icon_mine_valueAddedServices_vip.png'), TranslationLoader.lanKeys!.advancedFunction!.tr, () { - Navigator.pushNamed( - context, Routers.valueAddedServicesHighFunctionPage); + Get.toNamed(Routers.valueAddedServicesHighFunctionPage); }), // _valueAddedServicesItem( // Image.asset('images/mine/icon_mine_valueAddedServices_push.png'), diff --git a/star_lock/lib/network/api_provider_base.dart b/star_lock/lib/network/api_provider_base.dart index f39f9f6f..e00ac289 100644 --- a/star_lock/lib/network/api_provider_base.dart +++ b/star_lock/lib/network/api_provider_base.dart @@ -55,6 +55,8 @@ class BaseProvider extends GetConnect with Api { body: rs as T, statusText: res.statusText, ); + }else{ + } // print('得到的数据======>bodyString:${res.bodyString} body:${res.body} bodyBytes:${res.bodyBytes} status:${res.status} statusText:${res.statusText} statusCode:${res.statusCode}'); getDataResult(res.body); diff --git a/star_lock/lib/tools/noData.dart b/star_lock/lib/tools/noData.dart index 062dc3e9..95435546 100644 --- a/star_lock/lib/tools/noData.dart +++ b/star_lock/lib/tools/noData.dart @@ -9,7 +9,8 @@ class NoData extends StatelessWidget { Widget build(BuildContext context) { return SizedBox( width: 1.sw, - height: 1.sh - ScreenUtil().statusBarHeight, + // height: 1.sh - ScreenUtil().statusBarHeight, + height: 1.sw, child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, diff --git a/star_lock/pubspec.yaml b/star_lock/pubspec.yaml index d6ef4834..92daab09 100644 --- a/star_lock/pubspec.yaml +++ b/star_lock/pubspec.yaml @@ -112,7 +112,12 @@ dependencies: cached_network_image: ^3.2.0 webview_flutter: ^4.2.3 aliyun_push: ^0.1.6 - + + #视频播放器 + video_player: ^2.7.2 + #控制横竖屏控件 + auto_orientation: ^2.3.1 + dev_dependencies: flutter_test: sdk: flutter