app-starlock/lib/main/lockDetail/lockDetail/lockDetail_page.dart
Daisy ba0b9c0fab 1,锁详情页面新增手机需联网字段及标识
2,xhj锁详情页面部分调整
2024-05-31 15:10:57 +08:00

1458 lines
50 KiB
Dart
Executable File

import 'dart:async';
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:intl/intl.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/flavors.dart';
import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_list_page.dart';
import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_state.dart';
import 'package:star_lock/tools/aliyunRealNameAuth/aliyunRealNameAuthHandle.dart';
import 'package:star_lock/tools/showCupertinoAlertView.dart';
import 'package:star_lock/tools/showTipView.dart';
import 'package:star_lock/widget/flavors_img.dart';
import '../../../appRouters.dart';
import '../../../app_settings/app_settings.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 LockDetailPage extends StatefulWidget {
final bool isOnlyOneData;
final LockListInfoItemEntity lockListInfoItemEntity;
const LockDetailPage(
{Key? key,
required this.isOnlyOneData,
required this.lockListInfoItemEntity})
: super(key: key);
@override
State<LockDetailPage> createState() => _LockDetailPageState();
}
class _LockDetailPageState extends State<LockDetailPage>
with TickerProviderStateMixin, RouteAware {
// with RouteAware
final LockDetailLogic logic = Get.put(LockDetailLogic());
final LockDetailState state = Get.find<LockDetailLogic>().state;
@override
void initState() {
// TODO: implement initState
super.initState();
listeningAnimations();
state.pageController.addListener(() {
state.currentPage.value = state.pageController.page!.round();
});
_initRefreshLockDetailInfoDataEventAction();
logic.initReplySubscription();
logic.initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction();
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
/// 路由订阅
AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!);
}
StreamSubscription? _lockRefreshLockDetailInfoDataEvent;
void _initRefreshLockDetailInfoDataEventAction() {
// 蓝牙协议通知传输跟蓝牙之外的数据传输类不一样 eventBus
_lockRefreshLockDetailInfoDataEvent = eventBus
.on<RefreshLockDetailInfoDataEvent>()
.listen((RefreshLockDetailInfoDataEvent event) {
setState(() {});
});
}
Future<void> loadData() async {
state.keyInfos.value = widget.lockListInfoItemEntity;
CommonDataManage().currentLockUserNo = state.keyInfos.value.lockUserNo!;
CommonDataManage().currentKeyInfo = state.keyInfos.value;
state.lockUserNo = state.keyInfos.value.lockUserNo!;
if (state.keyInfos.value.keyStatus ==
XSConstantMacro.keyStatusWaitIneffective ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusFrozen ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusExpired ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusDeleted ||
state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusReset) {
state.openDoorBtnisUneable.value = false;
state.bottomBtnisEable.value = false;
} else {
state.openDoorBtnisUneable.value = true;
state.bottomBtnisEable.value = true;
}
state.isOnlyOneData = widget.isOnlyOneData;
state.senderUserId = state.keyInfos.value.senderUserId!;
state.isAttendance.value = state.keyInfos.value.lockSetting!.attendance!;
state.isOpenLockNeedOnline.value =
state.keyInfos.value.lockSetting!.appUnlockOnline!;
state.electricQuantity.value = state.keyInfos.value.electricQuantity!;
state.isOpenPassageMode.value = state.keyInfos.value.passageMode!;
state.lockAlias.value = state.keyInfos.value.lockAlias!;
Storage.setString(saveLockAlias, state.lockAlias.value);
BlueManage().connectDeviceName =
state.keyInfos.value.bluetooth!.bluetoothDeviceName!;
final List<int> publicKeyData =
state.keyInfos.value.bluetooth!.publicKey!.cast<int>();
final List<String> saveStrList = changeIntListToStringList(publicKeyData);
Storage.setStringList(saveBluePublicKey, saveStrList);
// 私钥
final List<int> privateKeyData =
state.keyInfos.value.bluetooth!.privateKey!.cast<int>();
final List<String> savePrivateKeyList =
changeIntListToStringList(privateKeyData);
Storage.setStringList(saveBluePrivateKey, savePrivateKeyList);
// signKey
final List<int> signKeyData =
state.keyInfos.value.bluetooth!.signKey!.cast<int>();
final List<String> saveSignKeyList = changeIntListToStringList(signKeyData);
Storage.setStringList(saveBlueSignKey, saveSignKeyList);
final bool ifHaveKey = await Storage.ifHaveKey(saveBlueToken);
if (!ifHaveKey) {
final List<String> saveTokenList =
changeIntListToStringList(<int>[0, 0, 0, 0]);
Storage.setStringList(saveBlueToken, saveTokenList);
}
}
@override
Widget build(BuildContext context) {
loadData();
return F.sw(skyCall: skWidget, xhjCall: xhjWidget);
}
//鑫泓佳布局
Widget xhjWidget() {
return Scaffold(
backgroundColor: Colors.white,
body: Obx(() {
return Stack(
children: <Widget>[
Column(
children: <Widget>[
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()));
}),
],
),
Visibility(
visible: state.iSClosedUnlockSuccessfulPopup.value,
child: Container(
width: 1.sw,
height: 1.sh - ScreenUtil().statusBarHeight * 2,
color: Colors.black.withOpacity(0.3),
child: _unlockSuccessWidget()),
)
],
);
}),
);
}
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: 30.h),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(16.r),
boxShadow: <BoxShadow>[
BoxShadow(
color: Colors.black.withOpacity(0.15),
offset: const Offset(0, 0),
blurRadius: 10.r,
spreadRadius: 0,
),
]),
child: Row(
children: <Widget>[
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>[
BoxShadow(
color: Colors.black.withOpacity(0.15),
offset: const Offset(0, 0),
blurRadius: 10.r,
spreadRadius: 0,
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
const Spacer(),
Positioned(
child: GestureDetector(
onTap: () {
ShowTipView().showSureAlertDialog(
"${"锁电量更新时间:".tr}${DateTool().dateToYMDHNString(state.keyInfos.value.electricQuantityDate!.toString())}");
},
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
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,
),
Visibility(
visible: state
.keyInfos.value.lockFeature!.isSupportBackupBattery ==
1,
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
FlavorsImg(
child: Image.asset(
showElectricIcon(
state.electricQuantityStandby.value),
width: 30.w,
height: 24.w),
),
SizedBox(width: 2.w),
Text('${state.electricQuantityStandby.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),
],
),
)
],
),
)),
GestureDetector(
onTap: () {
if (state.openDoorBtnisUneable.value == true) {
logic.functionBlocker.block(isNeedRealNameAuthThenOpenLock);
}
},
onLongPressStart: (LongPressStartDetails details) {
if (state.openDoorBtnisUneable.value == true) {
void callback() {
setState(startUnLock);
}
logic.functionBlocker.block(callback);
}
},
child: Container(
width: 200.r,
height: 200.r,
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(100.w),
boxShadow: <BoxShadow>[
BoxShadow(
color: Colors.black.withOpacity(0.3),
offset: const Offset(0, 0),
blurRadius: 10.r,
spreadRadius: 0,
),
]),
margin: EdgeInsets.only(top: 0.h),
child: Stack(
alignment: AlignmentDirectional.center,
children: <Widget>[
if (state.openDoorBtnisUneable.value == false)
Icon(
Icons.bluetooth_searching,
size: 78.r,
color: AppColors.mainColor.withOpacity(0.6),
)
else
Image.asset(
state.isOpenPassageMode.value == 1
? 'images/icon_lock_err.png'
: 'images/icon_lock_fill.png',
width: 68.r,
height: 68.r,
color: AppColors.mainColor,
),
if (state.openLockBtnState.value == 1)
xhjBuildRotationTransition(
width: 168.r,
height: 168.r,
)
else
Positioned(
child: Image.asset(
'images/icon_circle_dotted.png',
width: 168.r,
height: 168.r,
color: state.openDoorBtnisUneable.value == false
? AppColors.mainColor.withOpacity(0.6)
: state.isOpenPassageMode.value == 1
? Colors.red
: AppColors.mainColor,
)),
],
),
),
),
const Spacer(),
Padding(
padding: EdgeInsets.only(left: 15.w, right: 00.w, bottom: 15.h),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Text(
TranslationLoader
.lanKeys!.clickUnlockAndHoldDownClose!.tr,
style: TextStyle(
color: AppColors.darkGrayTextColor,
fontSize: 20.sp,
),
),
SizedBox(
height: 16.h,
),
adminInfoView(center: false, max: false),
],
),
],
),
)
],
),
);
}
//斯凯布局
Widget skWidget() {
return ListView(
children: <Widget>[
Visibility(
visible:
(state.keyInfos.value.keyType == XSConstantMacro.keyTypeTime ||
state.keyInfos.value.keyType ==
XSConstantMacro.keyTypeLoop) && // 限时、循环
(DateTool().compareTimeGetDaysFromNow(
state.keyInfos.value.endDate!) <=
15 &&
DateTool().compareTimeGetDaysFromNow(
state.keyInfos.value.endDate!) >=
0) && // 0到30天
(state.keyInfos.value.keyStatus ==
XSConstantMacro.keyStatusNormalUse ||
state.keyInfos.value.keyStatus ==
XSConstantMacro.keyStatusWaitReceive) // 正常使用、待接收
,
child: Container(
// height: 30.h,
color: const Color(0xFFFBEFD4),
padding: EdgeInsets.only(top: 8.h, bottom: 8.h),
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
"${"钥匙将在".tr}${DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!)}${"天后失效".tr}",
style: TextStyle(
color: const Color(0xffCBA74B), fontSize: 24.sp))
],
),
),
),
Stack(children: <Widget>[
Container(
width: 1.sw,
height: 1.sh - ScreenUtil().statusBarHeight,
color: Colors.white,
child: Column(
children: <Widget>[
topWidget(),
SizedBox(
height: 10.h,
),
Obx(buildPageIndicator),
Expanded(
child: Container(
margin: EdgeInsets.only(left: 10.w, right: 10.w, top: 30.h),
child: PageView(
scrollDirection: Axis.horizontal,
controller: state.pageController,
children: <Widget>[
Obx(bottomWidget),
attachmentWidget(),
],
),
)),
],
),
),
Visibility(
visible: state.iSClosedUnlockSuccessfulPopup.value,
child: Container(
width: 1.sw,
height: 1.sh - ScreenUtil().statusBarHeight * 2,
color: Colors.black.withOpacity(0.3),
child: _unlockSuccessWidget()),
)
]),
],
);
}
Widget topWidget() {
return Column(
children: <Widget>[
F.sw(
skyCall: () => SizedBox(height: 50.h),
xhjCall: () => Padding(
padding: EdgeInsets.only(
top: 12.h,
left: 15.w,
bottom: 16.h,
right: 15.w,
),
child: adminInfoView(center: false, add: true),
),
),
Stack(
children: <Widget>[
Center(
child: Text(
state.lockAlias.value,
style: TextStyle(
fontSize: 22.sp,
fontWeight: FontWeight.w400,
color: state.isOpenPassageMode.value == 1
? AppColors.openPassageModeColor
: AppColors.darkGrayTextColor),
)),
Positioned(
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
GestureDetector(
onTap: () {
ShowTipView().showSureAlertDialog(
"${"电量更新时间:".tr}${DateTool().dateToYMDHNString(state.keyInfos.value.electricQuantityDate!.toString())}");
},
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
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),
],
),
),
Visibility(
visible: state
.keyInfos.value.lockFeature!.isSupportBackupBattery ==
1,
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
FlavorsImg(
child: Image.asset(
showElectricIcon(
state.electricQuantityStandby.value),
width: 30.w,
height: 24.w),
),
SizedBox(width: 2.w),
Text('${state.electricQuantityStandby.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),
],
),
),
],
))
],
),
F.sw(
skyCall: () => SizedBox(height: 30.h),
xhjCall: () => SizedBox(height: 15.h),
),
Container(
// width: 1.sw,
color: Colors.white,
height: 330.w,
child: Stack(
children: <Widget>[
Center(
child: GestureDetector(
onTap: () {
if (state.openDoorBtnisUneable.value == true) {
logic.functionBlocker.block(isNeedRealNameAuthThenOpenLock);
}
},
onLongPressStart: (LongPressStartDetails details) {
if (state.openDoorBtnisUneable.value == true) {
void callback() {
setState(startUnLock);
}
logic.functionBlocker.block(callback);
}
},
child: Stack(
children: <Widget>[
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: 330.w,
height: 330.w,
// color: AppColors.primaryTopColor,
),
),
if (state.openDoorBtnisUneable.value == false)
Positioned(
child: FlavorsImg(
child: Image.asset(
'images/main/icon_main_openLockBtn_grey.png',
width: 330.w,
height: 330.w,
),
),
)
else
state.openLockBtnState.value == 1
? buildRotationTransition(
width: 330.w,
height: 330.w,
)
: 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: 330.w,
height: 330.w,
),
)),
],
),
)),
Positioned(
right: 90.w,
bottom: 1,
child: Obx(() => Visibility(
visible:
state.keyInfos.value.lockSetting!.remoteUnlock == 1,
child: GestureDetector(
onTap: () {
ShowCupertinoAlertView().isToRemoteUnLockAlert(
remoteUnlockAction: () {
if (state.keyInfos.value.hasGateway != 1) {
logic.showToast('附近没有可用网关');
}
});
},
child: Align(
alignment: const Alignment(0.6, 1),
child: FlavorsImg(
child: Image.asset(
'images/main/icon_main_remoteUnlocking.png',
width: 50.w,
height: 52.w,
),
)),
))),
)
],
),
),
SizedBox(
height: 30.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
logic.getKeyStatusTextAndShow(),
style: TextStyle(
fontSize: 22.sp,
color: AppColors.btnDisableColor,
fontWeight: FontWeight.w500),
),
],
),
SizedBox(
height: 30.h,
),
F.sw(skyCall: adminInfoView, xhjCall: () => const SizedBox()),
SizedBox(
height: 20.h,
),
Divider(
height: 1,
color: AppColors.greyLineColor,
indent: 20.w,
endIndent: 20.w,
)
],
);
}
Widget adminInfoView(
{bool center = true, bool max = true, bool add = false}) {
return Row(
mainAxisAlignment:
center ? MainAxisAlignment.center : MainAxisAlignment.start,
mainAxisSize: max ? MainAxisSize.max : MainAxisSize.min,
children: <Widget>[
Image.asset(
'images/icon_electronicKey_admin.png',
width: 24.w,
height: 20.w,
color: AppColors.blackColor, //应根据状态显示(当前角色为超级管理员 应显示蓝色图标)
),
SizedBox(width: 6.w),
Text(
state.keyInfos.value.isLockOwner == 1
? TranslationLoader.lanKeys!.superAdmin!.tr
: (state.keyInfos.value.keyRight == 1
? TranslationLoader.lanKeys!.authorizedAdmin!.tr
: TranslationLoader.lanKeys!.normalUser!.tr),
style: TextStyle(fontSize: 20.sp, color: AppColors.darkGrayTextColor),
),
if (add) SizedBox(width: 20.w) else SizedBox(width: 40.w),
FlavorsImg(
child: Image.asset(
state.keyInfos.value.hasGateway == 1
? 'images/main/icon_main_remoteUnlocking.png'
: 'images/main/icon_main_remoteUnlocking_grey.png',
width: 24.w,
height: 20.w,
),
),
SizedBox(width: 6.w),
Text(
TranslationLoader.lanKeys!.gatewayDevice!.tr,
style: TextStyle(
fontSize: 20.sp,
color: state.keyInfos.value.hasGateway == 1
? AppColors.mainColor
: AppColors.btnDisableColor),
),
if (add) SizedBox(width: 20.w) else SizedBox(width: 40.w),
FlavorsImg(
child: Image.asset('images/main/icon_lockDetail_needNetwork.png',
width: 24.w,
height: 20.w,
color: state.keyInfos.value.appUnlockOnline == 1
? AppColors.mainColor
: AppColors.btnDisableColor),
),
SizedBox(width: 6.w),
Text(
'手机需联网',
style: TextStyle(
fontSize: 20.sp,
color: state.keyInfos.value.appUnlockOnline == 1
? AppColors.mainColor
: AppColors.btnDisableColor),
),
if (add) ...<Widget>[
const Spacer(),
GestureDetector(
onTap: () {
Get.toNamed(Routers.selectLockTypePage);
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
FlavorsImg(
child: Image.asset(
'images/mine/icon_mine_main_addLock.png',
width: 24.w,
height: 20.w,
),
),
Text(
TranslationLoader.lanKeys!.addDevice!.tr,
style: TextStyle(
fontSize: 20.sp, color: AppColors.darkGrayTextColor),
)
],
),
),
),
]
],
);
}
//旋转动画
Widget xhjBuildRotationTransition(
{required double width, required double height}) {
return Positioned(
child: RotationTransition(
//设置动画的旋转中心
alignment: Alignment.center,
//动画控制器
turns: state.animationController!,
//将要执行动画的子view
child: Image.asset(
'images/icon_circle_dotted.png',
width: width,
height: height,
color: state.isOpenPassageMode.value == 1
? Colors.red
: AppColors.mainColor,
),
),
);
}
//旋转动画
Widget buildRotationTransition(
{required double width, required double height}) {
return Positioned(
child: RotationTransition(
//设置动画的旋转中心
alignment: Alignment.center,
//动画控制器
turns: state.animationController!,
//将要执行动画的子view
child: FlavorsImg(
child: Image.asset(
state.isOpenPassageMode.value == 1
? 'images/main/icon_main_normallyOpenMode_circle.png'
: 'images/main/icon_main_openLockBtn_circle.png',
width: width,
height: height,
),
),
),
);
}
//圆点指示器
Widget buildPageIndicator() {
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: List.generate(2, (int index) {
return Container(
width: 10.0.w,
height: 10.0.w,
margin: EdgeInsets.symmetric(vertical: 10.0.w, horizontal: 6.0.w),
decoration: BoxDecoration(
shape: BoxShape.circle,
color: state.currentPage.value == index
? AppColors.mainColor
: Colors.grey,
),
);
}),
);
}
//配件区域
Widget attachmentWidget() {
return SizedBox(
width: ScreenUtil().screenWidth - 20.w,
child: GridView.count(
crossAxisCount: 4,
// childAspectRatio: 3,
crossAxisSpacing: 20.w,
mainAxisSpacing: 0.h,
physics: const NeverScrollableScrollPhysics(),
children: getAttachmentWidget()),
);
}
// 配件配置
List<Widget> getAttachmentWidget() {
final List<Widget> showWidgetArr = <Widget>[];
// 无线键盘
// if (state.isAttendance.value == 1) {
// showWidgetArr.add(bottomItem(
// 'images/main/icon_lockDetail_WirelessKeyboard.png',
// '无线键盘',
// state.bottomBtnisUneable.value,
// () {}));
// }
// // 照明
// showWidgetArr.add(bottomItem('images/main/icon_lockDetail_illuminator.png',
// '照明', state.bottomBtnisUneable.value, () {}));
// // 照明
// showWidgetArr.add(bottomItem('images/main/icon_lockDetail_illuminator.png',
// '门磁', state.bottomBtnisUneable.value, () {}));
// // 门磁
// showWidgetArr.add(bottomItem('images/main/icon_lockDetail_illuminator.png',
// '开门器', state.bottomBtnisUneable.value, () {}));
// 新增配件
showWidgetArr.add(bottomItem('images/main/icon_main_addLock.png', '新增配件'.tr,
state.bottomBtnisEable.value, () {
Navigator.pushNamed(context, Routers.accessoriesListPage);
}));
return showWidgetArr;
}
Widget bottomWidget() {
return SizedBox(
width: ScreenUtil().screenWidth - 20.w,
child: GridView.count(
crossAxisCount: 4,
// childAspectRatio: 3,
crossAxisSpacing: 25.h,
mainAxisSpacing: 0.h,
physics: const NeverScrollableScrollPhysics(),
children: getBottomWidget()),
);
}
// 根据权限显示不同的底部按钮
List<Widget> getBottomWidget() {
if (state.keyInfos.value.isLockOwner == 1 ||
state.keyInfos.value.keyRight == 1) {
// 超级管理员、授权管理员
return getAllWidget();
} else {
return getNormalWidget();
}
}
// 普通用户
List<Widget> getNormalWidget() {
final List<Widget> showWidgetArr = <Widget>[];
// 考勤
if (state.isAttendance.value == 1) {
showWidgetArr.add(bottomItem(
'images/main/icon_main_clockingIn.png',
TranslationLoader.lanKeys!.checkingIn!.tr,
state.bottomBtnisEable.value, () {
Get.toNamed(Routers.checkingInListPage,
arguments: state.keyInfos.value);
}));
}
// 操作记录
showWidgetArr.add(bottomItem(
'images/main/icon_main_operatingRecord.png',
TranslationLoader.lanKeys!.operatingRecord!.tr,
state.bottomBtnisEable.value, () {
Get.toNamed(Routers.doorLockLogPage,
arguments: <String, LockListInfoItemEntity>{
'keyInfo': state.keyInfos.value
});
}));
// 设置
showWidgetArr.add(bottomItem('images/main/icon_main_set.png',
TranslationLoader.lanKeys!.set!.tr, true, () {
Get.toNamed(Routers.lockSetPage, arguments: <String, Object?>{
'lockId': state.keyInfos.value.lockId,
'isOnlyOneData': state.isOnlyOneData
});
}));
return showWidgetArr;
}
// 授权管理员、超级管理员字段
List<Widget> getAllWidget() {
final List<Widget> showWidgetArr = <Widget>[];
// 考勤
if (state.isAttendance.value == 1) {
showWidgetArr.add(bottomItem(
'images/main/icon_main_clockingIn.png',
TranslationLoader.lanKeys!.checkingIn!.tr,
state.bottomBtnisEable.value, () {
Get.toNamed(Routers.checkingInListPage,
arguments: state.keyInfos.value);
}));
}
// 电子钥匙
showWidgetArr.add(bottomItem(
'images/main/icon_main_electronicKey.png',
TranslationLoader.lanKeys!.electronicKey!.tr,
state.bottomBtnisEable.value, () {
Get.toNamed(Routers.electronicKeyListPage);
}));
// 密码
showWidgetArr.add(bottomItem(
'images/main/icon_main_password.png',
TranslationLoader.lanKeys!.password!.tr,
state.bottomBtnisEable.value, () {
Get.toNamed(Routers.passwordKeyListPage,
arguments: <String, LockListInfoItemEntity>{
'keyInfo': state.keyInfos.value
});
}));
// ic卡
if (state.keyInfos.value.lockFeature!.icCard == 1) {
showWidgetArr.add(bottomItem(
'images/main/icon_main_icCard.png',
TranslationLoader.lanKeys!.card!.tr,
state.bottomBtnisEable.value, () {
Get.toNamed(Routers.cardListPage, arguments: <String, int?>{
'lockId': state.keyInfos.value.lockId,
});
}));
}
// 指纹
if (state.keyInfos.value.lockFeature!.fingerprint == 1) {
showWidgetArr.add(bottomItem(
'images/main/icon_main_fingerprint.png',
TranslationLoader.lanKeys!.fingerprint!.tr,
state.bottomBtnisEable.value, () {
Get.toNamed(Routers.fingerprintListPage, arguments: <String, int?>{
'lockId': state.keyInfos.value.lockId,
});
}));
}
// 遥控
if (state.keyInfos.value.lockFeature!.bluetoothRemoteControl == 1) {
showWidgetArr.add(bottomItem(
'images/main/icon_main_remoteControl.png',
TranslationLoader.lanKeys!.remoteControl!.tr,
state.bottomBtnisEable.value, () {
Get.toNamed(Routers.remoteControlListPage);
}));
}
//可视对讲门锁新增->人脸
if (state.keyInfos.value.lockFeature!.d3Face == 1) {
showWidgetArr.add(
bottomItem(
'images/main/icon_face.png',
TranslationLoader.lanKeys!.humanFace!.tr,
state.bottomBtnisEable.value, () {
Get.toNamed(Routers.faceListPage, arguments: <String, int?>{
'lockId': state.keyInfos.value.lockId,
});
}),
);
}
if (state.keyInfos.value.lockFeature!.isSupportIris == 1) {
showWidgetArr.add(
bottomItem(
'images/main/icon_iris.png', '虹膜'.tr, state.bottomBtnisEable.value,
() {
Get.toNamed(Routers.irisListPage, arguments: <String, int?>{
'lockId': state.keyInfos.value.lockId,
});
}),
);
}
if (state.keyInfos.value.lockFeature!.palmVein == 1) {
showWidgetArr.add(
bottomItem(
'images/main/icon_palm.png', '手掌'.tr, state.bottomBtnisEable.value,
() {
Get.toNamed(Routers.palmListPage, arguments: <String, int?>{
'lockId': state.keyInfos.value.lockId,
});
}),
);
}
//可视对讲门锁新增->监控
if (state.keyInfos.value.lockFeature!.videoIntercom == 1) {
showWidgetArr.add(
bottomItem(
'images/main/icon_catEyes.png',
TranslationLoader.lanKeys!.monitoring!.tr,
state.bottomBtnisEable.value, () {
Get.toNamed(Routers.realTimePicturePage, arguments: <String, Object?>{
'lockName': state.keyInfos.value.lockName,
'isMonitoring': true
});
}),
);
}
// 授权管理员
if (state.keyInfos.value.isLockOwner == 1) {
showWidgetArr.add(bottomItem(
'images/main/icon_main_authorizedAdmin.png',
TranslationLoader.lanKeys!.authorizedAdmin!.tr,
state.bottomBtnisEable.value, () {
Get.toNamed(Routers.authorizedAdminListPage,
arguments: <String, LockListInfoItemEntity>{
'keyInfo': state.keyInfos.value
});
}));
}
final List<Widget> endWiddget = <Widget>[];
endWiddget.add(
// 操作记录
bottomItem(
'images/main/icon_main_operatingRecord.png',
TranslationLoader.lanKeys!.operatingRecord!.tr,
state.bottomBtnisEable.value, () {
// Get.toNamed(Routers.lockOperatingRecordPage,
// arguments: {"keyInfo": state.keyInfos.value});
Get.toNamed(Routers.doorLockLogPage,
arguments: <String, LockListInfoItemEntity>{
'keyInfo': state.keyInfos.value
});
}),
);
if (state.keyInfos.value.lockFeature!.isSupportCatEye == 1) {
//视频日志
endWiddget.add(bottomItem(
'images/main/icon_lockDetail_videoLog.png',
TranslationLoader.lanKeys!.videoLog!.tr,
state.bottomBtnisEable.value, () {
Get.toNamed(Routers.videoLogPage, arguments: <String, int?>{
'lockId': state.keyInfos.value.lockId,
});
}));
}
endWiddget.add(
// 消息提醒
bottomItem(
'images/main/icon_lockDetail_messageReminding.png',
TranslationLoader.lanKeys!.messageReminding!.tr,
state.bottomBtnisEable.value, () {
Get.toNamed(Routers.msgNotificationPage, arguments: <String, int?>{
'lockId': state.keyInfos.value.lockId,
});
}),
);
endWiddget.add(
// 设置
bottomItem('images/main/icon_main_set.png',
TranslationLoader.lanKeys!.set!.tr, true, () {
// logic.clickItemBtnAction(10);
Get.toNamed(Routers.lockSetPage, arguments: <String, Object?>{
'lockId': state.keyInfos.value.lockId,
'isOnlyOneData': state.isOnlyOneData,
});
}),
);
showWidgetArr.addAll(endWiddget);
return showWidgetArr;
}
Widget bottomItem(
String iconUrl, String name, bool bottomBtnisEable, Function() onClick) {
final Widget child = F.sw(
skyCall: () => Container(
color: Colors.white,
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
SizedBox(
width: 42.w,
height: 42.h,
child: FlavorsImg(
black: true,
child: Image.asset(iconUrl,
width: 42.w,
height: 42.w,
color: bottomBtnisEable
? AppColors.mainColor
: AppColors.lockDetailBottomBtnUneable,
fit: BoxFit.fitWidth),
),
),
SizedBox(height: 10.w),
Expanded(
child: Text(name,
style: TextStyle(
fontSize: 20.sp,
color: bottomBtnisEable
? AppColors.blackColor
: 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: <Widget>[
SizedBox(
width: 42.w,
height: 42.h,
child: FlavorsImg(
black: true,
child: Image.asset(iconUrl,
width: 42.w,
height: 42.w,
color: bottomBtnisEable
? AppColors.mainColor
: AppColors.lockDetailBottomBtnUneable,
fit: BoxFit.fitWidth),
),
),
SizedBox(width: 20.w),
Text(
name,
style: TextStyle(
fontSize: 20.sp,
color: bottomBtnisEable
? AppColors.blackColor
: AppColors.lockDetailBottomBtnUneable),
),
],
),
));
return GestureDetector(
onTap: bottomBtnisEable
? onClick
: () {
logic.showToast('请在锁旁边完成第一次开锁'.tr);
},
child: child,
);
}
Future<void> listeningAnimations() async {
await Future<void>.delayed(Duration.zero, () {
state.animationController = AnimationController(
duration: const Duration(seconds: 1), vsync: this);
state.animationController!.repeat();
//动画开始、结束、向前移动或向后移动时会调用StatusListener
state.animationController!.addStatusListener((AnimationStatus status) {
if (status == AnimationStatus.completed) {
state.animationController!.reset();
state.animationController!.forward();
} else if (status == AnimationStatus.dismissed) {
state.animationController!.reset();
state.animationController!.forward();
}
});
});
}
String showElectricIcon(int electricnumber) {
if (electricnumber >= 100) {
return 'images/main/icon_lockElectricLevel_5.png';
} else if ((electricnumber > 50) && (electricnumber < 100)) {
return 'images/main/icon_lockElectricLevel_4.png';
} else if ((electricnumber > 25) && (electricnumber <= 50)) {
return 'images/main/icon_lockElectricLevel_3.png';
} else if ((electricnumber > 5) && (electricnumber <= 25)) {
return 'images/main/icon_lockElectricLevel_2.png';
} else if (electricnumber <= 5) {
return 'images/main/icon_lockElectricLevel_1.png';
}
return 'images/main/icon_lockElectricLevel_5.png';
}
Widget _unlockSuccessWidget() {
return Center(
child: Stack(
children: <Widget>[
Image.asset(
state.iSOpenLock.value == true
? 'images/main/unlocked_bg.png'
: 'images/main/locked_bg.png',
width: 358.w,
height: 348.h,
),
Positioned(
top: 180.h,
width: 358.w,
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Text(
state.keyInfos.value.lockAlias!,
style: TextStyle(
color: AppColors.placeholderTextColor, fontSize: 24.sp),
),
SizedBox(
height: 10.h,
),
Text(
getCurrentFormattedTime(),
style: TextStyle(
color: AppColors.darkGrayTextColor, fontSize: 24.sp),
)
],
)),
Positioned(
top: 288.h,
left: 155.w,
child: GestureDetector(
onTap: () {
state.closedUnlockSuccessfulTimer?.cancel();
setState(() {
state.iSClosedUnlockSuccessfulPopup.value = false;
});
},
child: Container(
width: 60.r,
height: 60.r,
color: Colors.transparent,
)),
),
],
),
);
}
String getCurrentFormattedTime() {
// 获取当前时间
final DateTime now = DateTime.now();
// 格式化日期和时间
final String formattedTime = DateFormat('MM/dd HH:mm').format(now);
return formattedTime;
}
//如果需要实名认证,需认证完成,方可开锁
void isNeedRealNameAuthThenOpenLock() {
state.nextAuthTime.value = state.keyInfos.value.nextFaceValidateTime ?? 0;
if (state.keyInfos.value.faceAuthentication == 1 &&
state.nextAuthTime.value > 0 &&
DateTool().compareTimeIsOvertime(state.nextAuthTime.value) == true) {
AliyunRealNameAuthProvider(
getLockInfo: state.keyInfos.value,
onCertifyResultWithTime: (bool isSuccess, int getNextAuthTime) {
state.nextAuthTime.value = getNextAuthTime;
if (isSuccess) {
// 认证成功,去开锁
setState(startOpenLock);
}
}).initAliyunRealNameAuth();
} else {
//无需认证,直接开锁
setState(startOpenLock);
}
}
void startOpenLock() {
if (state.openLockBtnState.value == 1) {
return;
}
state.iSOpenLock.value = true;
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();
}
}
void startUnLock() {
if (state.openLockBtnState.value == 1) {
return;
}
state.iSOpenLock.value = false;
state.openLockBtnState.value = 1;
state.animationController!.forward();
EasyLoading.showToast('正在尝试闭锁……'.tr, duration: 1000.milliseconds);
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();
}
}
@override
void dispose() {
/// 取消路由订阅
AppRouteObserver().routeObserver.unsubscribe(this);
state.closedUnlockSuccessfulTimer?.cancel();
_lockRefreshLockDetailInfoDataEvent?.cancel();
state.replySubscription.cancel();
state.lockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceEvent!
.cancel();
if (state.animationController != null) {
state.animationController!.dispose();
state.animationController = null;
}
super.dispose();
}
/// 从上级界面进入 当前界面即将出现
@override
void didPush() {
super.didPush();
state.ifCurrentScreen.value = true;
}
/// 返回上一个界面 当前界面即将消失
@override
void didPop() {
super.didPop();
state.ifCurrentScreen.value = false;
logic.cancelBlueConnetctToastTimer();
BlueManage().disconnect();
state.openLockBtnState.value = 0;
}
/// 从下级返回 当前界面即将出现
@override
void didPopNext() {
super.didPopNext();
state.ifCurrentScreen.value = true;
}
/// 进入下级界面 当前界面即将消失
@override
void didPushNext() {
super.didPushNext();
state.ifCurrentScreen.value = false;
logic.closeLuckStatus();
BlueManage().disconnect();
}
}