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/main/lockMian/lockList/lockList_state.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_view.dart'; import 'lockList_logic.dart'; class LockListXHJPage extends StatefulWidget { const LockListXHJPage({required this.lockListInfoGroupEntity, Key? key}) : super(key: key); final LockListInfoGroupEntity lockListInfoGroupEntity; @override State createState() => _LockListXHJPageState(); } class _LockListXHJPageState extends State with RouteAware { late LockListLogic logic; late LockListState state; @override void initState() { super.initState(); logic = Get.put(LockListLogic(widget.lockListInfoGroupEntity)); state = Get.find().state; } @override Widget build(BuildContext context) { return GetBuilder(builder: (LockListLogic logic) { 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.builder( itemCount: logic.groupDataList.length, itemBuilder: (BuildContext context, int index) { final GroupList itemData = logic.groupDataList[index]; return _buildLockExpandedList(context, index, itemData); }, shrinkWrap: true, physics: const AlwaysScrollableScrollPhysics(), ), ), ], ), ); }); } //设备多层级列表 Widget _buildLockExpandedList( BuildContext context, int index, GroupList itemData) { final List lockItemList = itemData.lockList ?? []; 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(), children: forItems(lockItemList), )); } List forItems(List lockItemList) { final List list = []; for (int i = 0, j = 0; i < lockItemList.length; i++, j++) { final 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.5, motion: const ScrollMotion(), children: [ SlidableAction( onPressed: (BuildContext context) { state.lockListInfoItemEntity = keyInfo; logic.deleyLockLogicOfRoles(); }, backgroundColor: Colors.red, foregroundColor: Colors.white, label: '删除'.tr, borderRadius: BorderRadius.all(Radius.circular(20.w)), 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 _xhjLockInfoListItem(keyInfo, isLast, action); } Widget _xhjLockInfoListItem( LockListInfoItemEntity keyInfo, bool isLast, Function() action) { return GestureDetector( onTap: action, child: Container( 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.withOpacity(0.8), borderRadius: BorderRadius.circular(20.w), ), child: Padding( padding: EdgeInsets.symmetric(horizontal: 15.w, vertical: 5.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ Row( children: [ Image.asset( 'images/icon_lock_circle.png', width: 48.r, height: 48.r, color: AppColors.mainColor, ), ], ), SizedBox( height: 10.h, ), FittedBox( fit: BoxFit.scaleDown, child: Text(keyInfo.lockAlias!, style: TextStyle( fontSize: 24.sp, fontWeight: FontWeight.w500, color: keyInfo.passageMode == 1 ? AppColors.openPassageModeColor : AppColors.darkGrayTextColor, overflow: TextOverflow.ellipsis, ), maxLines: 1), ), Visibility( visible: keyInfo.passageMode == 1, 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, child: Padding( padding: EdgeInsets.only(top: 5.h), child: Row( children: [ Text( '远程开锁'.tr, style: TextStyle( fontSize: 18.sp, color: AppColors.darkGrayTextColor), ), ], ), )), Visibility( visible: (keyInfo.keyType == XSConstantMacro.keyTypeTime || keyInfo.keyType == XSConstantMacro.keyTypeLoop) && (keyInfo.keyStatus == XSConstantMacro.keyStatusWaitIneffective || keyInfo.keyStatus == XSConstantMacro.keyStatusFrozen || keyInfo.keyStatus == XSConstantMacro.keyStatusExpired), 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: 16.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: 16.sp, color: AppColors.darkGrayTextColor), ), ], ), Text( Characters(logic.getUseKeyTypeStr( keyInfo.startDate, keyInfo.endDate, keyInfo.keyType)) .join('\u{200B}'), style: TextStyle( fontSize: 16.sp, color: AppColors.darkGrayTextColor), ) ], ), ), ), ); } @override void didChangeDependencies() { super.didChangeDependencies(); /// 路由订阅 AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!); } @override void 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; } }