From f04adc5db5600a395fb35f4e104b2c3c4467c9ca Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Sun, 28 Apr 2024 09:05:24 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat:=E4=BF=AE=E6=94=B9=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/lockMian/lockList/lockList_page.dart | 179 +++++++++--------- .../main/lockMian/lockMain/lockMain_page.dart | 4 + .../lockMain/xhj/lockMain_xhj_page.dart | 45 +++-- 3 files changed, 120 insertions(+), 108 deletions(-) diff --git a/star_lock/lib/main/lockMian/lockList/lockList_page.dart b/star_lock/lib/main/lockMian/lockList/lockList_page.dart index 34da7623..109711b2 100644 --- a/star_lock/lib/main/lockMian/lockList/lockList_page.dart +++ b/star_lock/lib/main/lockMian/lockList/lockList_page.dart @@ -1,4 +1,3 @@ - import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; @@ -16,7 +15,8 @@ import 'lockList_logic.dart'; class LockListPage extends StatefulWidget { final LockListInfoGroupEntity lockListInfoGroupEntity; - const LockListPage({Key? key, required this.lockListInfoGroupEntity}) : super(key: key); + const LockListPage({Key? key, required this.lockListInfoGroupEntity}) + : super(key: key); @override State createState() => _LockListPageState(); @@ -30,44 +30,41 @@ class _LockListPageState extends State with RouteAware { @override Widget build(BuildContext context) { - if(widget.lockListInfoGroupEntity.pageNo == 1){ + if (widget.lockListInfoGroupEntity.pageNo == 1) { groupDataList = []; } - groupDataList.addAll(widget.lockListInfoGroupEntity.groupList as Iterable); + groupDataList.addAll( + widget.lockListInfoGroupEntity.groupList as Iterable); - return ListView.separated( - itemCount: groupDataList.length, - itemBuilder: (context, index) { - GroupList itemData = groupDataList[index]; - return _buildLockExpandedList(context, index, itemData); + return Scaffold( + floatingActionButton: FloatingActionButton( + shape: const CircleBorder(), + onPressed: () { + Get.toNamed(Routers.addLockPage); }, - shrinkWrap: true, - physics:const AlwaysScrollableScrollPhysics(), - separatorBuilder: (context, index) { - return const Divider( - height: 1, - color: AppColors.greyLineColor, - ); - }); + backgroundColor: AppColors.mainColor, + child: const Icon( + Icons.add, + color: AppColors.darkGrayTextColor, + ), + ), + 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 _buildListView(BuildContext context, List itemList) { - // return ListView.separated( - // itemCount: itemList.length, - // itemBuilder: (context, index) { - // GroupList itemData = itemList[index]; - // return _buildLockExpandedList(context, index, itemData); - // }, - // shrinkWrap: true, - // separatorBuilder: (context, index) { - // return const Divider( - // height: 1, - // color: AppColors.greyLineColor, - // ); - // }); - // } - //设备多层级列表 Widget _buildLockExpandedList(context, index, GroupList itemData) { List lockItemList = itemData.lockList ?? []; @@ -77,10 +74,7 @@ class _LockListPageState extends State with RouteAware { // clickIndex = index; //是否选中组 if (itemData.isChecked) { - - }else{ - - } + } else {} setState(() {}); }, typeImgList: const [], @@ -88,25 +82,25 @@ class _LockListPageState extends State with RouteAware { child: ListView.separated( itemCount: lockItemList.length, shrinkWrap: true, - physics:const NeverScrollableScrollPhysics(), + 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){ + if (lockItemList.length == index + 1) { isLast = true; } return Slidable( - key:ValueKey(keyInfo.keyId), + key: ValueKey(keyInfo.keyId), endActionPane: ActionPane( extentRatio: 0.2, motion: const ScrollMotion(), children: [ SlidableAction( - onPressed: (BuildContext context){ + onPressed: (BuildContext context) { state.lockListInfoItemEntity = keyInfo; logic.deleyLockLogicOfRoles(); }, @@ -118,15 +112,22 @@ class _LockListPageState extends State with RouteAware { ], ), child: lockInfoListItem(keyInfo, isLast, () { - if((keyInfo.keyType == XSConstantMacro.keyTypeTime || keyInfo.keyType == XSConstantMacro.keyTypeLoop) && (keyInfo.keyStatus == XSConstantMacro.keyStatusWaitIneffective)){ + 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)){ + 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)){ + if ((keyInfo.keyType == XSConstantMacro.keyTypeTime || + keyInfo.keyType == XSConstantMacro.keyTypeLoop) && + (keyInfo.keyStatus == XSConstantMacro.keyStatusExpired)) { logic.showToast("您的钥匙已过期".tr); return; } @@ -137,40 +138,28 @@ class _LockListPageState extends State with RouteAware { }); }), ); - - // return lockInfoListItem(keyInfo, isLast, () { - // if((keyInfo.keyType == XSConstantMacro.keyTypeTime || keyInfo.keyType == XSConstantMacro.keyTypeLoop) && (keyInfo.keyStatus == XSConstantMacro.keyStatusWaitIneffective)){ - // logic.showToast("您的钥匙未生效"); - // // return; - // } - // if((keyInfo.keyType == XSConstantMacro.keyTypeTime || keyInfo.keyType == XSConstantMacro.keyTypeLoop) && (keyInfo.keyStatus == XSConstantMacro.keyStatusFrozen)){ - // logic.showToast("您的钥匙已冻结"); - // // return; - // } - // if((keyInfo.keyType == XSConstantMacro.keyTypeTime || keyInfo.keyType == XSConstantMacro.keyTypeLoop) && (keyInfo.keyStatus == XSConstantMacro.keyStatusExpired)){ - // logic.showToast("您的钥匙已过期"); - // // return; - // } - // Get.toNamed(Routers.lockDetailMainPage, arguments: { - // // "lockMainEntity": widget.lockMainEntity, - // "keyInfo": keyInfo, - // "isOnlyOneData": false, - // }); - // }); }), ); } - Widget lockInfoListItem(LockListInfoItemEntity keyInfo, bool isLast, Function() action) { + Widget lockInfoListItem( + 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), + 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, + 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( @@ -190,7 +179,11 @@ class _LockListPageState extends State with RouteAware { Text( keyInfo.lockAlias!, style: TextStyle( - fontSize: 24.sp, fontWeight: FontWeight.w500, color: keyInfo.passageMode == 1 ? AppColors.openPassageModeColor : AppColors.darkGrayTextColor), + fontSize: 24.sp, + fontWeight: FontWeight.w500, + color: keyInfo.passageMode == 1 + ? AppColors.openPassageModeColor + : AppColors.darkGrayTextColor), ), ], ), @@ -213,7 +206,7 @@ class _LockListPageState extends State with RouteAware { SizedBox(height: 5.h), Visibility( visible: keyInfo.passageMode == 1 ? true : false, - child:Row( + child: Row( children: [ SizedBox(width: 30.w), Container( @@ -222,42 +215,55 @@ class _LockListPageState extends State with RouteAware { borderRadius: BorderRadius.circular(5.w), color: AppColors.openPassageModeColor, ), - child: Text("常开模式开启".tr, style: TextStyle(fontSize: 18.sp, color: AppColors.appBarIconColor)), + 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( + child: Row( children: [ SizedBox(width: 30.w), Text( - "远程开锁".tr, style: TextStyle(fontSize: 18.sp, color: AppColors.darkGrayTextColor), + "远程开锁".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)) + 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( + // 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) + 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) + ), ), ], )), @@ -333,5 +339,4 @@ class _LockListPageState extends State with RouteAware { // BlueManage().stopScan(); state.ifCurrentScreen.value = false; } - } diff --git a/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart b/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart index b7d82663..21fc64b7 100644 --- a/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart +++ b/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart @@ -119,6 +119,10 @@ class _StarLockMainPageState extends State with BaseWidget { Widget getDataReturnUI(int type) { Widget returnWidget; + + if (type == 1) { + type = F.sw(defaultCall: () => 1, xhjCall: () => 2); + } switch (type) { case 0: // 显示无数据模式 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 7eae2768..364a7f92 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 @@ -41,35 +41,31 @@ class _StarLockMainXHJPageState extends State builder: (LockMainXHJLogic logic) { return Scaffold( backgroundColor: const Color(0xFFF5F5F5), - floatingActionButton: FloatingActionButton( - shape: const CircleBorder(), - onPressed: () { - logic.openEquipment(); - }, - backgroundColor: AppColors.mainColor, - tooltip: TranslationLoader.lanKeys!.device!.tr, - child: const Icon( - Icons.key, - color: AppColors.darkGrayTextColor, - ), - ), body: SafeArea( bottom: false, child: Stack( children: [ + pageView( + widget: StarLockMainPage( + showAppBar: false, + showDrawer: false, + ), + logic: logic, + index: 0, + ), pageView( widget: LockMallPage( showAppBar: false, ), logic: logic, - index: 0, + index: 1, ), pageView( widget: MessageListPage( showAppBar: false, ), logic: logic, - index: 1, + index: 2, ), pageView( widget: MinePersonInfoPage( @@ -77,7 +73,7 @@ class _StarLockMainXHJPageState extends State showAbout: true, ), logic: logic, - index: 2, + index: 3, ), ], ), @@ -97,18 +93,25 @@ class _StarLockMainXHJPageState extends State top: false, child: Row( children: [ - navigationBarItem(Icons.shopping_cart, '商城'.tr, logic, 0, - () { + navigationBarItem( + Icons.key, + TranslationLoader.lanKeys!.device!.tr, + logic, + 0, () { logic.setIndex(0); }), - navigationBarItem(Icons.message, - TranslationLoader.lanKeys!.message!.tr, logic, 1, () { + navigationBarItem(Icons.shopping_cart, '商城'.tr, logic, 1, + () { logic.setIndex(1); }), - navigationBarItem(Icons.account_circle, '我的'.tr, logic, 2, - () { + navigationBarItem(Icons.message, + TranslationLoader.lanKeys!.message!.tr, logic, 2, () { logic.setIndex(2); }), + navigationBarItem(Icons.account_circle, '我的'.tr, logic, 3, + () { + logic.setIndex(3); + }), ], ), ), From 86159775a85c3c56ded9f02bb21762f2bb98913a Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Sun, 28 Apr 2024 09:45:16 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat:=E7=99=BB=E5=BD=95=E5=8D=8F=E8=AE=AE?= =?UTF-8?q?=E7=AA=97=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/images/lan/lan_en.json | 11 +- star_lock/images/lan/lan_keys.json | 11 +- star_lock/images/lan/lan_zh.json | 12 +- star_lock/lib/app_settings/app_settings.dart | 2 +- star_lock/lib/tools/appFirstEnterHandle.dart | 208 +++++++++++++------ 5 files changed, 174 insertions(+), 70 deletions(-) diff --git a/star_lock/images/lan/lan_en.json b/star_lock/images/lan/lan_en.json index 2c32a5fc..5329363d 100644 --- a/star_lock/images/lan/lan_en.json +++ b/star_lock/images/lan/lan_en.json @@ -792,5 +792,14 @@ "全选":"Select all", "请选择要删除的视频":"Please select the video you want to delete", "请选择要下载的视频":"Please select the video you want to download", - "欢迎使用":"Welcome to use" + "欢迎使用":"Welcome to use", + "用户协议和隐私政策概要": "Summary of User Agreement and Privacy Policy", + "协议概要": "Protocol Summary", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读":"Thank you for using this application. We attach great importance to your personal information and privacy protection. Before using this product, please read it carefully", + "《用户协议》":"《User Agreement》", + "和":"and", + "《隐私政策》": "《Privacy Policy》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "The entire content of. By clicking \"Agree\", you agree and accept all terms. If you choose not to agree, you will not be able to use our products and services and will exit the application.", + "不同意":"Disagree", + "同意":"agree" } diff --git a/star_lock/images/lan/lan_keys.json b/star_lock/images/lan/lan_keys.json index 2f60d178..1e99b098 100644 --- a/star_lock/images/lan/lan_keys.json +++ b/star_lock/images/lan/lan_keys.json @@ -791,5 +791,14 @@ "全选":"全选", "请选择要删除的视频":"请选择要删除的视频", "请选择要下载的视频":"请选择要下载的视频", - "欢迎使用":"欢迎使用" + "欢迎使用":"欢迎使用", + "用户协议和隐私政策概要": "用户协议和隐私政策概要", + "协议概要": "协议概要", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读":"感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读", + "《用户协议》":"《用户协议》", + "和":"和", + "《隐私政策》": "《隐私政策》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。", + "不同意":"不同意", + "同意":"同意" } diff --git a/star_lock/images/lan/lan_zh.json b/star_lock/images/lan/lan_zh.json index 622abcce..dca1f068 100644 --- a/star_lock/images/lan/lan_zh.json +++ b/star_lock/images/lan/lan_zh.json @@ -794,5 +794,15 @@ "全选":"全选", "请选择要删除的视频":"请选择要删除的视频", "请选择要下载的视频":"请选择要下载的视频", - "欢迎使用":"欢迎使用" + "欢迎使用":"欢迎使用", + "用户协议和隐私政策概要": "用户协议和隐私政策概要", + "协议概要": "协议概要", + "感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读":"感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读", + "《用户协议》":"《用户协议》", + "和":"和", + "《隐私政策》": "《隐私政策》", + "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。": "的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。", + "不同意":"不同意", + "同意":"同意" + } diff --git a/star_lock/lib/app_settings/app_settings.dart b/star_lock/lib/app_settings/app_settings.dart index d70682a7..e63f061c 100644 --- a/star_lock/lib/app_settings/app_settings.dart +++ b/star_lock/lib/app_settings/app_settings.dart @@ -6,7 +6,7 @@ class AppLog { static bool _onlyError = false; static showLog({required bool printLog, bool? onlyError}){ - _printLog = printLog ?? false; + _printLog = printLog; _onlyError = onlyError ?? false; } static log(String msg,{bool? error}){ diff --git a/star_lock/lib/tools/appFirstEnterHandle.dart b/star_lock/lib/tools/appFirstEnterHandle.dart index 36b59836..c48a8b2d 100644 --- a/star_lock/lib/tools/appFirstEnterHandle.dart +++ b/star_lock/lib/tools/appFirstEnterHandle.dart @@ -6,7 +6,9 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/appRouters.dart'; +import 'package:star_lock/app_settings/app_colors.dart'; import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart'; +import 'package:star_lock/flavors.dart'; import 'package:star_lock/tools/storage.dart'; import '../versionUndate/versionUndateTool.dart'; @@ -37,7 +39,6 @@ class AppFirstEnterHandle { } break; default: - break; } } @@ -49,75 +50,150 @@ class AppFirstEnterHandle { builder: (context) { return PopScope( canPop: false, - child: CupertinoAlertDialog( - title: const Text('用户协议和隐私政策概要\n'), - content: Text.rich( - TextSpan( - text: '感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读', - style: const TextStyle(fontSize: 16.0), - children: [ - TextSpan( - text: '《用户协议》', - style: const TextStyle( - color: Colors.blue, - decoration: TextDecoration.underline), - recognizer: TapGestureRecognizer() - ..onTap = () { - // 处理用户协议点击事件 - Get.toNamed(Routers.webviewShowPage, arguments: { - "url": XSConstantMacro.userAgreementURL, - "title": '用户协议' - }); - }, - ), - const TextSpan(text: '和'), - TextSpan( - text: '《隐私政策》', - style: const TextStyle( - color: Colors.blue, - decoration: TextDecoration.underline), - recognizer: TapGestureRecognizer() - ..onTap = () { - // 处理隐私政策点击事件 - Get.toNamed(Routers.webviewShowPage, arguments: { - "url": XSConstantMacro.privacyPolicyURL, - "title": '隐私政策' - }); - }, - ), - const TextSpan( - text: - '的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。'), - ], - ), - ), - actions: [ - CupertinoDialogAction( - child: const Text( - '不同意', - style: TextStyle(color: Colors.black), - ), - onPressed: () { - _exitApp(); - }, - ), - CupertinoDialogAction( - child: const Text( - '同意', - style: TextStyle(color: Colors.blue), - ), - onPressed: () { - Storage.setString(isAgreePrivacy, isAgreePrivacy); - Navigator.of(context).pop(); - getAppFirstEnter(context, isShowUpdateVersion); - }, - ), - ], - )); + child: F.sw( + defaultCall: () => _defaultPrivacyAgreementAlert(context), + xhjCall: () => _xhjPrivacyAgreementAlert(context))); }, ); } + //默认布局 + Widget _defaultPrivacyAgreementAlert(BuildContext context) { + return CupertinoAlertDialog( + title: Text('${'用户协议和隐私政策概要'.tr}\n'), + content: Text.rich( + TextSpan( + text: '感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读'.tr, + style: const TextStyle(fontSize: 16.0), + children: [ + TextSpan( + text: '《用户协议》'.tr, + style: const TextStyle( + color: Colors.blue, decoration: TextDecoration.underline), + recognizer: TapGestureRecognizer() + ..onTap = () { + // 处理用户协议点击事件 + Get.toNamed(Routers.webviewShowPage, arguments: { + "url": XSConstantMacro.userAgreementURL, + "title": '用户协议'.tr + }); + }, + ), + TextSpan(text: '和'.tr), + TextSpan( + text: '《隐私政策》'.tr, + style: const TextStyle( + color: Colors.blue, decoration: TextDecoration.underline), + recognizer: TapGestureRecognizer() + ..onTap = () { + // 处理隐私政策点击事件 + Get.toNamed(Routers.webviewShowPage, arguments: { + "url": XSConstantMacro.privacyPolicyURL, + "title": '隐私政策'.tr + }); + }, + ), + TextSpan( + text: '的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。' + .tr), + ], + ), + ), + actions: [ + CupertinoDialogAction( + child: Text( + '不同意'.tr, + style: TextStyle(color: Colors.black), + ), + onPressed: () { + _exitApp(); + }, + ), + CupertinoDialogAction( + child: Text( + '同意'.tr, + style: TextStyle(color: Colors.blue), + ), + onPressed: () { + Storage.setString(isAgreePrivacy, isAgreePrivacy); + Navigator.of(context).pop(); + getAppFirstEnter(context, isShowUpdateVersion); + }, + ), + ], + ); + } + + //xhj 布局 + Widget _xhjPrivacyAgreementAlert(BuildContext context) { + return AlertDialog( + title: Text('协议概要'.tr), + backgroundColor: Colors.white, + content: Text.rich( + TextSpan( + text: '感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读'.tr, + style: const TextStyle(fontSize: 16.0), + children: [ + TextSpan( + text: '《用户协议》'.tr, + style: TextStyle( + color: AppColors.mainColor, + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + // 处理用户协议点击事件 + Get.toNamed(Routers.webviewShowPage, arguments: { + "url": XSConstantMacro.userAgreementURL, + "title": '用户协议'.tr + }); + }, + ), + TextSpan(text: '和'.tr), + TextSpan( + text: '《隐私政策》'.tr, + style: TextStyle( + color: AppColors.mainColor, + ), + recognizer: TapGestureRecognizer() + ..onTap = () { + // 处理隐私政策点击事件 + Get.toNamed(Routers.webviewShowPage, arguments: { + "url": XSConstantMacro.privacyPolicyURL, + "title": '隐私政策'.tr + }); + }, + ), + TextSpan( + text: '的全部内容。点击“同意”即表示您同意并接受全部条款。若选择不同意,将无法使用我们的产品和服务,并会退出应用。' + .tr), + ], + ), + ), + actions: [ + CupertinoDialogAction( + child: Text( + '不同意'.tr, + style: TextStyle(color: Colors.black), + ), + onPressed: () { + _exitApp(); + }, + ), + CupertinoDialogAction( + child: Text( + '同意'.tr, + style: TextStyle(color: AppColors.mainColor), + ), + onPressed: () { + Storage.setString(isAgreePrivacy, isAgreePrivacy); + Navigator.of(context).pop(); + getAppFirstEnter(context, isShowUpdateVersion); + }, + ), + ], + ); + } + //位置权限弹窗 void showPositionAlert(BuildContext widgetContext) { showCupertinoDialog( From 2821d581629265f4a1b23ecc05e54f33cd293334 Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Sun, 28 Apr 2024 11:38:11 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat:=E9=A6=96=E9=A1=B5=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/images/icon_lock_circle.png | Bin 0 -> 2599 bytes .../main/lockMian/lockList/lockList_page.dart | 14 +- .../lockMian/lockList/lockList_xhj_page.dart | 507 ++++++++++++++++++ .../main/lockMian/lockMain/lockMain_page.dart | 8 +- .../mine/addLock/addLock/addLock_state.dart | 4 +- 5 files changed, 516 insertions(+), 17 deletions(-) create mode 100644 star_lock/images/icon_lock_circle.png create mode 100644 star_lock/lib/main/lockMian/lockList/lockList_xhj_page.dart diff --git a/star_lock/images/icon_lock_circle.png b/star_lock/images/icon_lock_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..8ff61791b3bc3b8e044a4d781e19b9b1607417f2 GIT binary patch literal 2599 zcmV+?3fT3DP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91V4wp41ONa40RR91U;qFB0I4%yP5=N2kx4{BRCodHoq4PsQyj-tH*M)+ zsh~7ZQA-q6TkL9yR%(k{60ub9hdnAJ_CzdyP$USkYba5aQbK7dO-hNjqPDhLwS~4Q zRkS|e+c(d=d1vmOxpU5$aqs++PiN-LIltdIzu%lQXU@!h?X+I;WkagCH4K3M&=2}R zSLg<7U^V;!%Ubz{?GjiDI$v1nRIr-KsY75G><)urE2vjiQSfv41ZKngpuiMHiVy%@ z%}2svupjgQm$C@u)8I8wK-NNTl2-sa)8a$mBsdVdKpyfvMkm2Dpul(+-vQW&7M=p9 z!{**w8*fm(UlEAG^BZFNNMQ zbtr1`EGl*b=qBz=G#0y(T~K^4jE3&6j5yS*+1JUS9;+GD-(X!_^Z?CbE{D@VJ)jZf zTN@TTp?*zN&?sNh3zD7Xl&?e-_tr+e5jpzTbs_Hbu20LM}>4LL=c-B2B?qKCr+ zKr^OaZD_V}l`4qWf^N3WBEQhkiy`xrHER#h&Gk+g1nPy2@0-*8m0Z^B0 zMv?Edgt7uYuGaze2B0qnpMW9t8g7ts8p00--IVp*kXq^qfTo$6>1du`$~q71%Vs&G z?g?oFphdHLU~ed;y$7_YxByb!6Ve1g-R)M;xK~O?56C~m;Uiew@w7Q5&6DaFR5aUc z$LzKERJ~BrtWe7si6rTBz#eED4{3T#q6#!Kpk z`rEa#Ckenflr;Nvvz8xC=XWDf@1k{Mj+I(N&{34UE4H-%6PoJ12XjF$*H?mOW__Ur zhPIOA!Xm44`3?(5!|!pHss*4Yg{D9e7T4tP`#{UVwZ_#=$uk+ zNR_++;u_di(BaM{=>9RHzZb_^fjt~d7fp~|GdJCIe}@l)#MZ4|A#MVipXVi-p}i0` z9(DA|oQwt~oZt2SYz)jZ7`d7>Er%qPE68ZN@jjkZfunpH0tbe5hXWwTpBO%w!~Tl~ zn;Pp+Fr-&YQZKm+O-^l)x;*hV-2ijKNSp7OTAxMoB3$RG--O;It~h~{y5 zJPPG)es9|$Q8SA?WjV$dM=GHD9TZ7Rb9k^JbKX6mKXn=w)GG);XA%wz5_8%vFxcIe zv@FXBru)X120Ol!+Foh}0Z>J=G}J}|zBee@%#fBQ$yEM_GzuK$ZR?pq08C@0BipfR zR~pV_y(sz^bm}R4jUnA<(l!{|S_Xpvw2etVYZ0;aSL9fS8XB`m(7vdSS}Us2{4S0w zK34_1zz`P}QtDirGJlrrK5fO-b5EU609s%J9hBnL13Sx_0O1O?r7{El78u!TuGa2NKcw%y0NS5&#*;OB@XiqPyq6*h^B8on|x>Z!1I130D9Auhs?~wsKMq!(oD-BhOE|;dZ-8F^@=X9Mw`6&ohi{nS~mqi zV_+WgXC6jlZ01#$^%a1)sai~3ttA&>Ilx+D>QuB^0mv)*b=J9|id6z&dH`yuRu;H1 zE7Sv)6}WxRz(=yC07yPqw<-Vi=z)sQg8;ne(Qs*M-OH!S zCz3$`^wvqQ1xxYc0bTHwHMk%ED@f1_l2ZJ5U}|6{2!M_!2Z`m@sR#5`p8jxnMZy7i zm6UQAYITgm&2)6PEr5mtpdYxs;m~lYdYuQJ2|FSj0Hsd|pDg#SdqA&Yr-ijf12BV= zpNBIz+|T;uv(2jcs>@?ky4^4z4S*Ji9<?YoUx(-*rOmwPZN531G2(E8Xs+b;3^j<>a zr0dUBbhU2`d%=EC%?F&$Ec&|pBv@n8RLl5P6gtyXuuMzj0XbdHkNw0xZU_prYlzU? zwUqii@Fc}zoiCNOh8L~a&4Xj1RGL zayHcbOtC&+|0xe=eyHYR!V8 zdRj=(jim?=P|>;-;dm;QxB%L%_f)G`+5kw`uJ9P>L8_GhJTRNxvp|1DFtH@P2ZR;s z#-f?g2&kugSXZO$YXw=(UzxT+^*Zot41EkoK-aWJ8!Z1E+9T)dy?Sb?HvlrEAm~o7 zAZSIg8AV@{oD0Tvo+J)QItz-^rRbjm%{V*Kg5`N&`hhvg$s|h;2rMjTN0rgyT{Ao< zXohn;+ya`OXA&C$PzChl_adlrdqLKog^EIoe$IM6=z_B%wgRBaXt`omEBmwE5E@C| zqA};dS2i0}&vQT$`@P6?5u6S-gPg>+?L3-x-wZF?RxEw40uaq!4M(QrB* z#zE@&ebUCd4uI+*8~V?XFNA^ce~>q*q#W=3*F!!65I9^z(I^-L+XsmS+Ukmb9qxy! zFHvmP*=GR4^*(@u(J&nJjy6xxCz%sr0xb4jk-P#Bv~v@7jsmSK4F&ZQAEGDMH(@g9 zX}0QHE6zKUyaNz!SRW45GxVjxp3nle>h~wQw08AA%z)XTAt!gS)j$^w>5bCCumkAk zJplTH-bLtKcjyXw{#Xrq7}Qhw&+sj1IMJMae(N^3s~r2W@-K*UU{nWk4EX>6002ov JPDHLkV1i`rw%h;! literal 0 HcmV?d00001 diff --git a/star_lock/lib/main/lockMian/lockList/lockList_page.dart b/star_lock/lib/main/lockMian/lockList/lockList_page.dart index 214f898e..66f07890 100644 --- a/star_lock/lib/main/lockMian/lockList/lockList_page.dart +++ b/star_lock/lib/main/lockMian/lockList/lockList_page.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_slidable/flutter_slidable.dart'; import 'package:get/get.dart'; +import 'package:star_lock/flavors.dart'; import '../../../appRouters.dart'; import '../../../app_settings/app_colors.dart'; @@ -37,17 +38,6 @@ class _LockListPageState extends State with RouteAware { widget.lockListInfoGroupEntity.groupList as Iterable); return Scaffold( - floatingActionButton: FloatingActionButton( - shape: const CircleBorder(), - onPressed: () { - Get.toNamed(Routers.addLockPage); - }, - backgroundColor: AppColors.mainColor, - child: const Icon( - Icons.add, - color: AppColors.darkGrayTextColor, - ), - ), body: ListView.separated( itemCount: groupDataList.length, itemBuilder: (context, index) { @@ -70,8 +60,6 @@ class _LockListPageState extends State with RouteAware { List lockItemList = itemData.lockList ?? []; return LockListGroupPage( onTap: () { - // selectGroupIdList.add(index); - // clickIndex = index; //是否选中组 if (itemData.isChecked) { } else {} diff --git a/star_lock/lib/main/lockMian/lockList/lockList_xhj_page.dart b/star_lock/lib/main/lockMian/lockList/lockList_xhj_page.dart new file mode 100644 index 00000000..b283e009 --- /dev/null +++ b/star_lock/lib/main/lockMian/lockList/lockList_xhj_page.dart @@ -0,0 +1,507 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; +import 'package:get/get.dart'; +import 'package:star_lock/flavors.dart'; + +import '../../../appRouters.dart'; +import '../../../app_settings/app_colors.dart'; +import '../../../common/XSConstantMacro/XSConstantMacro.dart'; +import '../../../tools/appRouteObserver.dart'; +import '../../../tools/dateTool.dart'; +import '../entity/lockListInfo_entity.dart'; +import 'lockListGroup_page.dart'; +import 'lockList_logic.dart'; + +class LockListXHJPage extends StatefulWidget { + final LockListInfoGroupEntity lockListInfoGroupEntity; + + const LockListXHJPage({Key? key, required this.lockListInfoGroupEntity}) + : super(key: key); + + @override + State createState() => _LockListXHJPageState(); +} + +class _LockListXHJPageState extends State with RouteAware { + final logic = Get.put(LockListLogic()); + final state = Get.find().state; + + var groupDataList = []; + + @override + Widget build(BuildContext context) { + if (widget.lockListInfoGroupEntity.pageNo == 1) { + groupDataList = []; + } + 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, + ), + ), + 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, + 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; + } + + 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, + }); + }), + ); + }), + ); + } + + 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), + ], + ), + ), + ); + } + + Widget _xhjLockInfoListItem( + 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: Padding( + padding: EdgeInsets.symmetric(horizontal: 30.w, vertical: 20.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Image.asset( + 'images/icon_lock_circle.png', + width: 32.r, + 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), + ) + ], + ), + Visibility( + visible: keyInfo.passageMode == 1 ? true : false, + child: Padding( + padding: EdgeInsets.only(top: 5.h), + child: Row( + children: [ + 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)), + ), + ], + ), + )), + Visibility( + visible: + keyInfo.lockSetting!.remoteUnlock == 1 ? true : false, + child: Padding( + padding: EdgeInsets.only(top: 5.h), + child: Row( + children: [ + 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, + child: Padding( + padding: EdgeInsets.only(top: 20.h), + child: Row( + children: [ + 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: [ + Expanded( + child: Text( + keyInfo.isLockOwner == 1 + ? '超级管理员'.tr + : (keyInfo.keyRight == 1 ? "授权管理员".tr : "普通用户".tr), + style: TextStyle( + fontSize: 18.sp, color: AppColors.darkGrayTextColor), + ), + ), + 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), + ), + ], + ), + Text( + keyInfo.hwVersion ?? "", + style: TextStyle( + fontSize: 18.sp, color: AppColors.darkGrayTextColor), + ), + ], + ), + ), + ), + ); + } + + @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(); + + // BlueManage().stopScan(); + state.ifCurrentScreen.value = false; + } + + /// 从下级返回 当前界面即将出现 + @override + void didPopNext() { + super.didPopNext(); + state.ifCurrentScreen.value = true; + } + + /// 进入下级界面 当前界面即将消失 + @override + void didPushNext() { + super.didPushNext(); + logic.cancelBlueConnetctToastTimer(); + + // BlueManage().stopScan(); + state.ifCurrentScreen.value = false; + } +} diff --git a/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart b/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart index 55c4f793..ec382028 100644 --- a/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart +++ b/star_lock/lib/main/lockMian/lockMain/lockMain_page.dart @@ -4,6 +4,7 @@ import 'package:flutter/scheduler.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/main/lockMian/lockList/lockList_xhj_page.dart'; import 'package:star_lock/tools/noData.dart'; import 'package:star_lock/tools/submitBtn.dart'; @@ -138,8 +139,11 @@ class _StarLockMainPageState extends State with BaseWidget { case 2: // 有多条数据 Storage.setBool(ifIsDemoModeOrNot, false); - returnWidget = LockListPage( - lockListInfoGroupEntity: state.lockListInfoGroupEntity.value); + returnWidget = F.sw( + defaultCall: () => LockListPage( + lockListInfoGroupEntity: state.lockListInfoGroupEntity.value), + xhjCall: () => LockListXHJPage( + lockListInfoGroupEntity: state.lockListInfoGroupEntity.value)); break; default: returnWidget = NoData(); diff --git a/star_lock/lib/mine/addLock/addLock/addLock_state.dart b/star_lock/lib/mine/addLock/addLock/addLock_state.dart index 04184a8b..280ab527 100644 --- a/star_lock/lib/mine/addLock/addLock/addLock_state.dart +++ b/star_lock/lib/mine/addLock/addLock/addLock_state.dart @@ -5,8 +5,8 @@ class AddLockState { var lockTypeImg = 'images/lockType/addLock_touchScreen.png'.obs; //不同类型锁图片更换 AddLockState() { - Map map = Get.arguments; - if (map.isNotEmpty) { + Map? map = Get.arguments; + if (map is Map && map.isNotEmpty) { if (map["getLockType"] != null) { getLockType.value = map["getLockType"]; //保险箱锁 From d85104445db94366952830ecc7a393872fe87bd7 Mon Sep 17 00:00:00 2001 From: Daisy <> Date: Sun, 28 Apr 2024 14:12:50 +0800 Subject: [PATCH 4/4] =?UTF-8?q?1=EF=BC=8CiOS=E5=8E=BB=E6=8E=89=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E6=95=B0=E9=87=8F=E8=A7=92=E6=A0=87=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=202=EF=BC=8C=E6=9B=B4=E6=96=B0=E6=89=8B=E6=8E=8C=E3=80=81?= =?UTF-8?q?=E8=99=B9=E8=86=9C=E5=9B=BE=E7=89=87icon=203=EF=BC=8C=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E7=94=A8=E6=88=B7=E8=AE=BE=E7=BD=AE=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E6=98=AF=E5=90=A6=E4=B8=BAVIP=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=A0=87=E8=AF=86=204=EF=BC=8C=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E5=AE=9E=E4=BD=93=E7=B1=BB=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E4=B8=BAVIP=E7=94=A8=E6=88=B7=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star_lock/images/main/icon_iris.png | Bin 1722 -> 4058 bytes star_lock/images/main/icon_palm.png | Bin 4480 -> 3707 bytes star_lock/images/mine/icon_mine_isPlus.png | Bin 0 -> 4708 bytes star_lock/images/mine/icon_mine_noPlus.png | Bin 0 -> 4314 bytes star_lock/ios/Runner/AppDelegate.m | 38 ++++---- .../lib/mine/mine/starLockMine_logic.dart | 15 +++- .../lib/mine/mine/starLockMine_page.dart | 81 ++++++++++++------ .../lib/mine/mine/starLockMine_state.dart | 3 + .../minePersonInfo_entity.dart | 6 +- 9 files changed, 94 insertions(+), 49 deletions(-) create mode 100644 star_lock/images/mine/icon_mine_isPlus.png create mode 100644 star_lock/images/mine/icon_mine_noPlus.png diff --git a/star_lock/images/main/icon_iris.png b/star_lock/images/main/icon_iris.png index 32272c8a8931f6bfc39d16e80cf657ac5d4ff9e3..92d7c138c599a0d2ded6758dd36d09c6d72627fa 100644 GIT binary patch literal 4058 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 M07*qoM6N<$g7Ux182|tP delta 1721 zcmV;q21fbXAG!@8iBL{Q4GJ0x0000DNk~Le0000O0000M2nGNE0NQ;-|e+Fzx zL_t(YiCvU=jMdc@$3OS}?(g?zdGF1}%)HrnGYm52q$pAvYi+TWlC(nAvZ@fMbl7I%z--LG?E72hz2EySw|_VT4JSFd z=X;ZL?mgf0%@Ld58Qytq%>Rxde-NcXd2rK`>?ejNyf_dYOzD!ce9_q0?RvmVXL_7x zvJI(oEj|RkepiJ8xLr#u;Os}O8GyG_E{}x+Xdlk2_7N{{Rkan278$(p*<|fN+zU1h zx^dv?#$IRP>T2^F%>(WjP`7G!z*tbK_|?bpasX2RupAzotp));}4&w4y0Yp(%Dw80(z(XhFuwU0f-hT zT-WFPfKSJ;Gc>nYMFWP;q#V&Tn$qOvKyOR~2tZGz_fI(hayt0#ogqe(nxifD^i>$x z3RD7B!15Dandd)f&Flk~0JDH1;91iUGfYE}&S<*FTvp69Z+uqle>xVw0Y)c1Vv`*>}=$Vk~9U-5iOTwjZz$)MxYoOZSB9QPaEdL&$Nvd!rYS}>UONM>%b zVLbTwGt;q3IeM+_=#ZZix(?L^6%EK~KQ($aQ*rLxz z8|QkQbyZ;%vkd&Cf1|(Zc(el^fYSanb?BbBUwf|C*^_OFanIw}vNChqk_xNujsGNH zDhbKL+sZA3fVM$5w{^(9@7`$Og=kprZ5eaFccjyP#q)KruE^YTN4eUcwEZt;^2Jhd=lTz~IUYG))*{q%Pm3e~Jae?@+l;CNvkK(vr9tD-c!sn634a+-cSR=zA`AkrG0(*RCi|2ln9Wv_OZ3Ua(|Qk zNXQf~_r`SJf28L#Zo{}uNhEB9i*p6LP9<1>dk!z&pU1AxlEfx8^`**aAN9-s-Ik$m z!sBam0!a_Ct+B_sXC&!w97+1f`Vy1+67%R&D{@}FH0bOGmI4%H8&v1ZYyB~ALK2udgCsh2B1!T($Myu)K4o$>K_j4U2Mk?odoC!S2Ns z*6#)Q9i!d@SI4|JwXfUO)@5xmB;&x12MC$c6M`c`(0g^l+nTUx$WnAi^NsxjF>N2X zm|Cfne=w72c>UAF;I%RLH#Pa{g@J@$(;N4mA4>U;R)vjs=N1~j3}+i@V`{qcXlt6s z_Ki=s=mYOBDzhGrr@g-6l-~P(b7o&KOZKjrZB4Wfxm+G_D9jcYs|!`*;j5Wf;xV&0JPEV{NE5anzPTL~x7Y*o1024RneOHSaG}1) z2y0|f)1V_#uJ9tc!kAlZ#D`LP=>K!01>)9ns42ZxPT?M)JraaSP;s%(Wkx`d_H}Ia ze{3u3-E*nBl;evvtAqW%tA~mMg5zx&R@IoKGX8YUnLr)j0we0$g#Uw@JmYa8p<~qh zu%VVMKnz$2$FN-f2wLsQLocckpsL4boUqX?B(bRboK|fY*Fq z=Q}R3c@YDk>mOg(fX#v;bp>GgObg(}qFf;X;%OhCWT7 diff --git a/star_lock/images/main/icon_palm.png b/star_lock/images/main/icon_palm.png index 704186c31a763022d723b7ad61f3005cb694380a..8a90d41a78ae0d01341feff788f484345ac00f6f 100644 GIT binary patch literal 3707 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 S21I560000XZz(D}Zh;7iYWQw9_($tV6n&gPn zGwhjOruVMtuI*dz;)k!hDcaaS;)$oPh)T&<_F(1F(_^FOfAWF5n4Ozs6!l4> zeVlV-Sw<8^91J6zRpdrut;HB~e09z-$PCUZw6n1_V(6UcTWc}65rB4fXtdaN%3G77 zysE8#S&DL3D1T^mY5UKlW}YArCr4&1}8jn>yu?3N#t1H+~V5RJ)YSfdn}dhm#y^m zbH8)W{zxR0QjA8U#j()i{P_pC=bmx$>D;zl5R^VZTLLiY+B7{H) zfl`Xh7;xZ(!&!%=SUe*f&N)yLha=ZHnQ;i=(`+{If{;o$&38w==hFzRwdw
g7S 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 IM6N<$f~=HyNB{r; literal 0 HcmV?d00001 diff --git a/star_lock/ios/Runner/AppDelegate.m b/star_lock/ios/Runner/AppDelegate.m index 236ad0e6..87707e2d 100644 --- a/star_lock/ios/Runner/AppDelegate.m +++ b/star_lock/ios/Runner/AppDelegate.m @@ -127,25 +127,25 @@ /* * App处于启动状态时,通知打开回调 */ -- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo { - NSLog(@"Receive one notification."); - // 取得APNS通知内容 - NSDictionary *aps = [userInfo valueForKey:@"aps"]; - // 内容 - NSString *content = [aps valueForKey:@"alert"]; - // badge数量 - NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; - // 播放声音 - NSString *sound = [aps valueForKey:@"sound"]; - // 取得Extras字段内容 - NSString *Extras = [userInfo valueForKey:@"Extras"]; //服务端中Extras字段,key是自己定义的 - NSLog(@"content = [%@], badge = [%ld], sound = [%@], Extras = [%@]", content, (long)badge, sound, Extras); - // iOS badge 清0 - application.applicationIconBadgeNumber = 0; - // 通知打开回执上报 - // [CloudPushSDK handleReceiveRemoteNotification:userInfo];(Deprecated from v1.8.1) - [CloudPushSDK sendNotificationAck:userInfo]; -} +//- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo { +// NSLog(@"Receive one notification."); + // 取得APNS通知内容 +// NSDictionary *aps = [userInfo valueForKey:@"aps"]; +// // 内容 +// NSString *content = [aps valueForKey:@"alert"]; +// // badge数量 +// NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; +// // 播放声音 +// NSString *sound = [aps valueForKey:@"sound"]; +// // 取得Extras字段内容 +// NSString *Extras = [userInfo valueForKey:@"Extras"]; //服务端中Extras字段,key是自己定义的 +// NSLog(@"content = [%@], badge = [%ld], sound = [%@], Extras = [%@]", content, (long)badge, sound, Extras); +// // iOS badge 清0 +// application.applicationIconBadgeNumber = 0; +// // 通知打开回执上报 +// // [CloudPushSDK handleReceiveRemoteNotification:userInfo];(Deprecated from v1.8.1) +// [CloudPushSDK sendNotificationAck:userInfo]; +//} diff --git a/star_lock/lib/mine/mine/starLockMine_logic.dart b/star_lock/lib/mine/mine/starLockMine_logic.dart index 020c4097..8a345929 100644 --- a/star_lock/lib/mine/mine/starLockMine_logic.dart +++ b/star_lock/lib/mine/mine/starLockMine_logic.dart @@ -1,7 +1,9 @@ import 'dart:async'; import 'package:get/get.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart'; import 'package:star_lock/network/api_repository.dart'; import '../../tools/baseGetXController.dart'; @@ -12,6 +14,16 @@ import 'starLockMine_state.dart'; class StarLockMineLogic extends BaseGetXController { final StarLockMineState state = StarLockMineState(); + //用户信息 + Future getUserInfoRequest() async { + MinePersonInfoEntity entity = await ApiRepository.to.getUserInfo(); + if (entity.errorCode!.codeIsSuccessful) { + state.mineInfoData.value = entity.data!; + state.isVip.value = state.mineInfoData.value.isVip! == 0 ? false : true; + AppLog.log('isVip: ${state.isVip.value}'); + } + } + //删除账号请求 Future userLogoutRequest() async { LoginEntity entity = await ApiRepository.to.userLogout(deviceld: ''); @@ -22,7 +34,8 @@ class StarLockMineLogic extends BaseGetXController { StreamSubscription? _mineInfoChangeRefreshUIEvent; void _mineInfoChangeRefreshUIAction() { // 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus - _mineInfoChangeRefreshUIEvent = eventBus.on().listen((event) { + _mineInfoChangeRefreshUIEvent = + eventBus.on().listen((event) { getMineInfoData(); }); } diff --git a/star_lock/lib/mine/mine/starLockMine_page.dart b/star_lock/lib/mine/mine/starLockMine_page.dart index 4bfa4f8b..9f37e9c6 100644 --- a/star_lock/lib/mine/mine/starLockMine_page.dart +++ b/star_lock/lib/mine/mine/starLockMine_page.dart @@ -24,6 +24,12 @@ class StarLockMinePageState extends State with BaseWidget { final logic = Get.put(StarLockMineLogic()); final state = Get.find().state; + @override + initState() { + super.initState(); + logic.getUserInfoRequest(); + } + @override Widget build(BuildContext context) { return Scaffold( @@ -57,19 +63,19 @@ class StarLockMinePageState extends State with BaseWidget { fit: BoxFit.fill, ), Center( - child: Column( - // crossAxisAlignment: CrossAxisAlignment.center, - children: [ - SizedBox( - height: 120.h, - ), - GestureDetector( - onTap: () { - // Navigator.pushNamed(context, Routers.starLockLoginPage); - Get.back(); - Get.toNamed(Routers.minePersonInfoPage); - }, - child: Obx(() => Container( + child: Column( + // crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + height: 120.h, + ), + GestureDetector( + onTap: () { + // Navigator.pushNamed(context, Routers.starLockLoginPage); + Get.back(); + Get.toNamed(Routers.minePersonInfoPage); + }, + child: Obx(() => Container( width: 105.w, height: 105.w, // decoration: BoxDecoration( @@ -78,7 +84,11 @@ class StarLockMinePageState extends State with BaseWidget { // ), child: ClipRRect( borderRadius: BorderRadius.circular(52.5.w), - child: CustomNetworkImage(url:state.userHeadUrl.value??"", defaultUrl: 'images/controls_user.png', width:105.w, height:105.h), + child: CustomNetworkImage( + url: state.userHeadUrl.value ?? "", + defaultUrl: 'images/controls_user.png', + width: 105.w, + height: 105.h), ), // state.headUrl().isNotEmpty ? // Image(image: NetworkImage(state.loginData.value.data!.headUrl!)) : @@ -87,27 +97,42 @@ class StarLockMinePageState extends State with BaseWidget { // width: 60.w, // height: 60.w) )), - ), - SizedBox( - height: 20.h, - ), - Obx(() => Text(state.userNickName.value.isNotEmpty ? state.userNickName.value : (state.userMobile.value.isNotEmpty ? state.userMobile.value : state.userEmail.value), + ), + SizedBox( + height: 20.h, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Obx(() => Text( + state.userNickName.value.isNotEmpty + ? state.userNickName.value + : (state.userMobile.value.isNotEmpty + ? state.userMobile.value + : state.userEmail.value), style: TextStyle( fontSize: 22.sp, color: Colors.white, ))), SizedBox( - height: 10.h, + width: 5.w, ), - Obx(() => Text( - "${TranslationLoader.lanKeys!.accountNumber!.tr}:${state.userMobile.value.isNotEmpty ? state.userMobile.value : state.userEmail.value}", - style: TextStyle( - fontSize: 18.sp, - color: Colors.white, - fontWeight: FontWeight.w500))), + Obx(() => !state.isVip.value + ? Image.asset( + 'images/mine/icon_mine_noPlus.png', + width: 20.w, + height: 20.w, + ) + : Image.asset( + 'images/mine/icon_mine_isPlus.png', + width: 20.w, + height: 20.w, + )), ], - ), - ), + ) + ], + ), + ), ], ), ); diff --git a/star_lock/lib/mine/mine/starLockMine_state.dart b/star_lock/lib/mine/mine/starLockMine_state.dart index 684fca50..bbcc9583 100644 --- a/star_lock/lib/mine/mine/starLockMine_state.dart +++ b/star_lock/lib/mine/mine/starLockMine_state.dart @@ -1,11 +1,14 @@ import 'package:get/get.dart'; +import 'package:star_lock/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart'; class StarLockMineState { // final loginData = LoginData().obs; + final mineInfoData = MinePersonInfoData().obs; var userNickName = "".obs; var userMobile = "".obs; var userEmail = "".obs; var userHeadUrl = "".obs; + var isVip = false.obs; void onClose() {} } diff --git a/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart index 1307bde5..f531a7be 100644 --- a/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart +++ b/star_lock/lib/mine/minePersonInfo/minePersonInfoPage/minePersonInfo_entity.dart @@ -37,6 +37,7 @@ class MinePersonInfoData { int? countryId; String? email; String? countryName; + int? isVip; MinePersonInfoData( {this.mobile, @@ -47,7 +48,8 @@ class MinePersonInfoData { this.accountName, this.countryId, this.email, - this.countryName}); + this.countryName, + this.isVip}); MinePersonInfoData.fromJson(Map json) { mobile = json['mobile']; @@ -59,6 +61,7 @@ class MinePersonInfoData { countryId = json['countryId']; email = json['email']; countryName = json['countryName']; + isVip = json['isVip']; } Map toJson() { @@ -72,6 +75,7 @@ class MinePersonInfoData { data['countryId'] = countryId; data['email'] = email; data['countryName'] = countryName; + data['isVip'] = isVip; return data; } }