diff --git a/star_lock/images/icon_lock_manipulation_circle.png b/star_lock/images/icon_lock_manipulation_circle.png new file mode 100644 index 00000000..c07d665f Binary files /dev/null and b/star_lock/images/icon_lock_manipulation_circle.png differ diff --git a/star_lock/images/icon_puzzlepiece_extension.png b/star_lock/images/icon_puzzlepiece_extension.png new file mode 100644 index 00000000..4c825ebf Binary files /dev/null and b/star_lock/images/icon_puzzlepiece_extension.png differ diff --git a/star_lock/images/icon_slider_horizontal.png b/star_lock/images/icon_slider_horizontal.png new file mode 100644 index 00000000..af9e03ae Binary files /dev/null and b/star_lock/images/icon_slider_horizontal.png differ diff --git a/star_lock/images/lan/lan_en.json b/star_lock/images/lan/lan_en.json index 70d709cf..ef301a89 100644 --- a/star_lock/images/lan/lan_en.json +++ b/star_lock/images/lan/lan_en.json @@ -206,7 +206,7 @@ "gateway":"Gateway", "message":"Message", "supportStaff":"Support Staff", - "set":"Set", + "set":"Setting", "moreServices":"More Services", "moreSet":"More Set", @@ -803,5 +803,6 @@ "不同意":"Disagree", "同意":"agree", "已开通":"Have opened", - "该功能是高级功能,请开通后再使用":"This function is an advanced function. Please enable it before using it" + "该功能是高级功能,请开通后再使用":"This function is an advanced function. Please enable it before using it", + "常用程序":"Common Programs" } diff --git a/star_lock/images/lan/lan_keys.json b/star_lock/images/lan/lan_keys.json index 59ed0fd1..dee45a31 100644 --- a/star_lock/images/lan/lan_keys.json +++ b/star_lock/images/lan/lan_keys.json @@ -802,5 +802,6 @@ "不同意":"不同意", "同意":"同意", "已开通":"已开通", - "该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用" + "该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用", + "常用程序":"常用程序" } diff --git a/star_lock/images/lan/lan_zh.json b/star_lock/images/lan/lan_zh.json index 591c3ad3..b1159109 100644 --- a/star_lock/images/lan/lan_zh.json +++ b/star_lock/images/lan/lan_zh.json @@ -805,5 +805,6 @@ "不同意":"不同意", "同意":"同意", "已开通":"已开通", - "该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用" + "该功能是高级功能,请开通后再使用":"该功能是高级功能,请开通后再使用", + "常用程序":"常用程序" } diff --git a/star_lock/images/news_not_read.png b/star_lock/images/news_not_read.png new file mode 100644 index 00000000..be7a8779 Binary files /dev/null and b/star_lock/images/news_not_read.png differ diff --git a/star_lock/images/news_read.png b/star_lock/images/news_read.png new file mode 100644 index 00000000..95dc3cb6 Binary files /dev/null and b/star_lock/images/news_read.png differ diff --git a/star_lock/images/xhj_main_bg.jpg b/star_lock/images/xhj_main_bg.jpg new file mode 100644 index 00000000..db17324c Binary files /dev/null and b/star_lock/images/xhj_main_bg.jpg differ diff --git a/star_lock/ios/Podfile.lock b/star_lock/ios/Podfile.lock index 1d1c9856..c1b43709 100644 --- a/star_lock/ios/Podfile.lock +++ b/star_lock/ios/Podfile.lock @@ -41,14 +41,14 @@ PODS: - ReachabilitySwift - device_info_plus (0.0.1): - Flutter - - DKImagePickerController/Core (4.3.8): + - DKImagePickerController/Core (4.3.7): - DKImagePickerController/ImageDataManager - DKImagePickerController/Resource - - DKImagePickerController/ImageDataManager (4.3.8) - - DKImagePickerController/PhotoGallery (4.3.8): + - DKImagePickerController/ImageDataManager (4.3.7) + - DKImagePickerController/PhotoGallery (4.3.7): - DKImagePickerController/Core - DKPhotoGallery - - DKImagePickerController/Resource (4.3.8) + - DKImagePickerController/Resource (4.3.7) - DKPhotoGallery (0.0.17): - DKPhotoGallery/Core (= 0.0.17) - DKPhotoGallery/Model (= 0.0.17) @@ -306,7 +306,7 @@ SPEC CHECKSUMS: camera_avfoundation: 8b8d780bcfb6a4a02b0fbe2b4bd17b5b71946e68 connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d device_info_plus: e5c5da33f982a436e103237c0c85f9031142abed - DKImagePickerController: a7836546cfdfe014171694f643a7d575bc8ace7f + DKImagePickerController: 0a24ebfe7b48beeb74c27531540aaa2cc1dac6cf DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 EMASRest: 8df6f87836767a9415ad5cc4af739bc9d215b475 file_picker: ce3938a0df3cc1ef404671531facef740d03f920 diff --git a/star_lock/lib/blue/blue_manage.dart b/star_lock/lib/blue/blue_manage.dart index f1ffcfcf..40f196c7 100644 --- a/star_lock/lib/blue/blue_manage.dart +++ b/star_lock/lib/blue/blue_manage.dart @@ -304,9 +304,7 @@ class BlueManage { } /// 调用发送数据 List senderData, - Future bludSendData( - String deviceName, ConnectStateCallBack stateCallBack, - {bool isAddEquipment = false}) async { + Future bludSendData(String deviceName, ConnectStateCallBack stateCallBack, {bool isAddEquipment = false}) async { FlutterBluePlus.isSupported.then((isAvailable) async { if (isAvailable) { if (_adapterState == BluetoothAdapterState.on) { @@ -343,6 +341,7 @@ class BlueManage { element.device.platformName == connectDeviceName || element.advertisementData.advName == connectDeviceName); if (isAddEquipment == false && isExistDevice == false) { + // AppLog.log("需要开启扫描"); // startScan(10, (scanDevices){ startScanSingle(deviceName, 10, (List scanDevices) { // AppLog.log("扫描到的设备:$scanDevices"); @@ -351,6 +350,7 @@ class BlueManage { isAddEquipment: isAddEquipment); }); } else { + // AppLog.log("不需要开启扫描"); _connectDevice(devicesList, deviceName, connectStateCallBack, isAddEquipment: isAddEquipment); } @@ -576,12 +576,26 @@ class BlueManage { List subData = splitList(valueList, _mtuSize!); // AppLog.log('writeCharacteristicWithResponse _mtuSize:$_mtuSize 得到的分割数据:$subData'); for (int i = 0; i < subData.length; i++) { - await characteristic.write(subData[i],withoutResponse: true).then((value) async { - // await Future.delayed(const Duration(milliseconds: 1)).then(( - // value) async { - // AppLog.log('分包发送成功了'); - // }); - }); + if (characteristic.properties.writeWithoutResponse) { + // 使用WRITE_NO_RESPONSE属性写入值 + await characteristic.write(subData[i],withoutResponse: true).then((value) async { + // await Future.delayed(const Duration(milliseconds: 1)).then(( + // value) async { + // AppLog.log('分包发送成功了'); + // }); + }); + } else if (characteristic.properties.write) { + // 使用WRITE属性写入值 + await characteristic.write(subData[i]).then((value) async { + // await Future.delayed(const Duration(milliseconds: 1)).then(( + // value) async { + // AppLog.log('分包发送成功了'); + // }); + }); + } else { + // 特性不支持写入 + throw Exception('This characteristic does not support writing.'); + } } } on Exception catch (e, s) { AppLog.log('APP写入失败: $e'); diff --git a/star_lock/lib/blue/io_protocol/io_openLock.dart b/star_lock/lib/blue/io_protocol/io_openLock.dart index 126b2fe2..0de6846a 100644 --- a/star_lock/lib/blue/io_protocol/io_openLock.dart +++ b/star_lock/lib/blue/io_protocol/io_openLock.dart @@ -61,6 +61,7 @@ class OpenLockCommand extends SenderProtocol { // OpenTime 4 int? d1 = openTime; + // AppLog.log("开门时间是:$d1"); data.add((d1! & 0xff000000) >> 24); data.add((d1 & 0xff0000) >> 16); diff --git a/star_lock/lib/flavors.dart b/star_lock/lib/flavors.dart index ec6cf242..19d54133 100644 --- a/star_lock/lib/flavors.dart +++ b/star_lock/lib/flavors.dart @@ -100,8 +100,8 @@ class F { static String get apiPrefix { switch (appFlavor) { case Flavor.local: - // return 'https://ge.lock.star-lock.cn'; // 葛工 - return 'http://192.168.1.15:8022'; // 谢工 + return 'https://ge.lock.star-lock.cn'; // 葛工 + // return 'http://192.168.1.15:8022'; // 谢工 case Flavor.dev: return 'https://dev.lock.star-lock.cn'; case Flavor.pre: diff --git a/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart b/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart index c4e5ee95..eb2f6030 100644 --- a/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart +++ b/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_logic.dart @@ -63,7 +63,7 @@ class DoorLockLogLogic extends BaseGetXController { // } // 根据时间查解析数据 - Future _replyReferEventRecordTime(Reply reply) async { + Future _replyReferEventRecordTime(Reply reply) async { int status = reply.data[2]; switch (status) { case 0x00: @@ -135,9 +135,13 @@ class DoorLockLogLogic extends BaseGetXController { // 查询事件记录(时间查询) Future senderReferEventRecordTime(int time) async { - BlueManage().bludSendData(BlueManage().connectDeviceName, - (BluetoothConnectionState state) async { - if (state == BluetoothConnectionState.connected) { + + showEasyLoading(); + showBlueConnetctToastTimer(action: (){ + dismissEasyLoading(); + }); + BlueManage().bludSendData(BlueManage().connectDeviceName, (BluetoothConnectionState connectionStateState) async { + if (connectionStateState == BluetoothConnectionState.connected) { var privateKey = await Storage.getStringList(saveBluePrivateKey); List getPrivateKeyList = changeStringListToIntList(privateKey!); @@ -159,6 +163,12 @@ class DoorLockLogLogic extends BaseGetXController { publicKey: getPublicKeyList, privateKey: getPrivateKeyList, ); + } else if (connectionStateState == BluetoothConnectionState.disconnected) { + dismissEasyLoading(); + cancelBlueConnetctToastTimer(); + if(state.ifCurrentScreen.value == true){ + showBlueConnetctToast(); + } } }); } diff --git a/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart b/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart index 64d7f612..1a8c4a1e 100644 --- a/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart +++ b/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; @@ -10,6 +11,7 @@ import 'package:star_lock/tools/noData.dart'; import 'package:timelines/timelines.dart'; import '../../../app_settings/app_colors.dart'; +import '../../../tools/appRouteObserver.dart'; import '../../../tools/titleAppBar.dart'; import '../../../translations/trans_lib.dart'; @@ -20,7 +22,7 @@ class DoorLockLogPage extends StatefulWidget { State createState() => _DoorLockLogPageState(); } -class _DoorLockLogPageState extends State { +class _DoorLockLogPageState extends State with RouteAware { final logic = Get.put(DoorLockLogLogic()); final state = Get.find().state; @@ -212,4 +214,54 @@ class _DoorLockLogPageState extends State { : NoData(), ); } + + @override + void didChangeDependencies() { + // TODO: implement didChangeDependencies + super.didChangeDependencies(); + + /// 路由订阅 + AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!); + } + + @override + void dispose() { + // TODO: implement dispose + /// 取消路由订阅 + AppRouteObserver().routeObserver.unsubscribe(this); + super.dispose(); + } + + /// 从上级界面进入 当前界面即将出现 + @override + void didPush() { + super.didPush(); + state.ifCurrentScreen.value = true; + } + + /// 返回上一个界面 当前界面即将消失 + @override + void didPop() { + super.didPop(); + logic.cancelBlueConnetctToastTimer(); + if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + state.ifCurrentScreen.value = false; + } + + /// 从下级返回 当前界面即将出现 + @override + void didPopNext() { + super.didPopNext(); + state.ifCurrentScreen.value = true; + } + + /// 进入下级界面 当前界面即将消失 + @override + void didPushNext() { + super.didPushNext(); + logic.cancelBlueConnetctToastTimer(); + if (EasyLoading.isShow) EasyLoading.dismiss(animation: true); + state.ifCurrentScreen.value = false; + } + } diff --git a/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_state.dart b/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_state.dart index 18a62a68..42b50557 100644 --- a/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_state.dart +++ b/star_lock/lib/main/lockDetail/doorLockLog/doorLockLog_state.dart @@ -17,15 +17,8 @@ class DoorLockLogState { DateTime(2024, 10, 10), ]; - final startDate = - DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day) - .millisecondsSinceEpoch - .obs; - final endDate = (DateTime( - DateTime.now().year, DateTime.now().month, DateTime.now().day + 1) - .subtract(const Duration(milliseconds: 1))) - .millisecondsSinceEpoch - .obs; + final startDate = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day).millisecondsSinceEpoch.obs; + final endDate = (DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day + 1).subtract(const Duration(milliseconds: 1))).millisecondsSinceEpoch.obs; var dropdownTitle = '全部事件'.obs; var dropdownValue = XSConstantMacro.lockEventTypeAll.obs; @@ -53,6 +46,8 @@ class DoorLockLogState { isCheked: false), ]; + var ifCurrentScreen = true.obs; // 是否是当前界面,用于判断是否需要针对当前界面进行展示 + DoorLockLogState() { keyInfos.value = Get.arguments["keyInfo"]; } diff --git a/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_logic.dart b/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_logic.dart index d1bb5fac..bf460180 100644 --- a/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_logic.dart +++ b/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_logic.dart @@ -34,18 +34,19 @@ class SendElectronicKeyLogic extends BaseGetXController { switch (typeValue) { case 0: { - if (state.beginTime.value.isEmpty) { + // 限时 + if (state.timeLimitBeginTime.value.isEmpty) { showToast("请选择开始时间".tr); return; } - if (state.beginTime.value.isEmpty) { + if (state.timeLimitEndTime.value.isEmpty) { showToast("请选择结束时间".tr); return; } typeValue = XSConstantMacro.keyTypeTime; - startDate = DateTool().dateToTimestamp(state.beginTime.value, 1).toString(); - endDate = DateTool().dateToTimestamp(state.endTime.value, 1).toString(); + startDate = DateTool().dateToTimestamp(state.timeLimitBeginTime.value, 1).toString(); + endDate = DateTool().dateToTimestamp(state.timeLimitEndTime.value, 1).toString(); startTime = "0"; endTime = "0"; @@ -68,12 +69,12 @@ class SendElectronicKeyLogic extends BaseGetXController { break; case 3: typeValue = XSConstantMacro.keyTypeLoop; - if (state.beginTime.value.isEmpty) { + if (state.cycleBeginTime.value.isEmpty) { showToast("请选择有效期".tr); return; } - startDate = DateTool().dateToTimestamp(state.beginTime.value, 1).toString(); - endDate = DateTool().dateToTimestamp(state.endTime.value, 1).toString(); + startDate = DateTool().dateToTimestamp(state.cycleBeginTime.value, 1).toString(); + endDate = DateTool().dateToTimestamp(state.cycleEndTime.value, 1).toString(); startTime = DateTool().dateToTimestamp(state.effectiveDateTime.value, 0).toString(); endTime = DateTool().dateToTimestamp(state.failureDateTime.value, 0).toString(); break; @@ -217,13 +218,14 @@ class SendElectronicKeyLogic extends BaseGetXController { void resetData() { state.emailOrPhoneController.text = ""; state.keyNameController.text = ""; - if(state.seletType.value == 0){ - state.beginTime.value = DateTool().dateToYMDHNString(DateTime.now().millisecondsSinceEpoch.toString()); //默认为当前时间 - state.endTime.value = DateTool().dateToYMDHNString(DateTime.now().millisecondsSinceEpoch.toString());//默认为当前时间 - }else{ - state.beginTime.value = ""; //默认为当前时间 - state.endTime.value = "";//默认为当前时间 - } + + state.timeLimitBeginTime = DateTool().dateToYMDHNString(DateTime.now().millisecondsSinceEpoch.toString()).obs;// 限时开始时间 + state.timeLimitEndTime = DateTool().dateToYMDHNString(DateTime.now().millisecondsSinceEpoch.toString()).obs;// 限时结束时间 + state.cycleBeginTime = "".obs;// 循环开始时间 + state.cycleEndTime = "".obs;// 循环结束时间 + state.effectiveDateTime = "".obs;// 生效时间 + state.failureDateTime = "".obs;// 失效时间 + state.weekdaysList = [].obs; } } diff --git a/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_page.dart b/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_page.dart index a114011f..b0a05134 100644 --- a/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_page.dart +++ b/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_page.dart @@ -199,23 +199,23 @@ class _SendElectronicKeyPageState extends State with Sing children: [ Obx(() => CommonItem( leftTitel: TranslationLoader.lanKeys!.effectiveTime!.tr, - rightTitle: state.beginTime.value, + rightTitle: state.timeLimitBeginTime.value, isHaveLine: true, isHaveDirection: true, action: () { Pickers.showDatePicker(context, mode: DateMode.YMDHM, onConfirm: (p) { - state.beginTime.value = DateTool().getYMDHNDateString(p, 1); + state.timeLimitBeginTime.value = DateTool().getYMDHNDateString(p, 1); }); })), Obx(() => CommonItem( leftTitel: TranslationLoader.lanKeys!.failureTime!.tr, - rightTitle: state.endTime.value, + rightTitle: state.timeLimitEndTime.value, isHaveDirection: true, action: () { Pickers.showDatePicker(context, mode: DateMode.YMDHM, onConfirm: (p) { - state.endTime.value = DateTool().getYMDHNDateString(p, 1); + state.timeLimitEndTime.value = DateTool().getYMDHNDateString(p, 1); }); })), Container(height: 10.h), @@ -250,22 +250,22 @@ class _SendElectronicKeyPageState extends State with Sing children: [ Obx(() => CommonItem( leftTitel: TranslationLoader.lanKeys!.periodValidity!.tr, - rightTitle: "${state.beginTime.value}\n${state.endTime.value}", + rightTitle: "${state.cycleBeginTime.value}\n${state.cycleEndTime.value}", isHaveDirection: true, isHaveLine: true, action: () async { var result = await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: { 'validityValue': state.weekdaysList.value, - 'starDate': state.beginTime.value, - 'endDate': state.endTime.value, + 'starDate': state.cycleBeginTime.value, + 'endDate': state.cycleEndTime.value, 'starTime': state.effectiveDateTime.value, 'endTime': state.failureDateTime.value }); if(result != null && result.isNotEmpty){ state.weekdaysList.value = result['validityValue']; - state.beginTime.value = result['starDate']; - state.endTime.value = result['endDate']; + state.cycleBeginTime.value = result['starDate']; + state.cycleEndTime.value = result['endDate']; state.effectiveDateTime.value = result['starTime']; state.failureDateTime.value = result['endTime']; } @@ -281,15 +281,15 @@ class _SendElectronicKeyPageState extends State with Sing var result = await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: { 'validityValue': state.weekdaysList.value, - 'starDate': state.beginTime.value, - 'endDate': state.endTime.value, + 'starDate': state.cycleBeginTime.value, + 'endDate': state.cycleEndTime.value, 'starTime': state.effectiveDateTime.value, 'endTime': state.failureDateTime.value }); if(result != null && result.isNotEmpty){ state.weekdaysList.value = result['validityValue']; - state.beginTime.value = result['starDate']; - state.endTime.value = result['endDate']; + state.cycleBeginTime.value = result['starDate']; + state.cycleEndTime.value = result['endDate']; state.effectiveDateTime.value = result['starTime']; state.failureDateTime.value = result['endTime']; } @@ -305,18 +305,17 @@ class _SendElectronicKeyPageState extends State with Sing var result = await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: { 'validityValue': state.weekdaysList.value, - 'starDate': state.beginTime.value, - 'endDate': state.endTime.value, + 'starDate': state.cycleBeginTime.value, + 'endDate': state.cycleEndTime.value, 'starTime': state.effectiveDateTime.value, 'endTime': state.failureDateTime.value }); if(result != null && result.isNotEmpty){ state.weekdaysList.value = result['validityValue']; - state.beginTime.value = result['starDate']; - state.endTime.value = result['endDate']; + state.cycleBeginTime.value = result['starDate']; + state.cycleEndTime.value = result['endDate']; state.effectiveDateTime.value = result['starTime']; state.failureDateTime.value = result['endTime']; - Get.back(result: result); } }) )), diff --git a/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_state.dart b/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_state.dart index 5d8d6d7a..b5dd79e0 100644 --- a/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_state.dart +++ b/star_lock/lib/main/lockDetail/electronicKey/sendElectronicKey/sendElectronicKey/sendElectronicKey_state.dart @@ -18,8 +18,10 @@ class SendElectronicKeyState { final isRemoteUnlock = false.obs; //是否允许远程开锁 final isAuthentication = false.obs; //是否可以实名认证 - var beginTime = "".obs; //默认为当前时间 开始时间 - var endTime = "".obs;//默认为当前时间 结束时间 + var timeLimitBeginTime = DateTool().dateToYMDHNString(DateTime.now().millisecondsSinceEpoch.toString()).obs;// 限时开始时间 + var timeLimitEndTime = DateTool().dateToYMDHNString(DateTime.now().millisecondsSinceEpoch.toString()).obs;// 限时结束时间 + var cycleBeginTime = "".obs;// 循环开始时间 + var cycleEndTime = "".obs;// 循环结束时间 var effectiveDateTime = "".obs;// 生效时间 var failureDateTime = "".obs;// 失效时间 var weekdaysList = [].obs; diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_list_page.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_list_page.dart new file mode 100644 index 00000000..c1941350 --- /dev/null +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_list_page.dart @@ -0,0 +1,65 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:intl/intl.dart'; +import 'package:star_lock/flavors.dart'; +import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_state.dart'; +import 'package:star_lock/tools/showTipView.dart'; +import 'package:star_lock/tools/titleAppBar.dart'; +import 'package:star_lock/widget/flavors_img.dart'; + +import '../../../appRouters.dart'; +import '../../../app_settings/app_colors.dart'; +import '../../../blue/blue_manage.dart'; +import '../../../blue/io_tool/io_tool.dart'; +import '../../../common/XSConstantMacro/XSConstantMacro.dart'; +import '../../../tools/appRouteObserver.dart'; +import '../../../tools/commonDataManage.dart'; +import '../../../tools/dateTool.dart'; +import '../../../tools/eventBusEventManage.dart'; +import '../../../tools/storage.dart'; +import '../../../translations/trans_lib.dart'; +import '../../lockMian/entity/lockListInfo_entity.dart'; +import 'lockDetail_logic.dart'; + +class LockDetailListPage extends StatefulWidget { + final String title; + final List items; + + const LockDetailListPage({Key? key, required this.title, required this.items}) + : super(key: key); + + @override + State createState() => _LockDetailListPageState(); +} + +class _LockDetailListPageState extends State + with TickerProviderStateMixin, RouteAware { + late LockDetailLogic logic; + late LockDetailState state; + + @override + void initState() { + super.initState(); + logic = Get.find(); + state = Get.find().state; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: TitleAppBar( + barTitle: widget.title, + haveBack: true, + iconColor: AppColors.blackColor, + titleColor: AppColors.blackColor, + ), + body: ListView.builder( + padding: EdgeInsets.only(top: 15.h), + itemCount: widget.items.length, + itemBuilder: (context, index) => widget.items[index]), + ); + } +} diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart index 9664ca8b..4f307e2f 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_logic.dart @@ -108,14 +108,13 @@ class LockDetailLogic extends BaseGetXController { keyID: BlueManage().connectDeviceName, userID: await Storage.getUid(), openMode: state.openDoorModel, - openTime: DateTime.now().millisecondsSinceEpoch ~/ 1000, + openTime: state.netTime, onlineToken: state.lockNetToken, token: tokenData, needAuthor: 1, signKey: signKeyDataList, privateKey: getPrivateKeyList, ); - break; case 0x07: //无权限 @@ -330,7 +329,7 @@ class LockDetailLogic extends BaseGetXController { keyID: BlueManage().connectDeviceName, userID: await Storage.getUid(), openMode: state.openDoorModel, - openTime: DateTime.now().millisecondsSinceEpoch ~/ 1000, + openTime: state.netTime, onlineToken: state.lockNetToken, token: getTokenList, needAuthor: 1, @@ -381,6 +380,16 @@ class LockDetailLogic extends BaseGetXController { } + // 从服务器获取锁的时间 开锁时传入 + void getServerDatetime() async{ + var entity = await ApiRepository.to.getServerDatetimeData( + lockId: state.keyInfos.value.lockId.toString(), + ); + if(entity.errorCode!.codeIsSuccessful){ + state.netTime = entity.data!.date!.toString().length > 10 ? entity.data!.date!~/ 1000 : entity.data!.date!; + } + } + // 获取手机联网token,根据锁设置里面获取的开锁时是否联网来判断是否调用这个接口 void getLockNetToken() async { LockNetTokenEntity entity = await ApiRepository.to.getLockNetToken(lockId: state.keyInfos.value.lockId.toString()); @@ -432,6 +441,7 @@ class LockDetailLogic extends BaseGetXController { lockId: state.keyInfos.value.lockId.toString(), records: list); if (entity.errorCode!.codeIsSuccessful) { // mockNetworkDataRequest(); + AppLog.log("state.keyInfos.value.keyType:${state.keyInfos.value.keyType}"); if(state.keyInfos.value.keyType == XSConstantMacro.keyTypeOnce){ // 单次删除 deletKeyData(); @@ -520,6 +530,8 @@ class LockDetailLogic extends BaseGetXController { @override Future onReady() async { super.onReady(); + getServerDatetime(); + await PermissionDialog.request(Permission.location); await PermissionDialog.requestBluetooth(); } diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_main_page.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_main_page.dart index b830bb89..eb1d8703 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_main_page.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_main_page.dart @@ -18,7 +18,6 @@ class LockDetailMainPage extends StatefulWidget { class _LockDetailMainPageState extends State { @override void initState() { - // TODO: implement initState super.initState(); } @@ -26,26 +25,37 @@ class _LockDetailMainPageState extends State { Widget build(BuildContext context) { final bool isOnlyOneData; LockListInfoItemEntity keyInfos = LockListInfoItemEntity(); - // LockMainEntity lockEntity = LockMainEntity(); - dynamic obj = ModalRoute.of(context)?.settings.arguments; - // if (obj != null && (obj["lockMainEntity"] != null)) { - // lockEntity = obj["lockMainEntity"]; - // } if (obj != null && (obj["keyInfo"] != null)) { keyInfos = obj["keyInfo"]; } isOnlyOneData = obj["isOnlyOneData"]; - return Scaffold( - backgroundColor: Colors.white, - appBar: TitleAppBar( - barTitle: F.navTitle, - haveBack: true, - backgroundColor: AppColors.mainColor), - body: LockDetailPage( - isOnlyOneData: isOnlyOneData, lockListInfoItemEntity: keyInfos), - // body: Container(), - ); + return F.sw( + defaultCall: () => Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + barTitle: F.navTitle, + haveBack: true, + backgroundColor: AppColors.mainColor), + body: LockDetailPage( + isOnlyOneData: isOnlyOneData, + lockListInfoItemEntity: keyInfos), + // body: Container(), + ), + xhjCall: () => Scaffold( + backgroundColor: Colors.white, + appBar: TitleAppBar( + barTitle: keyInfos.lockAlias, + haveBack: true, + backgroundColor: Colors.white, + titleColor: AppColors.blackColor, + iconColor: AppColors.blackColor, + ), + body: LockDetailPage( + isOnlyOneData: isOnlyOneData, + lockListInfoItemEntity: keyInfos), + // body: Container(), + )); } } diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart index e535dac3..9164f2f5 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_page.dart @@ -5,11 +5,13 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:intl/intl.dart'; import 'package:star_lock/flavors.dart'; +import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_list_page.dart'; import 'package:star_lock/tools/showTipView.dart'; import 'package:star_lock/widget/flavors_img.dart'; import '../../../appRouters.dart'; import '../../../app_settings/app_colors.dart'; +import '../../../app_settings/app_settings.dart'; import '../../../blue/blue_manage.dart'; import '../../../blue/io_tool/io_tool.dart'; import '../../../common/XSConstantMacro/XSConstantMacro.dart'; @@ -83,12 +85,6 @@ class _LockDetailPageState extends State state.lockUserNo = state.keyInfos.value.lockUserNo!; - // if (state.lockUserNo == 0) { - // state.bottomBtnisEable.value = false; - // } else { - // state.bottomBtnisEable.value = true; - // } - if (state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusWaitIneffective || state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusFrozen || @@ -136,7 +132,6 @@ class _LockDetailPageState extends State @override Widget build(BuildContext context) { - state.widgetContext = context; loadData(); return F.sw(defaultCall: () => skWidget(), xhjCall: () => xhjWidget()); } @@ -145,43 +140,242 @@ class _LockDetailPageState extends State Widget xhjWidget() { return Scaffold( backgroundColor: Colors.white, - body: SingleChildScrollView( - child: Obx(() { - return Column( - children: [ - SizedBox( - height: 45.h, + body: Obx(() { + return Column( + children: [ + SizedBox( + height: 35.h, + ), + xhjInfoView(), + SizedBox( + height: 35.h, + ), + labelText('images/icon_slider_horizontal.png', '功能'.tr, () { + Get.to( + LockDetailListPage(title: '功能'.tr, items: getBottomWidget())); + }), + labelText('images/icon_puzzlepiece_extension.png', '配件'.tr, () { + Get.to(LockDetailListPage( + title: '配件'.tr, items: getAttachmentWidget())); + }), + ], + ); + }), + ); + } + + Widget labelText(String img, String text, var onTap) { + return GestureDetector( + onTap: onTap, + child: Container( + margin: EdgeInsets.symmetric(horizontal: 0.05.sw, vertical: 15.h), + padding: EdgeInsets.symmetric(horizontal: 0.05.sw, vertical: 20.h), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(16.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + offset: Offset(0, 0), + blurRadius: 10.r, + spreadRadius: 0, ), - infoView(), - SizedBox( - height: 35.h, - ), - labelGridView('功能'.tr, getBottomWidget()), - labelListView('配件'.tr, getAttachmentWidget()), - SizedBox( - height: 45.h, - ), - Padding( - padding: EdgeInsets.only(left: 52.w, right: 52.w), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - buttonView('关锁'.tr, () { - if (state.openDoorBtnisUneable.value == true) { - startUnLock(); - } - }), - buttonView('开锁'.tr, () { - if (state.openDoorBtnisUneable.value == true) { + ]), + child: Row( + children: [ + Image.asset( + img, + width: 32.r, + height: 32.r, + ), + SizedBox( + width: 15.w, + ), + Text( + text, + style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor), + ), + const Spacer(), + Icon( + Icons.arrow_forward_ios_rounded, + size: 18.r, + ) + ], + ), + ), + ); + } + + Widget xhjInfoView() { + return Container( + width: 0.9.sw, + height: 0.6.sw, + decoration: BoxDecoration( + image: const DecorationImage( + image: AssetImage('images/xhj_main_bg.jpg'), + fit: BoxFit.cover, + ), + borderRadius: BorderRadius.circular(20.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + offset: const Offset(0, 0), + blurRadius: 10.r, + spreadRadius: 0, + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Spacer(), + Obx(() { + return GestureDetector( + onTap: state.openDoorBtnisUneable.value == true + ? () { + setState(() { startOpenLock(); - } - }), + }); + } + : null, + onLongPressStart: state.openDoorBtnisUneable.value == true + ? (details) { + setState(() { + startUnLock(); + }); + } + : null, + child: Container( + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.9), + borderRadius: BorderRadius.circular(100.w), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + offset: Offset(0, 0), + blurRadius: 10.r, + spreadRadius: 0, + ), + ]), + margin: EdgeInsets.only(left: 35.w, bottom: 15.h), + child: Stack( + children: [ + FlavorsImg( + child: Image.asset( + state.openDoorBtnisUneable.value == false + ? 'images/main/icon_main_openLockBtn_grey.png' + : (state.isOpenPassageMode.value == 1 + ? 'images/main/icon_main_normallyOpenMode_center.png' + : 'images/main/icon_main_openLockBtn_center.png'), + width: 96.r, + height: 96.r, + // color: AppColors.primaryTopColor, + ), + ), + state.openDoorBtnisUneable.value == false + ? Positioned( + child: FlavorsImg( + child: Image.asset( + 'images/main/icon_main_openLockBtn_grey.png', + width: 96.r, + height: 96.r, + ), + ), + ) + : state.openLockBtnState.value == 1 + ? buildRotationTransition( + width: 96.r, + height: 96.r, + ) + : Positioned( + child: FlavorsImg( + child: Image.asset( + state.isOpenPassageMode.value == 1 + ? 'images/main/icon_main_normallyOpenMode_circle.png' + : 'images/main/icon_main_openLockBtn_circle.png', + width: 96.r, + height: 96.r, + ), + )), ], ), ), - ], - ); - }), + ); + }), + Padding( + padding: EdgeInsets.only(left: 15.w, right: 00.w, bottom: 15.h), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + TranslationLoader + .lanKeys!.clickUnlockAndHoldDownClose!.tr, + style: TextStyle( + color: AppColors.darkGrayTextColor, + fontSize: 20.sp, + ), + ), + adminInfoView(center: false, max: false), + ], + ), + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Image.asset( + showElectricIcon(state.electricQuantity.value), + width: 30.w, + height: 24.w), + SizedBox(width: 2.w), + Text("${state.electricQuantity.value}%", + style: TextStyle( + fontSize: 18.sp, + color: AppColors.darkGrayTextColor)), + SizedBox(width: 2.w), + Icon( + Icons.info, // 使用内置的 warning 图标,它是一个叹号 + color: AppColors.mainColor, // 设置图标颜色为红色 + size: 25.w, // 设置图标大小为 30 + ), + SizedBox(width: 20.w), + ], + ), + SizedBox( + height: 15.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Image.asset( + showElectricIcon(state.electricQuantity.value), + width: 30.w, + height: 24.w), + SizedBox(width: 2.w), + Text("--%", + style: TextStyle( + fontSize: 18.sp, + color: AppColors.darkGrayTextColor)), + SizedBox(width: 2.w), + Icon( + Icons.info, // 使用内置的 warning 图标,它是一个叹号 + color: AppColors.mainColor, // 设置图标颜色为红色 + size: 25.w, // 设置图标大小为 30 + ), + SizedBox(width: 20.w), + ], + ) + ], + ) + ], + ), + ) + ], ), ); } @@ -271,212 +465,6 @@ class _LockDetailPageState extends State ); } - //操作锁按钮 - Widget buttonView(String text, VoidCallback? onPressed) { - bool openLockBtnState = state.openLockBtnState.value != 0; - return ElevatedButton( - onPressed: openLockBtnState ? null : onPressed, - style: ElevatedButton.styleFrom( - backgroundColor: openLockBtnState - ? AppColors.mainBackgroundColor - : AppColors.mainColor, - shape: RoundedRectangleBorder( - // 设置按钮的形状 - borderRadius: BorderRadius.circular(8), // 圆角的大小 - )), - child: SizedBox( - height: 0.12.sh, - width: 0.12.sh, - child: Center( - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - text, - style: TextStyle( - color: - openLockBtnState ? AppColors.mainColor : Colors.white), - ), - if (openLockBtnState) - Container( - margin: EdgeInsets.only(left: 15.w), - width: 15.r, - height: 15.r, - child: CircularProgressIndicator( - strokeWidth: 3.5, - color: AppColors.mainColor, - ), - ) - ], - ), - ), - ), - ); - } - - Widget infoView() { - return Padding( - padding: EdgeInsets.only(left: 35.w, right: 10.w), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - state.lockAlias.value, - style: TextStyle( - fontSize: 28.sp, - fontWeight: FontWeight.w400, - color: state.isOpenPassageMode.value == 1 - ? AppColors.openPassageModeColor - : AppColors.darkGrayTextColor), - ), - SizedBox( - height: 15.h, - ), - adminInfoView(center: false, max: false), - ], - ), - Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - FlavorsImg( - child: Image.asset( - showElectricIcon(state.electricQuantity.value), - width: 30.w, - height: 24.w), - ), - SizedBox(width: 2.w), - Text("${state.electricQuantity.value}%", - style: TextStyle( - fontSize: 18.sp, color: AppColors.darkGrayTextColor)), - SizedBox(width: 2.w), - FlavorsImg( - child: Icon( - Icons.info, // 使用内置的 warning 图标,它是一个叹号 - color: AppColors.mainColor, // 设置图标颜色为红色 - size: 25.w, // 设置图标大小为 30 - ), - ), - SizedBox(width: 20.w), - ], - ), - SizedBox( - height: 15.h, - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - FlavorsImg( - child: Image.asset( - showElectricIcon(state.electricQuantity.value), - width: 30.w, - height: 24.w), - ), - SizedBox(width: 2.w), - Text("--%", - style: TextStyle( - fontSize: 18.sp, color: AppColors.darkGrayTextColor)), - SizedBox(width: 2.w), - FlavorsImg( - child: Icon( - Icons.info, // 使用内置的 warning 图标,它是一个叹号 - color: AppColors.mainColor, // 设置图标颜色为红色 - size: 25.w, // 设置图标大小为 30 - ), - ), - SizedBox(width: 20.w), - ], - ) - ], - ) - ], - ), - ); - } - - //带标签的 GridView 布局 - Widget labelGridView(String text, List children) { - return Column( - children: [ - Align( - alignment: Alignment.topLeft, - child: Padding( - padding: EdgeInsets.only( - left: 40.w, - top: 20.h, - bottom: 20.h, - ), - child: Text(text))), - SizedBox( - height: 200.h, - child: Row( - children: [ - Expanded( - child: GridView.count( - padding: EdgeInsets.only(left: 15.w, right: 15.w), - crossAxisCount: 2, - childAspectRatio: 0.7, - crossAxisSpacing: 25.h, - mainAxisSpacing: 25.w, - scrollDirection: Axis.horizontal, - children: children), - ), - Padding( - padding: EdgeInsets.only(left: 0.w, right: 4.w), - child: const Icon(Icons.arrow_forward_ios_rounded), - ), - ], - ), - ), - ], - ); - } - - //带标签的 ListView 布局 - Widget labelListView(String text, List children) { - return Column( - children: [ - Align( - alignment: Alignment.topLeft, - child: Padding( - padding: EdgeInsets.only( - left: 40.w, - top: 20.h, - bottom: 20.h, - ), - child: Text(text))), - SizedBox( - height: 100.h, - child: Row( - children: [ - Expanded( - child: GridView.count( - padding: EdgeInsets.only(left: 15.w, right: 15.w), - crossAxisCount: 1, - childAspectRatio: 0.7, - crossAxisSpacing: 25.h, - mainAxisSpacing: 25.w, - scrollDirection: Axis.horizontal, - children: children), - ), - Padding( - padding: EdgeInsets.only(left: 0.w, right: 4.w), - child: Icon(Icons.arrow_forward_ios_rounded), - ), - ], - ), - ), - ], - ); - } - Widget topWidget() { return Column( children: [ @@ -510,7 +498,6 @@ class _LockDetailPageState extends State children: [ GestureDetector( onTap: () { - // logic.getStarLockStatus(); ShowTipView().showSureAlertDialog( "${"锁电量更新时间:".tr}${DateTool().dateToYMDHNString(state.keyInfos.value.electricQuantityDate!.toString())}"); }, @@ -581,7 +568,8 @@ class _LockDetailPageState extends State children: [ Center( child: GestureDetector( - onTap: state.openDoorBtnisUneable.value == true ? () { + onTap: state.openDoorBtnisUneable.value == true + ? () { setState(() { startOpenLock(); }); @@ -619,7 +607,10 @@ class _LockDetailPageState extends State ), ) : state.openLockBtnState.value == 1 - ? buildRotationTransition() + ? buildRotationTransition( + width: 330.w, + height: 330.w, + ) : Positioned( child: FlavorsImg( child: Image.asset( @@ -690,7 +681,7 @@ class _LockDetailPageState extends State : TranslationLoader.lanKeys!.normalUser!.tr), style: TextStyle(fontSize: 20.sp, color: AppColors.darkGrayTextColor), ), - if (add) SizedBox(width: 20.w) else SizedBox(width: 80.w), + if (add) SizedBox(width: 20.w) else SizedBox(width: 40.w), FlavorsImg( child: Image.asset( state.keyInfos.value.remoteEnable == 1 @@ -742,7 +733,8 @@ class _LockDetailPageState extends State } //旋转动画 - Widget buildRotationTransition() { + Widget buildRotationTransition( + {required double width, required double height}) { return Positioned( child: RotationTransition( //设置动画的旋转中心 @@ -755,8 +747,8 @@ class _LockDetailPageState extends State state.isOpenPassageMode.value == 1 ? 'images/main/icon_main_normallyOpenMode_circle.png' : 'images/main/icon_main_openLockBtn_circle.png', - width: 330.w, - height: 330.w, + width: width, + height: height, ), ), ), @@ -1080,9 +1072,81 @@ class _LockDetailPageState extends State return showWidgetArr; } - // Widget bottomItem(String iconUrl, String name, bool openDoorBtnisUneable, bool bottomBtnisEable, Function() onClick) { + Widget child = F.sw( + defaultCall: () => Container( + color: Colors.white, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + width: 42.w, + height: 42.h, + child: FlavorsImg( + black: true, + child: Image.asset(iconUrl, + width: 42.w, + height: 42.w, + color: openDoorBtnisUneable + ? (bottomBtnisEable + ? AppColors.mainColor + : AppColors.lockDetailBottomBtnUneable) + : AppColors.lockDetailBottomBtnUneable, + fit: BoxFit.fitWidth), + ), + ), + SizedBox(height: 10.w), + Expanded( + child: Text(name, + style: TextStyle( + fontSize: 20.sp, + color: openDoorBtnisUneable + ? (bottomBtnisEable + ? AppColors.blackColor + : AppColors.lockDetailBottomBtnUneable) + : AppColors.lockDetailBottomBtnUneable), + textAlign: TextAlign.center)) + ], + ), + ), + xhjCall: () => Container( + color: Colors.white, + margin: EdgeInsets.symmetric(vertical: 5.h), + padding: EdgeInsets.symmetric(vertical: 15.h, horizontal: 15.w), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + width: 42.w, + height: 42.h, + child: FlavorsImg( + black: true, + child: Image.asset(iconUrl, + width: 42.w, + height: 42.w, + color: openDoorBtnisUneable + ? (bottomBtnisEable + ? AppColors.mainColor + : AppColors.lockDetailBottomBtnUneable) + : AppColors.lockDetailBottomBtnUneable, + fit: BoxFit.fitWidth), + ), + ), + SizedBox(width: 20.w), + Text( + name, + style: TextStyle( + fontSize: 20.sp, + color: openDoorBtnisUneable + ? (bottomBtnisEable + ? AppColors.blackColor + : AppColors.lockDetailBottomBtnUneable) + : AppColors.lockDetailBottomBtnUneable), + ), + ], + ), + )); return GestureDetector( onTap: openDoorBtnisUneable ? (bottomBtnisEable @@ -1091,41 +1155,7 @@ class _LockDetailPageState extends State logic.showToast("请在锁旁边完成第一次开锁".tr); }) : null, - child: Container( - // height: 300.h, - color: Colors.white, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox( - width: 42.w, - height: 42.h, - child: FlavorsImg( - black: true, - child: Image.asset(iconUrl, - width: 42.w, - height: 42.w, - color: openDoorBtnisUneable - ? (bottomBtnisEable - ? AppColors.mainColor - : AppColors.lockDetailBottomBtnUneable) - : AppColors.lockDetailBottomBtnUneable, - fit: BoxFit.fitWidth), - ), - ), - SizedBox(height: 10.w), - Expanded( - child: Text(name, - style: TextStyle( - fontSize: 20.sp, - color: openDoorBtnisUneable - ? (bottomBtnisEable - ? AppColors.blackColor - : AppColors.lockDetailBottomBtnUneable) - : AppColors.lockDetailBottomBtnUneable), - textAlign: TextAlign.center)) - ], - )), + child: child, ); } @@ -1213,13 +1243,16 @@ class _LockDetailPageState extends State state.openLockBtnState.value = 1; // state.animationController!.forward(); + AppLog.log("点击开锁"); if (state.isOpenLockNeedOnline.value == 0) { // 不需要联网 state.openDoorModel = 0; + AppLog.log("点击开锁 state.openDoorModel = 0 不需要联网"); logic.openDoorAction(); } else { // 需要联网 state.openDoorModel = 2; + AppLog.log("点击开锁 state.openDoorModel = 2 需要联网"); logic.getLockNetToken(); } } @@ -1233,12 +1266,15 @@ class _LockDetailPageState extends State state.openLockBtnState.value = 1; state.animationController!.forward(); + AppLog.log("长按闭锁"); if (state.isOpenLockNeedOnline.value == 0) { // 不需要联网 + AppLog.log("长按闭锁 state.openDoorModel = 32 不需要联网"); state.openDoorModel = 32; logic.openDoorAction(); } else { // 需要联网 + AppLog.log("长按闭锁 state.openDoorModel = 34 需要联网"); state.openDoorModel = 34; logic.getLockNetToken(); } diff --git a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart index 2a186430..bb10e0d9 100644 --- a/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart +++ b/star_lock/lib/main/lockDetail/lockDetail/lockDetail_state.dart @@ -14,6 +14,7 @@ class LockDetailState { StreamSubscription? lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent; String lockNetToken = ""; + int netTime = 0; int lockUserNo = 0; var senderUserId = 0; var isOnlyOneData = false; @@ -45,7 +46,6 @@ class LockDetailState { final PageController pageController = PageController(); var currentPage = 0.obs; - late BuildContext widgetContext; // LockDetailState() { // Map map = Get.arguments; diff --git a/star_lock/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_logic.dart b/star_lock/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_logic.dart index 05d28aa9..e6513d08 100644 --- a/star_lock/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_logic.dart +++ b/star_lock/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_logic.dart @@ -245,7 +245,7 @@ class PasswordKeyPerpetualLogic extends BaseGetXController { IoSenderManage.senderCustomPasswordsCommand( keyID: "1", userID: await Storage.getUid(), - pwdNo: state.isAdministrator.value == true ? 254 : 1, + pwdNo: state.isAdministrator.value == true ? 254 : 0, pwd:state.pwdController.text, useCountLimit: 0xff, startTime: DateTool().dateToTimestamp(state.beginTime.value, 1)~/1000, @@ -326,7 +326,7 @@ class PasswordKeyPerpetualLogic extends BaseGetXController { IoSenderManage.senderCustomPasswordsCommand( keyID: "1", userID: await Storage.getUid(), - pwdNo: state.isAdministrator.value == true ? 254 : 1, + pwdNo: state.isAdministrator.value == true ? 254 : 0, pwd: state.pwdController.text, useCountLimit: 0xff, startTime:state.isPermanent.value == false ? startDate ~/ 1000 : 0, diff --git a/star_lock/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_page.dart b/star_lock/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_page.dart index a4e530d4..efad0ad3 100644 --- a/star_lock/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_page.dart +++ b/star_lock/lib/main/lockDetail/passwordKey/passwordKey_perpetual/passwordKey_perpetual_page.dart @@ -21,6 +21,7 @@ import '../../../../tools/appRouteObserver.dart'; import '../../../../tools/commonItem.dart'; import '../../../../tools/dateTool.dart'; +import '../../../../tools/pickers/time_picker/model/pduration.dart'; import '../../../../tools/submitBtn.dart'; import '../../../../tools/titleAppBar.dart'; import '../../../../translations/trans_lib.dart'; @@ -223,7 +224,12 @@ class _PasswordKeyPerpetualPageState extends State wit isHaveLine: true, isHaveDirection: true, action: () { - Pickers.showDatePicker(context, mode: state.widgetType.value == 3 ? DateMode.YMDHM:DateMode.YMDH, onConfirm: (p) { + Pickers.showDatePicker( + context, + maxDate: PDuration(year: DateTime.now().year + 3, month: DateTime.now().month, day: DateTime.now().day, hour: 24), + // minDate: PDuration.now(), + mode: state.widgetType.value == 3 ? DateMode.YMDHM:DateMode.YMDH, + onConfirm: (p) { if (state.widgetType.value == 3) { // 自定义 state.beginTime.value = DateTool().getYMDHNDateString(p, 1); @@ -238,7 +244,13 @@ class _PasswordKeyPerpetualPageState extends State wit rightTitle: state.endTime.value, isHaveDirection: true, action: () { - Pickers.showDatePicker(context, mode: DateMode.YMDH, onConfirm: (p) { + Pickers.showDatePicker( + context, + // maxDate传入三年以后得今天的时间 + maxDate: PDuration(year: DateTime.now().year + 3, month: DateTime.now().month, day: DateTime.now().day), + minDate: PDuration(year: DateTime.now().year, month: DateTime.now().month, day: DateTime.now().day), + mode: DateMode.YMDH, + onConfirm: (p) { if (state.widgetType.value == 3) { // 自定义 state.endTime.value = DateTool().getYMDHNDateString(p, 1); diff --git a/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart index 5e4a24fc..eab12c80 100644 --- a/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart +++ b/star_lock/lib/main/lockDetail/videoLog/videoLog/videoLog_page.dart @@ -139,7 +139,7 @@ class _VideoLogPageState extends State { Get.toNamed(Routers.valueAddedServicesHighFunctionPage); }, child: Container( - height: 150.h, + // height: 150.h, margin: EdgeInsets.all(15.w), padding: EdgeInsets.only(left: 20.w, top: 20.w, bottom: 20.w, right: 10.w), diff --git a/star_lock/lib/main/lockMian/lockList/lockListGroup_page.dart b/star_lock/lib/main/lockMian/lockList/lockListGroup_view.dart similarity index 72% rename from star_lock/lib/main/lockMian/lockList/lockListGroup_page.dart rename to star_lock/lib/main/lockMian/lockList/lockListGroup_view.dart index 4ae2731d..40ee97e3 100644 --- a/star_lock/lib/main/lockMian/lockList/lockListGroup_page.dart +++ b/star_lock/lib/main/lockMian/lockList/lockListGroup_view.dart @@ -1,31 +1,34 @@ - import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import '../../../app_settings/app_colors.dart'; import '../entity/lockListInfo_entity.dart'; -class LockListGroupPage extends StatefulWidget { - const LockListGroupPage({Key? key, - this.child, - this.onTap, - required this.groupItem, - required this.typeImgList}) +class LockListGroupView extends StatefulWidget { + const LockListGroupView( + {Key? key, + this.child, + this.onTap, + this.backgroundColor, + this.textStyle, + required this.groupItem, + required this.typeImgList}) : super(key: key); final Widget? child; final List typeImgList; final Function()? onTap; final GroupList groupItem; + final Color? backgroundColor; + final TextStyle? textStyle; @override - State createState() => _LockListGroupPageState(); + State createState() => _LockListGroupViewState(); } -class _LockListGroupPageState extends State { +class _LockListGroupViewState extends State { bool _isExpanded = true; final Duration _animationDuration = const Duration(milliseconds: 200); - bool _isCheck = false; @override Widget build(BuildContext context) { @@ -33,7 +36,7 @@ class _LockListGroupPageState extends State { mainAxisSize: MainAxisSize.min, children: [ Container( - color: Colors.white, + color: widget.backgroundColor ?? Colors.white, height: 80.h, child: Row( children: _buildExpandRowList(), @@ -55,18 +58,19 @@ class _LockListGroupPageState extends State { widgetList.add(GestureDetector( child: Container( width: ScreenUtil().screenWidth, - color: Colors.white, + color: widget.backgroundColor ?? Colors.white, child: Row( children: [ SizedBox(width: 40.w), Text( widget.groupItem.groupName ?? '', - style: TextStyle(color: AppColors.blackColor, fontSize: 22.sp), + style: widget.textStyle ?? + TextStyle(color: AppColors.blackColor, fontSize: 22.sp), ), Expanded( child: SizedBox( - width: 10.w, - )), + width: 10.w, + )), AnimatedRotation( turns: _isExpanded ? -0.5 : 0, duration: _animationDuration, diff --git a/star_lock/lib/main/lockMian/lockList/lockList_page.dart b/star_lock/lib/main/lockMian/lockList/lockList_page.dart index 66f07890..38416753 100644 --- a/star_lock/lib/main/lockMian/lockList/lockList_page.dart +++ b/star_lock/lib/main/lockMian/lockList/lockList_page.dart @@ -10,7 +10,7 @@ import '../../../common/XSConstantMacro/XSConstantMacro.dart'; import '../../../tools/appRouteObserver.dart'; import '../../../tools/dateTool.dart'; import '../entity/lockListInfo_entity.dart'; -import 'lockListGroup_page.dart'; +import 'lockListGroup_view.dart'; import 'lockList_logic.dart'; class LockListPage extends StatefulWidget { @@ -58,7 +58,7 @@ class _LockListPageState extends State with RouteAware { //设备多层级列表 Widget _buildLockExpandedList(context, index, GroupList itemData) { List lockItemList = itemData.lockList ?? []; - return LockListGroupPage( + return LockListGroupView( onTap: () { //是否选中组 if (itemData.isChecked) { diff --git a/star_lock/lib/main/lockMian/lockList/lockList_xhj_page.dart b/star_lock/lib/main/lockMian/lockList/lockList_xhj_page.dart index b283e009..6bdd40b6 100644 --- a/star_lock/lib/main/lockMian/lockList/lockList_xhj_page.dart +++ b/star_lock/lib/main/lockMian/lockList/lockList_xhj_page.dart @@ -10,7 +10,7 @@ import '../../../common/XSConstantMacro/XSConstantMacro.dart'; import '../../../tools/appRouteObserver.dart'; import '../../../tools/dateTool.dart'; import '../entity/lockListInfo_entity.dart'; -import 'lockListGroup_page.dart'; +import 'lockListGroup_view.dart'; import 'lockList_logic.dart'; class LockListXHJPage extends StatefulWidget { @@ -36,259 +36,136 @@ class _LockListXHJPageState extends State with RouteAware { } groupDataList.addAll( widget.lockListInfoGroupEntity.groupList as Iterable); - - return Scaffold( - floatingActionButton: FloatingActionButton( - shape: const CircleBorder(), - onPressed: () { - Get.toNamed(Routers.selectLockTypePage); - }, - backgroundColor: AppColors.mainColor, - child: const Icon( - Icons.add, - color: AppColors.darkGrayTextColor, - ), + return SafeArea( + bottom: false, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Align( + alignment: Alignment.topRight, + child: IconButton( + onPressed: () { + Get.toNamed(Routers.selectLockTypePage); + }, + icon: Icon( + Icons.add_circle, + size: 48.w, + color: AppColors.mainColor, + )), + ), + Padding( + padding: EdgeInsets.only(left: 45.w), + child: Text( + '常用程序'.tr, + style: TextStyle( + fontSize: 32.sp, + color: AppColors.blackColor, + fontWeight: FontWeight.w600, + ), + ), + ), + Expanded( + child: ListView.separated( + itemCount: groupDataList.length, + itemBuilder: (context, index) { + GroupList itemData = groupDataList[index]; + return _buildLockExpandedList(context, index, itemData); + }, + shrinkWrap: true, + physics: const AlwaysScrollableScrollPhysics(), + separatorBuilder: (context, index) { + return const Divider( + height: 1, + color: AppColors.greyLineColor, + ); + }), + ), + ], ), - body: ListView.separated( - itemCount: groupDataList.length, - itemBuilder: (context, index) { - GroupList itemData = groupDataList[index]; - return _buildLockExpandedList(context, index, itemData); - }, - shrinkWrap: true, - physics: const AlwaysScrollableScrollPhysics(), - separatorBuilder: (context, index) { - return const Divider( - height: 1, - color: AppColors.greyLineColor, - ); - }), ); } //设备多层级列表 Widget _buildLockExpandedList(context, index, GroupList itemData) { List lockItemList = itemData.lockList ?? []; - return LockListGroupPage( - onTap: () { - //是否选中组 - if (itemData.isChecked) { - } else {} - setState(() {}); - }, - typeImgList: const [], - groupItem: itemData, - child: ListView.separated( - itemCount: lockItemList.length, + return LockListGroupView( + onTap: () { + setState(() {}); + }, + textStyle: TextStyle(fontSize: 28.sp, fontWeight: FontWeight.w600), + backgroundColor: Colors.transparent, + typeImgList: const [], + groupItem: itemData, + child: GridView.extent( + padding: EdgeInsets.symmetric(vertical: 15.h, horizontal: 15.w), + maxCrossAxisExtent: Get.width * .6, + childAspectRatio: 1.2, + crossAxisSpacing: 15.w, + mainAxisSpacing: 15.h, shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), - separatorBuilder: (context, index) { - return const Divider(height: 1, color: AppColors.greyLineColor); - }, - itemBuilder: (c, index) { - LockListInfoItemEntity keyInfo = lockItemList[index]; - bool isLast = false; - if (lockItemList.length == index + 1) { - isLast = true; - } + children: forItems(lockItemList), + )); + } - return Slidable( - key: ValueKey(keyInfo.keyId), - endActionPane: ActionPane( - extentRatio: 0.2, - motion: const ScrollMotion(), - children: [ - SlidableAction( - onPressed: (BuildContext context) { - state.lockListInfoItemEntity = keyInfo; - logic.deleyLockLogicOfRoles(); - }, - backgroundColor: Colors.red, - foregroundColor: Colors.white, - label: '删除'.tr, - padding: EdgeInsets.only(left: 5.w, right: 5.w), - ), - ], - ), - child: lockInfoListItem(keyInfo, isLast, () { - if ((keyInfo.keyType == XSConstantMacro.keyTypeTime || - keyInfo.keyType == XSConstantMacro.keyTypeLoop) && - (keyInfo.keyStatus == - XSConstantMacro.keyStatusWaitIneffective)) { - logic.showToast("您的钥匙未生效".tr); - return; - } - if ((keyInfo.keyType == XSConstantMacro.keyTypeTime || - keyInfo.keyType == XSConstantMacro.keyTypeLoop) && - (keyInfo.keyStatus == XSConstantMacro.keyStatusFrozen)) { - logic.showToast("您的钥匙已冻结".tr); - return; - } - if ((keyInfo.keyType == XSConstantMacro.keyTypeTime || - keyInfo.keyType == XSConstantMacro.keyTypeLoop) && - (keyInfo.keyStatus == XSConstantMacro.keyStatusExpired)) { - logic.showToast("您的钥匙已过期".tr); - return; - } - Get.toNamed(Routers.lockDetailMainPage, arguments: { - // "lockMainEntity": widget.lockMainEntity, - "keyInfo": keyInfo, - "isOnlyOneData": false, - }); - }), - ); - }), - ); + List forItems(List lockItemList) { + List list = []; + for (int i = 0, j = 0; i < lockItemList.length; i++, j++) { + LockListInfoItemEntity keyInfo = lockItemList[i]; + bool isLast = false; + if (lockItemList.length == i + 1) { + isLast = true; + } + list.add(Slidable( + key: ValueKey(keyInfo.keyId), + endActionPane: ActionPane( + extentRatio: 0.2, + motion: const ScrollMotion(), + children: [ + SlidableAction( + onPressed: (BuildContext context) { + state.lockListInfoItemEntity = keyInfo; + logic.deleyLockLogicOfRoles(); + }, + backgroundColor: Colors.red, + foregroundColor: Colors.white, + label: '删除'.tr, + padding: EdgeInsets.only(left: 5.w, right: 5.w), + ), + ], + ), + child: lockInfoListItem(keyInfo, isLast, () { + if ((keyInfo.keyType == XSConstantMacro.keyTypeTime || + keyInfo.keyType == XSConstantMacro.keyTypeLoop) && + (keyInfo.keyStatus == XSConstantMacro.keyStatusWaitIneffective)) { + logic.showToast("您的钥匙未生效".tr); + return; + } + if ((keyInfo.keyType == XSConstantMacro.keyTypeTime || + keyInfo.keyType == XSConstantMacro.keyTypeLoop) && + (keyInfo.keyStatus == XSConstantMacro.keyStatusFrozen)) { + logic.showToast("您的钥匙已冻结".tr); + return; + } + if ((keyInfo.keyType == XSConstantMacro.keyTypeTime || + keyInfo.keyType == XSConstantMacro.keyTypeLoop) && + (keyInfo.keyStatus == XSConstantMacro.keyStatusExpired)) { + logic.showToast("您的钥匙已过期".tr); + return; + } + Get.toNamed(Routers.lockDetailMainPage, arguments: { + "keyInfo": keyInfo, + "isOnlyOneData": false, + }); + }), + )); + } + return list; } Widget lockInfoListItem( LockListInfoItemEntity keyInfo, bool isLast, Function() action) { - return F.sw( - defaultCall: () => _defaultLockInfoListItem(keyInfo, isLast, action), - xhjCall: () => _xhjLockInfoListItem(keyInfo, isLast, action)); - } - - Widget _defaultLockInfoListItem( - LockListInfoItemEntity keyInfo, bool isLast, Function() action) { - return GestureDetector( - onTap: action, - child: Container( - // height: 122.h, - margin: isLast - ? EdgeInsets.only(left: 20.w, right: 20.w, top: 20.w, bottom: 20.w) - : EdgeInsets.only(left: 20.w, right: 20.w, top: 20.w), - decoration: BoxDecoration( - color: ((keyInfo.keyType == XSConstantMacro.keyTypeTime || - keyInfo.keyType == XSConstantMacro.keyTypeLoop) && - (keyInfo.keyStatus == - XSConstantMacro.keyStatusWaitIneffective || - keyInfo.keyStatus == XSConstantMacro.keyStatusFrozen || - keyInfo.keyStatus == XSConstantMacro.keyStatusExpired)) - ? AppColors.greyBackgroundColor - : Colors.white, - borderRadius: BorderRadius.circular(20.w), - ), - child: Column( - // mainAxisAlignment: MainAxisAlignment.center, - children: [ - SizedBox( - height: 20.h, - ), - Row( - children: [ - SizedBox(width: 30.w), - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - keyInfo.lockAlias!, - style: TextStyle( - fontSize: 24.sp, - fontWeight: FontWeight.w500, - color: keyInfo.passageMode == 1 - ? AppColors.openPassageModeColor - : AppColors.darkGrayTextColor), - ), - ], - ), - ), - SizedBox(width: 20.w), - Image.asset( - logic.showElectricIcon(keyInfo.electricQuantity!), - width: 30.w, - height: 24.w, - ), - SizedBox(width: 2.w), - Text( - "${keyInfo.electricQuantity!}%", - style: TextStyle( - fontSize: 18.sp, color: AppColors.darkGrayTextColor), - ), - SizedBox(width: 30.w), - ], - ), - SizedBox(height: 5.h), - Visibility( - visible: keyInfo.passageMode == 1 ? true : false, - child: Row( - children: [ - SizedBox(width: 30.w), - Container( - padding: EdgeInsets.only(right: 5.w, left: 5.w), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(5.w), - color: AppColors.openPassageModeColor, - ), - child: Text("常开模式开启".tr, - style: TextStyle( - fontSize: 18.sp, - color: AppColors.appBarIconColor)), - ), - ], - )), - SizedBox(height: 5.h), - Visibility( - visible: keyInfo.lockSetting!.remoteUnlock == 1 ? true : false, - child: Row( - children: [ - SizedBox(width: 30.w), - Text( - "远程开锁".tr, - style: TextStyle( - fontSize: 18.sp, color: AppColors.darkGrayTextColor), - ), - ], - )), - SizedBox(height: 20.h), - Visibility( - visible: ((keyInfo.keyType == XSConstantMacro.keyTypeTime || - keyInfo.keyType == XSConstantMacro.keyTypeLoop) && - (keyInfo.keyStatus == - XSConstantMacro.keyStatusWaitIneffective || - keyInfo.keyStatus == - XSConstantMacro.keyStatusFrozen || - keyInfo.keyStatus == - XSConstantMacro.keyStatusExpired)) - ? true - : false, - // visible: true, - child: Row( - children: [ - SizedBox(width: 30.w), - Container( - padding: EdgeInsets.only(right: 5.w, left: 5.w), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(5.w), - color: - DateTool().compareTimeIsOvertime(keyInfo.endDate!) - ? AppColors.listTimeYellowColor - : AppColors.mainColor, - ), - child: Text(logic.getKeyEffective(keyInfo), - style: TextStyle(fontSize: 18.sp, color: Colors.white) - // child: Text(logic.compareTimeIsOvertime(keyInfo.endDate!) ? "已过期" : "余${logic.compareTimeGetDaysFromNow(keyInfo.endDate!)}天", style: TextStyle(fontSize: 18.sp, color: Colors.white) - ), - ), - ], - )), - SizedBox(height: 5.h), - Row( - children: [ - SizedBox(width: 30.w), - Text( - "${logic.getUseKeyTypeStr(keyInfo.startDate, keyInfo.endDate, keyInfo.keyType)}/${keyInfo.isLockOwner == 1 ? '超级管理员'.tr : (keyInfo.keyRight == 1 ? "授权管理员".tr : "普通用户".tr)}", - style: TextStyle( - fontSize: 18.sp, color: AppColors.darkGrayTextColor), - ), - ], - ), - SizedBox(height: 20.h), - ], - ), - ), - ); + return _xhjLockInfoListItem(keyInfo, isLast, action); } Widget _xhjLockInfoListItem( @@ -296,10 +173,6 @@ class _LockListXHJPageState extends State with RouteAware { return GestureDetector( onTap: action, child: Container( - // height: 122.h, - margin: isLast - ? EdgeInsets.only(left: 20.w, right: 20.w, top: 20.w, bottom: 20.w) - : EdgeInsets.only(left: 20.w, right: 20.w, top: 20.w), decoration: BoxDecoration( color: ((keyInfo.keyType == XSConstantMacro.keyTypeTime || keyInfo.keyType == XSConstantMacro.keyTypeLoop) && @@ -308,13 +181,14 @@ class _LockListXHJPageState extends State with RouteAware { keyInfo.keyStatus == XSConstantMacro.keyStatusFrozen || keyInfo.keyStatus == XSConstantMacro.keyStatusExpired)) ? AppColors.greyBackgroundColor - : Colors.white, + : Colors.white.withOpacity(0.8), borderRadius: BorderRadius.circular(20.w), ), child: Padding( - padding: EdgeInsets.symmetric(horizontal: 30.w, vertical: 20.h), + padding: EdgeInsets.symmetric(horizontal: 30.w, vertical: 10.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, children: [ Row( children: [ @@ -324,29 +198,21 @@ class _LockListXHJPageState extends State with RouteAware { height: 32.r, color: AppColors.mainColor, ), - SizedBox( - width: 8.w, - ), - Expanded( - child: Text(keyInfo.lockAlias!, - style: TextStyle( - fontSize: 32.sp, - fontWeight: FontWeight.w500, - color: keyInfo.passageMode == 1 - ? AppColors.openPassageModeColor - : AppColors.darkGrayTextColor, - overflow: TextOverflow.ellipsis, - ), - maxLines: 1), - ), - Text( - logic.getUseKeyTypeStr( - keyInfo.startDate, keyInfo.endDate, keyInfo.keyType), - style: TextStyle( - fontSize: 18.sp, color: AppColors.darkGrayTextColor), - ) ], ), + SizedBox( + height: 15.h, + ), + Text(keyInfo.lockAlias!, + style: TextStyle( + fontSize: 32.sp, + fontWeight: FontWeight.w500, + color: keyInfo.passageMode == 1 + ? AppColors.openPassageModeColor + : AppColors.darkGrayTextColor, + overflow: TextOverflow.ellipsis, + ), + maxLines: 1), Visibility( visible: keyInfo.passageMode == 1 ? true : false, child: Padding( @@ -383,7 +249,6 @@ class _LockListXHJPageState extends State with RouteAware { ], ), )), - SizedBox(height: 20.h), Visibility( visible: ((keyInfo.keyType == XSConstantMacro.keyTypeTime || keyInfo.keyType == XSConstantMacro.keyTypeLoop) && @@ -443,10 +308,12 @@ class _LockListXHJPageState extends State with RouteAware { ], ), Text( - keyInfo.hwVersion ?? "", + Characters(logic.getUseKeyTypeStr( + keyInfo.startDate, keyInfo.endDate, keyInfo.keyType)) + .join('\u{200B}'), style: TextStyle( fontSize: 18.sp, color: AppColors.darkGrayTextColor), - ), + ) ], ), ), diff --git a/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart b/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart index ec382028..4e6fd7e8 100644 --- a/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart +++ b/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart @@ -114,6 +114,17 @@ class _StarLockMainPageState extends State with BaseWidget { body: child, ); } + child = F.sw( + defaultCall: () => child, + xhjCall: () => Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage('images/xhj_main_bg.jpg'), + fit: BoxFit.cover, + ), + ), + child: child, + )); return child; } diff --git a/star_lock/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart b/star_lock/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart index 364a7f92..191de81c 100644 --- a/star_lock/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart +++ b/star_lock/lib/main/lockMian/lockMain/xhj/lockMain_xhj_page.dart @@ -10,6 +10,7 @@ import 'package:star_lock/main/lockMian/lockMain/lockMain_page.dart'; import 'package:star_lock/main/lockMian/lockMain/xhj/lockMain_xhj_logic.dart'; import 'package:star_lock/mine/mall/lockMall_page.dart'; import 'package:star_lock/mine/message/messageList/messageList_page.dart'; +import 'package:star_lock/mine/message/messageList/messageList_xhj_page.dart'; import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart'; import 'package:star_lock/tools/noData.dart'; import 'package:star_lock/tools/submitBtn.dart'; @@ -40,43 +41,49 @@ class _StarLockMainXHJPageState extends State init: LockMainXHJLogic(), builder: (LockMainXHJLogic logic) { return Scaffold( - backgroundColor: const Color(0xFFF5F5F5), - body: SafeArea( - bottom: false, - child: Stack( - children: [ - pageView( - widget: StarLockMainPage( - showAppBar: false, - showDrawer: false, - ), - logic: logic, - index: 0, + backgroundColor: Colors.white, + body: Stack( + children: [ + pageView( + widget: StarLockMainPage( + showAppBar: false, + showDrawer: false, ), - pageView( - widget: LockMallPage( + logic: logic, + index: 0, + ), + pageView( + widget: SafeArea( + bottom: false, + child: LockMallPage( + allowReturn: false, + ), + ), + logic: logic, + index: 1, + ), + pageView( + widget: SafeArea( + bottom: false, + child: MessageListXHJPage( showAppBar: false, ), - logic: logic, - index: 1, ), - pageView( - widget: MessageListPage( - showAppBar: false, - ), - logic: logic, - index: 2, - ), - pageView( - widget: MinePersonInfoPage( + logic: logic, + index: 2, + ), + pageView( + widget: SafeArea( + bottom: false, + child: MinePersonInfoPage( showAppBar: false, showAbout: true, ), - logic: logic, - index: 3, ), - ], - ), + logic: logic, + index: 3, + ), + ], ), bottomNavigationBar: Container( padding: EdgeInsets.only(top: 20.h), @@ -93,11 +100,8 @@ class _StarLockMainXHJPageState extends State top: false, child: Row( children: [ - navigationBarItem( - Icons.key, - TranslationLoader.lanKeys!.device!.tr, - logic, - 0, () { + navigationBarItem(Icons.key, + TranslationLoader.lanKeys!.device!.tr, logic, 0, () { logic.setIndex(0); }), navigationBarItem(Icons.shopping_cart, '商城'.tr, logic, 1, diff --git a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart index d41b2ae9..e64a01fc 100644 --- a/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart +++ b/star_lock/lib/mine/addLock/nearbyLock/nearbyLock_logic.dart @@ -23,9 +23,10 @@ class NearbyLockLogic extends BaseGetXController { // 点击连接设备 void connect(String deviceName) { showEasyLoading(); - BlueManage().bludSendData(deviceName, - (BluetoothConnectionState state) async { + BlueManage().bludSendData(deviceName, (BluetoothConnectionState state) async { + AppLog.log("点击要添加的设备了"); if (state == BluetoothConnectionState.connected) { + AppLog.log("开始获取公钥"); IoSenderManage.getPublicKey(lockId: deviceName); } else if (state == BluetoothConnectionState.disconnected) { dismissEasyLoading(); @@ -58,12 +59,14 @@ class NearbyLockLogic extends BaseGetXController { switch (reply.status) { case 0x00: //成功 + AppLog.log("获取公钥成功"); // 储存公钥 var publicKey = reply.data.sublist(3); var saveStrList = changeIntListToStringList(publicKey); Storage.setStringList(saveBluePublicKey, saveStrList); // 获取私钥 + AppLog.log("开始获取私钥"); IoSenderManage.getPrivateKey( lockId: BlueManage().connectDeviceName, keyID: "1", @@ -73,6 +76,7 @@ class NearbyLockLogic extends BaseGetXController { needAuthor: 1); break; default: + AppLog.log("获取公钥失败"); break; } } @@ -80,6 +84,7 @@ class NearbyLockLogic extends BaseGetXController { Future _replyGetPrivateKeyKey(Reply reply) async { switch (reply.status) { case 0x00: + AppLog.log("获取私钥成功"); //成功 reply.data.removeAt(0); @@ -113,66 +118,66 @@ class NearbyLockLogic extends BaseGetXController { switch (status) { case 0x00: //成功 - + AppLog.log("获取锁状态成功"); // 厂商名称 var vendor = reply.data.sublist(3, 23); var vendorStr = utf8String(vendor); state.lockInfo["vendor"] = vendorStr; // state.lockInfo["vendor"] = "XL"; - AppLog.log("vendor:$vendor vendorStr:$vendorStr reply.data:${reply.data}"); + AppLog.log("厂商名称 vendor:$vendor vendorStr:$vendorStr reply.data:${reply.data}"); // 锁设备类型 var product = reply.data[23]; state.lockInfo["product"] = product; - // AppLog.log("product:$product"); + AppLog.log("锁设备类型 product:$product"); // 产品名称 var model = reply.data.sublist(24, 44); var modelStr = utf8String(model); state.lockInfo["model"] = modelStr; // state.lockInfo["model"] = "JL-BLE-01"; - // AppLog.log("model:$model modelStr:$modelStr modelStr:${modelStr.length}"); + AppLog.log("产品名称 mmodelStr:$modelStr"); // 软件版本 var fwVersion = reply.data.sublist(44, 64); var fwVersionStr = utf8String(fwVersion); state.lockInfo["fwVersion"] = fwVersionStr; - // AppLog.log("fwVersion:$fwVersion fwVersionStr:$fwVersionStr fwVersionStr:${fwVersionStr.length}"); + AppLog.log("软件版本 fwVersionStr:$fwVersionStr"); // 硬件版本 var hwVersion = reply.data.sublist(64, 84); var hwVersionStr = utf8String(hwVersion); state.lockInfo["hwVersion"] = hwVersionStr; - // AppLog.log("hwVersion:$hwVersion hwVersionStr:${hwVersionStr.length}"); + AppLog.log("硬件版本 hwVersionStr:$hwVersionStr"); // 厂商序列号 var serialNum0 = reply.data.sublist(84, 100); var serialNum0Str = utf8String(serialNum0); state.lockInfo["serialNum0"] = serialNum0Str; // state.lockInfo["serialNum0"] = "${DateTime.now().millisecondsSinceEpoch ~/ 10}"; + AppLog.log("厂商序列号 serialNum0Str:${serialNum0Str.length}"); // 成品商序列号 var serialNum1 = reply.data.sublist(100, 116); var serialNum1Str = utf8String(serialNum1); state.lockInfo["serialNum1"] = serialNum1Str; - // AppLog.log("serialNum1Str:$serialNum1Str serialNum1Str:${serialNum1Str.length}"); + AppLog.log("成品商序列号 serialNum1Str:$serialNum1Str"); // 蓝牙名称 var btDeviceName = reply.data.sublist(116, 132); var btDeviceNameStr = utf8String(btDeviceName); state.lockInfo["btDeviceName"] = btDeviceNameStr; - // AppLog.log("btDeviceName:$btDeviceName btDeviceNameStr:$btDeviceNameStr btDeviceNameStr:${btDeviceNameStr.length}"); + AppLog.log("蓝牙名称 btDeviceNameStr:$btDeviceNameStr"); // 电池剩余电量 var battRemCap = reply.data[132]; state.lockInfo["electricQuantity"] = battRemCap; - // AppLog.log("battRemCap:$battRemCap"); + AppLog.log("电池剩余电量 battRemCap:$battRemCap"); // 重置次数 var restoreCounter = reply.data.sublist(133, 135); - state.lockInfo["restoreCount"] = - restoreCounter[0] * 256 + restoreCounter[1]; - // AppLog.log("restoreCounter:$restoreCounter"); + state.lockInfo["restoreCount"] = restoreCounter[0] * 256 + restoreCounter[1]; + AppLog.log("重置次数 restoreCounter:${restoreCounter[0] * 256 + restoreCounter[1]}"); // 重置时间 var restoreDate = reply.data.sublist(135, 139); @@ -182,13 +187,13 @@ class NearbyLockLogic extends BaseGetXController { (0xFF & restoreDate[3])); // String restoreDateStr = DateTool().dateToYMDHNSString(restoreDateValue.toString()); state.lockInfo["restoreDate"] = restoreDateValue * 1000; - // AppLog.log("restoreDate:$restoreDate restoreDateValue:$restoreDateValue"); + AppLog.log("重置时间 restoreDateValue:$restoreDateValue"); // 主控芯片型号 var icPartNo = reply.data.sublist(139, 149); var icPartNoStr = utf8String(icPartNo); state.lockInfo["icPartNo"] = icPartNoStr; - // AppLog.log("icPartNo:$icPartNo icPartNoStr:$icPartNoStr"); + AppLog.log("主控芯片型号 icPartNoStr:$icPartNoStr"); // 有效时间 var indate = reply.data.sublist(149, 153); @@ -198,16 +203,19 @@ class NearbyLockLogic extends BaseGetXController { (0xFF & indate[3])); // String indateStr = DateTool().dateToYMDHNSString("$indateValue"); state.lockInfo["indate"] = indateValue * 1000; - // AppLog.log("indate:$indate indateValue:$indateValue"); + AppLog.log("有效时间 indateValue:$indateValue"); // mac地址 var macAddress = reply.data.sublist(153, 173); var macAddressStr = utf8String(macAddress); state.lockInfo["mac"] = macAddressStr; + AppLog.log("mac地址 macAddressStr:$macAddressStr"); var index = 173; // 锁特征值字符串长度 var featureValueLength = reply.data[173]; + AppLog.log("锁特征值字符串长度 featureValueLength:$featureValueLength"); + // 锁特征值说明(本机能支持的功能) // 获取到锁给的字符数组 var featureNetxLength = index + featureValueLength + 1; @@ -222,9 +230,12 @@ class NearbyLockLogic extends BaseGetXController { // List allFeatureValueTwoList = charListChangeIntList(featureValue); // AppLog.log("featureValueLength:$featureValueLength featureValue:$featureValue \n featureValueStr:$featureValueStr"); index = index + featureValueLength + 1; + AppLog.log("锁特征值字符串 featureValueStr:$featureValueStr"); // 使能特征值字符串长度 var featureEnValLength = reply.data[index]; + AppLog.log("使能特征值字符串长度 featureEnValLength:$featureEnValLength"); + // 使能锁特征值说明(本机启用的功能) var featureEnNextLength = index + featureEnValLength + 1; if (reply.data.length < featureEnNextLength) { @@ -238,13 +249,14 @@ class NearbyLockLogic extends BaseGetXController { // List allFeatureEnValTwoList = charListChangeIntList(featureEnVal); // AppLog.log("featureEnValLength:$featureEnValLength featureEnVal:$featureEnVal \n featureEnValStr:$featureEnValStr"); index = index + featureEnValLength + 1; + AppLog.log("使能锁特征值说明 featureEnValStr:$featureEnValStr"); // 支持的带参数特征值的总条目数 // var featureParaTotal = reply.data[index]; var featureParaTotalList = reply.data.sublist(index); state.featureSettingParams = featureParaTotalList; - // AppLog.log("featureParaTotalList:$featureParaTotalList"); + AppLog.log("featureParaTotalList:$featureParaTotalList"); Get.toNamed(Routers.lockAddressGaoDePage, arguments: { "pwdTimestamp": state.timestampValue * 1000, @@ -257,8 +269,6 @@ class NearbyLockLogic extends BaseGetXController { break; case 0x06: //无权限 - AppLog.log("${reply.commandType}需要鉴权"); - var privateKey = await Storage.getStringList(saveBluePrivateKey); List getPrivateKeyList = changeStringListToIntList(privateKey!); // IoSenderManage.senderGetLockStatu( @@ -276,7 +286,6 @@ class NearbyLockLogic extends BaseGetXController { break; default: //失败 - AppLog.log("${reply.commandType}失败"); break; } } @@ -299,10 +308,11 @@ class NearbyLockLogic extends BaseGetXController { // 获取锁状态 Future _getStarLockStatus() async { // 进来之后首先连接 - BlueManage().bludSendData(BlueManage().connectDeviceName, - (BluetoothConnectionState state) async { - if (state == BluetoothConnectionState.connected) { - dismissEasyLoading(); + // BlueManage().bludSendData(BlueManage().connectDeviceName, (BluetoothConnectionState state) async { + // if (state == BluetoothConnectionState.connected) { + // dismissEasyLoading(); + + AppLog.log("开始获取锁状态"); var privateKey = await Storage.getStringList(saveBluePrivateKey); List getPrivateKeyList = changeStringListToIntList(privateKey!); // IoSenderManage.senderGetLockStatu( @@ -316,10 +326,10 @@ class NearbyLockLogic extends BaseGetXController { isBeforeAddUser: true, privateKey: getPrivateKeyList, ); - } else if (state == BluetoothConnectionState.disconnected) { - dismissEasyLoading(); - } - }, isAddEquipment: true); + // } else if (state == BluetoothConnectionState.disconnected) { + // dismissEasyLoading(); + // } + // }, isAddEquipment: true); } // late StreamSubscription>_scanListDiscoveredDeviceSubscription; diff --git a/star_lock/lib/mine/addLock/selectLockType/selectLockType_logic.dart b/star_lock/lib/mine/addLock/selectLockType/selectLockType_logic.dart new file mode 100644 index 00000000..6e2e5d1a --- /dev/null +++ b/star_lock/lib/mine/addLock/selectLockType/selectLockType_logic.dart @@ -0,0 +1,29 @@ + +import 'package:star_lock/tools/baseGetXController.dart'; +import 'package:star_lock/tools/commonDataManage.dart'; +import '../../../network/api_repository.dart'; +import 'selectLockType_state.dart'; + +class SelectLockTypeLogic extends BaseGetXController { + SelectLockTypeState state = SelectLockTypeState(); + + void getServerDatetime() async{ + var entity = await ApiRepository.to.getServerDatetimeData( + lockId: CommonDataManage().currentKeyInfo.lockId.toString(), + ); + if(entity.errorCode!.codeIsSuccessful){ + } + } + + @override + void onInit() { + super.onInit(); + + getServerDatetime(); + } + + @override + void onClose() { + super.onClose(); + } +} \ No newline at end of file diff --git a/star_lock/lib/mine/addLock/selectLockType/selectLockType_page.dart b/star_lock/lib/mine/addLock/selectLockType/selectLockType_page.dart index bbce8288..eac43537 100644 --- a/star_lock/lib/mine/addLock/selectLockType/selectLockType_page.dart +++ b/star_lock/lib/mine/addLock/selectLockType/selectLockType_page.dart @@ -1,18 +1,15 @@ -import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; -import 'package:permission_handler/permission_handler.dart'; import 'package:star_lock/flavors.dart'; -import 'package:star_lock/tools/appFirstEnterHandle.dart'; -import 'package:star_lock/tools/storage.dart'; import '../../../appRouters.dart'; import '../../../app_settings/app_colors.dart'; import '../../../baseWidget.dart'; import '../../../tools/titleAppBar.dart'; import '../../../translations/trans_lib.dart'; +import 'selectLockType_logic.dart'; class SelectLockTypePage extends StatefulWidget { const SelectLockTypePage({Key? key}) : super(key: key); @@ -21,8 +18,10 @@ class SelectLockTypePage extends StatefulWidget { State createState() => _SelectLockTypePageState(); } -class _SelectLockTypePageState extends State - with BaseWidget { +class _SelectLockTypePageState extends State with BaseWidget { + final logic = Get.put(SelectLockTypeLogic()); + final state = Get.find().state; + @override Widget build(BuildContext context) { return Scaffold( diff --git a/star_lock/lib/mine/addLock/selectLockType/selectLockType_state.dart b/star_lock/lib/mine/addLock/selectLockType/selectLockType_state.dart new file mode 100644 index 00000000..6efeb4ce --- /dev/null +++ b/star_lock/lib/mine/addLock/selectLockType/selectLockType_state.dart @@ -0,0 +1,6 @@ + + + +class SelectLockTypeState{ + +} \ No newline at end of file diff --git a/star_lock/lib/mine/mall/lockMall_logic.dart b/star_lock/lib/mine/mall/lockMall_logic.dart index f7f61251..1532c65e 100644 --- a/star_lock/lib/mine/mall/lockMall_logic.dart +++ b/star_lock/lib/mine/mall/lockMall_logic.dart @@ -17,7 +17,7 @@ class LockMallLogic extends BaseGetXController { late LockMallState state; LockMallLogic({required bool allowReturn}) - : state = LockMallState(allowReturn: allowReturn); + : state = LockMallState(allowReturn: allowReturn ); //获取商城跳转地址 Future getMallURLRequest() async { @@ -35,6 +35,7 @@ class LockMallLogic extends BaseGetXController { }, onPageFinished: (String url) { state.webProgress.value = 1.0; + refreshGoBack(); }, onWebResourceError: (WebResourceError error) {}, onNavigationRequest: (NavigationRequest request) async { @@ -99,12 +100,25 @@ class LockMallLogic extends BaseGetXController { bool canGoBack = await state.mallWebView.canGoBack(); if (canGoBack) { await state.mallWebView.goBack(); - } else { - if (state.allowReturn) Get.back(); + } else if (state.allowReturn) { + Get.back(); } + refreshGoBack(); return false; } + //刷新当前路由状态 + void refreshGoBack(){ + //如果属于一直返回按钮,则根据是否有路由可以回退刷新 + if(state.allowReturn){ + return; + } + state.mallWebView.canGoBack().then((value) { + state.canGoBack = value; + update(); + }); + } + @override Future onReady() async { super.onReady(); diff --git a/star_lock/lib/mine/mall/lockMall_page.dart b/star_lock/lib/mine/mall/lockMall_page.dart index 6d648536..0a123dbb 100644 --- a/star_lock/lib/mine/mall/lockMall_page.dart +++ b/star_lock/lib/mine/mall/lockMall_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; +import 'package:star_lock/flavors.dart'; import 'package:star_lock/mine/mall/lockMall_logic.dart'; import 'package:star_lock/tools/titleAppBar.dart'; import 'package:webview_flutter/webview_flutter.dart'; @@ -30,36 +31,46 @@ class _LockMallPageState extends State { return GetBuilder( init: LockMallLogic(allowReturn: widget.allowReturn), builder: (LockMallLogic logic) { - return PopScope( - onPopInvoked: logic.canGoBack, - canPop: false, - child: Scaffold( - resizeToAvoidBottomInset: false, - backgroundColor: const Color(0xFFFFFFFF), - appBar: widget.showAppBar - ? TitleAppBar( - barTitle: getWebTitle(logic), - haveBack: true, - backgroundColor: AppColors.mainColor, - ) - : null, - body: Obx(() => Column( - children: [ - Container( - padding: EdgeInsets.only(bottom: 10.w), - child: LinearProgressIndicator( - value: logic.state.webProgress.value, - backgroundColor: Colors.grey, - valueColor: AlwaysStoppedAnimation( - AppColors.mainColor), - ), - ), - Expanded( - child: WebViewWidget( - controller: logic.state.mallWebView), - ), - ], - ))), + return Scaffold( + resizeToAvoidBottomInset: false, + backgroundColor: const Color(0xFFFFFFFF), + appBar: widget.showAppBar + ? TitleAppBar( + barTitle: getWebTitle(logic), + haveBack: logic.state.canGoBack || logic.state.allowReturn, + backgroundColor: F.sw( + defaultCall: () => AppColors.mainColor, + xhjCall: () => Colors.white), + titleColor: F.sw( + defaultCall: () => null, + xhjCall: () => AppColors.blackColor), + iconColor: F.sw( + defaultCall: () => null, + xhjCall: () => AppColors.blackColor), + backAction: () => logic.canGoBack(false), + ) + : null, + body: Obx(() => Column( + children: [ + PopScope( + onPopInvoked: logic.canGoBack, + canPop: false, + child: SizedBox(), + ), + Container( + padding: EdgeInsets.only(bottom: 10.w), + child: LinearProgressIndicator( + value: logic.state.webProgress.value, + backgroundColor: Colors.grey, + valueColor: + AlwaysStoppedAnimation(AppColors.mainColor), + ), + ), + Expanded( + child: WebViewWidget(controller: logic.state.mallWebView), + ), + ], + )), ); }); } diff --git a/star_lock/lib/mine/mall/lockMall_state.dart b/star_lock/lib/mine/mall/lockMall_state.dart index a9636f15..9864ccc7 100644 --- a/star_lock/lib/mine/mall/lockMall_state.dart +++ b/star_lock/lib/mine/mall/lockMall_state.dart @@ -9,6 +9,7 @@ class LockMallState { var lockMallUrl = "".obs; var webProgress = 0.0.obs; bool allowReturn; + bool canGoBack = false; late WebViewController mallWebView = initWebViewController(); //初始化webView控制器 diff --git a/star_lock/lib/mine/message/messageList/messageList_xhj_page.dart b/star_lock/lib/mine/message/messageList/messageList_xhj_page.dart new file mode 100644 index 00000000..9d89898a --- /dev/null +++ b/star_lock/lib/mine/message/messageList/messageList_xhj_page.dart @@ -0,0 +1,235 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/tools/noData.dart'; + +import '../../../appRouters.dart'; +import '../../../app_settings/app_colors.dart'; +import '../../../tools/EasyRefreshTool.dart'; +import '../../../tools/dateTool.dart'; +import '../../../tools/showTipView.dart'; +import '../../../tools/storage.dart'; +import '../../../tools/titleAppBar.dart'; +import '../../../translations/trans_lib.dart'; +import 'messageList_entity.dart'; +import 'messageList_logic.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; + +class MessageListXHJPage extends StatefulWidget { + MessageListXHJPage({Key? key, this.showAppBar = true}) : super(key: key); + bool showAppBar; + + @override + State createState() => _MessageListXHJPageState(); +} + +class _MessageListXHJPageState extends State + with TickerProviderStateMixin { + final logic = Get.put(MessageListLogic()); + final state = Get.find().state; + + void getHttpData() { + logic.messageListDataRequest().then((MessageListEntity value) { + setState(() {}); + }); + } + + @override + void initState() { + super.initState(); + + getHttpData(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + appBar: widget.showAppBar + ? TitleAppBar( + barTitle: TranslationLoader.lanKeys!.message!.tr, + haveBack: true, + actionsList: [ + TextButton( + child: Text( + "清空".tr, + style: TextStyle(color: Colors.white, fontSize: 24.sp), + ), + onPressed: () async { + var isDemoMode = await Storage.getBool(ifIsDemoModeOrNot); + if (isDemoMode == false) { + ShowTipView().showIosTipWithContentDialog("是否清空?".tr, + () async { + logic.deletAllMessageDataRequest(); + }); + } else { + logic.showToast("演示模式".tr); + } + }, + ), + ], + backgroundColor: AppColors.mainColor) + : null, + body: Column( + children: [ + Container( + width: 1.sw, + height: 0.2.sw, + margin: EdgeInsets.symmetric(horizontal: 15.w), + padding: EdgeInsets.symmetric(horizontal: 25.w), + decoration: BoxDecoration( + image: const DecorationImage( + image: AssetImage('images/xhj_main_bg.jpg'), + fit: BoxFit.cover, + ), + borderRadius: BorderRadius.circular(20.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + offset: const Offset(0, 0), + blurRadius: 10.r, + spreadRadius: 0, + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + '智能分析', + style: TextStyle( + color: AppColors.blackColor, + fontSize: 28.sp, + fontWeight: FontWeight.w600, + ), + ), + Text( + '精准识别设备事件,过滤无效信息', + style: TextStyle( + color: AppColors.blackColor.withOpacity(0.6), + fontSize: 20.sp, + fontWeight: FontWeight.w600, + ), + ), + ], + ), + ), + Expanded( + child: EasyRefreshTool(onRefresh: () { + logic.pageNo = 1; + getHttpData(); + }, onLoad: () { + getHttpData(); + }, child: Obx(() { + return state.itemDataList.isEmpty + ? NoData() + : SlidableAutoCloseBehavior( + child: ListView.builder( + itemCount: state.itemDataList.length, + padding: EdgeInsets.only(top: 20.h), + itemBuilder: (c, index) { + MessageItemEntity messageItemEntity = + state.itemDataList[index]; + return Slidable( + key: ValueKey(messageItemEntity.id), + endActionPane: ActionPane( + extentRatio: 0.2, + motion: const ScrollMotion(), + children: [ + SlidableAction( + onPressed: (BuildContext context) { + logic.deletMessageDataRequest( + messageItemEntity.id!, () { + logic.pageNo = 1; + getHttpData(); + }); + }, + backgroundColor: Colors.red, + foregroundColor: Colors.white, + label: '删除'.tr, + padding: + EdgeInsets.only(left: 5.w, right: 5.w), + ), + ], + ), + child: _messageListItem(messageItemEntity, () { + Get.toNamed(Routers.messageDetailPage, + arguments: { + "messageItemEntity": messageItemEntity + }); + }), + ); + }), + ); + })), + ), + ], + ), + ); + } + + Widget _messageListItem( + MessageItemEntity messageItemEntity, Function() action) { + bool isNotRead = messageItemEntity.readAt! == 0; + return GestureDetector( + onTap: action, + child: Container( + margin: EdgeInsets.symmetric(vertical: 12.h, horizontal: 15.w), + padding: EdgeInsets.symmetric(vertical: 20.h, horizontal: 20.w), + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20.w), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + offset: const Offset(0, 0), + blurRadius: 10.r, + spreadRadius: 0, + ), + ], + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + isNotRead ? 'images/news_not_read.png' : 'images/news_read.png', + width: 48.r, + height: 48.r), + SizedBox(width: 15.w), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + messageItemEntity.data!, + maxLines: 1, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.start, + style: TextStyle( + fontSize: 22.sp, + color: messageItemEntity.readAt! == 0 + ? AppColors.blackColor + : AppColors.placeholderTextColor), + ), + SizedBox( + height: 5.h, + ), + Text( + DateTool().dateToYMDHNString( + messageItemEntity.createdAt!.toString()), + style: TextStyle( + fontSize: 18.sp, + color: messageItemEntity.readAt! == 0 + ? AppColors.blackColor + : AppColors.placeholderTextColor)), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart index cfcade93..b61e14f1 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_page.dart @@ -39,175 +39,215 @@ class _MinePersonInfoPageState extends State { : null, body: Column( children: [ - Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.avatar!.tr, - rightTitle: "", - allHeight: 100.h, - isHaveLine: true, - isHaveDirection: true, - isHaveRightWidget: true, - rightWidget: ClipRRect( - borderRadius: BorderRadius.circular(36.w), - child: CustomNetworkImage( - url: state.headUrl.value, - defaultUrl: 'images/controls_user.png', - width: 72.w, - height: 72.w), + Container( + width: 1.sw, + height: 0.2.sw, + margin: EdgeInsets.symmetric(horizontal: 15.w), + padding: EdgeInsets.symmetric(horizontal: 25.w), + decoration: BoxDecoration( + image: const DecorationImage( + image: AssetImage('images/xhj_main_bg.jpg'), + fit: BoxFit.cover, + ), + borderRadius: BorderRadius.circular(20.r), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.15), + offset: const Offset(0, 0), + blurRadius: 10.r, + spreadRadius: 0, ), - action: () async { - _openModalBottomSheet(); - }, - )), - Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.nickName!.tr, - rightTitle: state.mineInfoData.value.nickname != null - ? state.mineInfoData.value.nickname! - : "", - isHaveLine: true, - isHaveDirection: true, - action: () { - Navigator.pushNamed( - context, Routers.minePersonInfoEditNamePage, - arguments: {'mineInfoData': state.mineInfoData.value}) - .then((value) => logic.getUserInfoRequest()); - })), - Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.mobileNumber!.tr, - rightTitle: state.mineInfoData.value.mobile != null - ? state.mineInfoData.value.mobile! - : TranslationLoader.lanKeys!.goBind!.tr, - isHaveLine: true, - isHaveDirection: true, - action: () { - //有手机号 则去修改手机号 否则去绑定新的手机号 isFrom:1 短信,2 邮箱 - if (state.mineInfoData.value.mobile!.isNotEmpty) { - Navigator.pushNamed( - context, Routers.mineUnbindPhoneOrEmailPage, - arguments: { - 'mobile': state.mineInfoData.value.mobile!, - 'isFrom': '1' - }).then((value) => logic.getUserInfoRequest()); - } else { - Navigator.pushNamed( - context, Routers.mineBindPhoneOrEmailPage, arguments: { - 'mobile': state.mineInfoData.value.mobile!, - 'isFrom': '1' - }).then((value) => logic.getUserInfoRequest()); - } - })), - Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.email!.tr, - rightTitle: state.mineInfoData.value.email != null - ? state.mineInfoData.value.email! - : TranslationLoader.lanKeys!.goBind!.tr, - isHaveLine: true, - isHaveDirection: true, - action: () { - //有邮箱 则去修改邮箱 否则去绑定新的邮箱 isFrom:1 短信,2 邮箱 - if (state.mineInfoData.value.email!.isNotEmpty) { - Navigator.pushNamed( - context, Routers.mineUnbindPhoneOrEmailPage, - arguments: { - 'isFrom': '2', - 'email': state.mineInfoData.value.email! - }).then((value) => logic.getUserInfoRequest()); - } else { - Navigator.pushNamed( - context, Routers.mineBindPhoneOrEmailPage, arguments: { - 'isFrom': '2', - 'email': state.mineInfoData.value.email! - }).then((value) => logic.getUserInfoRequest()); - } - })), - CommonItem( - leftTitel: TranslationLoader.lanKeys!.resetPasswords!.tr, - rightTitle: "", - isHaveLine: true, - isHaveDirection: true, - action: () { - Navigator.pushNamed( - context, Routers.minePersonInfoResetPasswordPage); - }), - Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.safetyProblem!.tr, - rightTitle: state.mineInfoData.value.haveSafeAnswer == 0 - ? "去设置".tr - : "", - isHaveLine: true, - isHaveDirection: true, - action: () { - if (state.mineInfoData.value.haveSafeAnswer == 0) { - Navigator.pushNamed( - context, Routers.minePersonInfoSetSafetyProblemPage) - .then((value) => logic.getUserInfoRequest()); - } else { - Navigator.pushNamed( - context, Routers.minePersonInfoViewSafetyProblemPage); - } - })), - Obx(() => CommonItem( - leftTitel: TranslationLoader.lanKeys!.countryAndRegion!.tr, - rightTitle: state.mineInfoData.value.countryName != null - ? state.mineInfoData.value.countryName! - : "", - isHaveLine: true, - isHaveDirection: false)), - if (F.isLite == false && widget.showAbout) - CommonItem( - leftTitel: TranslationLoader.lanKeys!.valueAddedServices!.tr, - isHaveLine: true, - isHaveDirection: true, - action: () { - Get.back(); - Get.toNamed(Routers.valueAddedServicesPage); - }, + ], ), - if (widget.showAbout) - CommonItem( - leftTitel: TranslationLoader.lanKeys!.set!.tr, - isHaveLine: true, - isHaveDirection: true, - action: () { - Get.back(); - Get.toNamed(Routers.mineSetPage); - }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + '系统设置', + style: TextStyle( + color: AppColors.blackColor, + fontSize: 28.sp, + fontWeight: FontWeight.w600, + ), + ), + Text( + '系统的全局配置在此项内进行设置', + style: TextStyle( + color: AppColors.blackColor.withOpacity(0.6), + fontSize: 20.sp, + fontWeight: FontWeight.w600, + ), + ), + ], ), - if (widget.showAbout) - CommonItem( - leftTitel: TranslationLoader.lanKeys!.about!.tr, - isHaveLine: false, - isHaveDirection: true, - action: () { - Get.back(); - Get.toNamed(Routers.aboutPage); - }, + ), + SizedBox( + height: 20.h, + ), + Container( + margin: EdgeInsets.symmetric(vertical: 10.h, horizontal: 15.w), + child: ClipRRect( + borderRadius: BorderRadius.circular(20.r), + child: Column( + children: [ + Obx(() => CommonItem( + leftTitel: TranslationLoader.lanKeys!.avatar!.tr, + rightTitle: "", + allHeight: 100.h, + isHaveLine: true, + isHaveDirection: true, + isHaveRightWidget: true, + rightWidget: ClipRRect( + borderRadius: BorderRadius.circular(36.w), + child: CustomNetworkImage( + url: state.headUrl.value, + defaultUrl: 'images/controls_user.png', + width: 72.w, + height: 72.w), + ), + action: () async { + _openModalBottomSheet(); + }, + )), + Obx(() => CommonItem( + leftTitel: TranslationLoader.lanKeys!.nickName!.tr, + rightTitle: state.mineInfoData.value.nickname != null + ? state.mineInfoData.value.nickname! + : "", + isHaveLine: true, + isHaveDirection: true, + action: () { + Navigator.pushNamed( + context, Routers.minePersonInfoEditNamePage, + arguments: { + 'mineInfoData': state.mineInfoData.value + }).then((value) => logic.getUserInfoRequest()); + })), + Obx(() => CommonItem( + leftTitel: TranslationLoader.lanKeys!.mobileNumber!.tr, + rightTitle: state.mineInfoData.value.mobile != null + ? state.mineInfoData.value.mobile! + : TranslationLoader.lanKeys!.goBind!.tr, + isHaveLine: true, + isHaveDirection: true, + action: () { + //有手机号 则去修改手机号 否则去绑定新的手机号 isFrom:1 短信,2 邮箱 + if (state.mineInfoData.value.mobile!.isNotEmpty) { + Navigator.pushNamed( + context, Routers.mineUnbindPhoneOrEmailPage, + arguments: { + 'mobile': state.mineInfoData.value.mobile!, + 'isFrom': '1' + }).then((value) => logic.getUserInfoRequest()); + } else { + Navigator.pushNamed( + context, Routers.mineBindPhoneOrEmailPage, + arguments: { + 'mobile': state.mineInfoData.value.mobile!, + 'isFrom': '1' + }).then((value) => logic.getUserInfoRequest()); + } + })), + Obx(() => CommonItem( + leftTitel: TranslationLoader.lanKeys!.email!.tr, + rightTitle: state.mineInfoData.value.email != null + ? state.mineInfoData.value.email! + : TranslationLoader.lanKeys!.goBind!.tr, + isHaveLine: true, + isHaveDirection: true, + action: () { + //有邮箱 则去修改邮箱 否则去绑定新的邮箱 isFrom:1 短信,2 邮箱 + if (state.mineInfoData.value.email!.isNotEmpty) { + Navigator.pushNamed( + context, Routers.mineUnbindPhoneOrEmailPage, + arguments: { + 'isFrom': '2', + 'email': state.mineInfoData.value.email! + }).then((value) => logic.getUserInfoRequest()); + } else { + Navigator.pushNamed( + context, Routers.mineBindPhoneOrEmailPage, + arguments: { + 'isFrom': '2', + 'email': state.mineInfoData.value.email! + }).then((value) => logic.getUserInfoRequest()); + } + })), + CommonItem( + leftTitel: + TranslationLoader.lanKeys!.resetPasswords!.tr, + rightTitle: "", + isHaveLine: true, + isHaveDirection: true, + action: () { + Navigator.pushNamed( + context, Routers.minePersonInfoResetPasswordPage); + }), + Obx(() => CommonItem( + leftTitel: TranslationLoader.lanKeys!.safetyProblem!.tr, + rightTitle: state.mineInfoData.value.haveSafeAnswer == 0 + ? "去设置".tr + : "", + isHaveLine: true, + isHaveDirection: true, + action: () { + if (state.mineInfoData.value.haveSafeAnswer == 0) { + Navigator.pushNamed(context, + Routers.minePersonInfoSetSafetyProblemPage) + .then((value) => logic.getUserInfoRequest()); + } else { + Navigator.pushNamed(context, + Routers.minePersonInfoViewSafetyProblemPage); + } + })), + Obx(() => CommonItem( + leftTitel: + TranslationLoader.lanKeys!.countryAndRegion!.tr, + rightTitle: state.mineInfoData.value.countryName != null + ? state.mineInfoData.value.countryName! + : "", + isHaveLine: true, + isHaveDirection: false)), + if (F.isLite == false && widget.showAbout) + CommonItem( + leftTitel: + TranslationLoader.lanKeys!.valueAddedServices!.tr, + isHaveLine: true, + isHaveDirection: true, + action: () { + Get.back(); + Get.toNamed(Routers.valueAddedServicesPage); + }, + ), + if (widget.showAbout) + CommonItem( + leftTitel: TranslationLoader.lanKeys!.set!.tr, + isHaveLine: true, + isHaveDirection: true, + action: () { + Get.back(); + Get.toNamed(Routers.mineSetPage); + }, + ), + if (widget.showAbout) + CommonItem( + leftTitel: TranslationLoader.lanKeys!.about!.tr, + isHaveLine: false, + isHaveDirection: true, + action: () { + Get.back(); + Get.toNamed(Routers.aboutPage); + }, + ), + ], + ), ), + ), ], )); } - // 显示权限被永久拒绝的提示对话框 - // void showPermissionDeniedDialog() { - // showDialog( - // context: context, - // builder: (BuildContext context) { - // return AlertDialog( - // title: const Text('权限被拒绝'), - // content: const Text('请手动在系统设置中开启相册权限以继续使用应用。'), - // actions: [ - // TextButton( - // child: const Text('去设置'), - // onPressed: () { - // Navigator.of(context).pop(); // 关闭对话框 - // openAppSettings(); // 打开系统设置页面 - // }, - // ), - // ], - // ); - // }, - // ); - // } - Future _openModalBottomSheet() async { showModalBottomSheet( context: context, diff --git a/star_lock/lib/network/api_provider.dart b/star_lock/lib/network/api_provider.dart index 1688a34a..897754eb 100644 --- a/star_lock/lib/network/api_provider.dart +++ b/star_lock/lib/network/api_provider.dart @@ -784,7 +784,9 @@ class ApiProvider extends BaseProvider { getServerDatetimeUrl.toUrl, jsonEncode({ 'lockId': lockId, - })); + }), + isUnShowLoading: true + ); // 锁诊断 Future setLockDiagnoseData( diff --git a/star_lock/lib/tools/commonItem.dart b/star_lock/lib/tools/commonItem.dart index 9b785898..3cf2bf79 100644 --- a/star_lock/lib/tools/commonItem.dart +++ b/star_lock/lib/tools/commonItem.dart @@ -83,7 +83,7 @@ class CommonItem extends StatelessWidget { ), ], ), - isHaveDirection! ? SizedBox(width: 3.w) : Container(), + isHaveDirection! ? SizedBox(width: 15.w) : Container(), isHaveDirection! ? Image.asset( 'images/icon_right_grey.png', diff --git a/star_lock/lib/tools/titleAppBar.dart b/star_lock/lib/tools/titleAppBar.dart index 587a9c4b..57c8265f 100644 --- a/star_lock/lib/tools/titleAppBar.dart +++ b/star_lock/lib/tools/titleAppBar.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:star_lock/app_settings/app_colors.dart'; +import 'package:star_lock/flavors.dart'; class TitleAppBar extends AppBar { @override @@ -42,7 +44,7 @@ class _TitleAppBarState extends State { elevation: 0, leading: widget.haveOtherLeftWidget! ? widget.leftWidget - : (widget.haveBack! + : (widget.haveBack ?? false ? IconButton( icon: Icon(Icons.arrow_back_ios, color: widget.iconColor ?? Colors.white), @@ -50,13 +52,12 @@ class _TitleAppBarState extends State { if (widget.backAction != null) { widget.backAction!(); } else { - if(EasyLoading.isShow){ + if (EasyLoading.isShow) { EasyLoading.dismiss(); } Navigator.pop(context); } - } - ) + }) : Container()), backgroundColor: widget.backgroundColor ?? Colors.white, title: widget.haveTitleWidget!