906 lines
30 KiB
Dart
906 lines
30 KiB
Dart
import 'package:flutter/cupertino.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:intl/intl.dart';
|
|
|
|
import '../../../appRouters.dart';
|
|
import '../../../app_settings/app_colors.dart';
|
|
import '../../../blue/blue_manage.dart';
|
|
import '../../../blue/io_tool/io_tool.dart';
|
|
import '../../../tools/appRouteObserver.dart';
|
|
import '../../../tools/dateTool.dart';
|
|
import '../../../tools/jh_pop_menus.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 logic = Get.put(LockDetailLogic());
|
|
final state = Get.find<LockDetailLogic>().state;
|
|
|
|
@override
|
|
void initState() {
|
|
// TODO: implement initState
|
|
super.initState();
|
|
// Get.log("LockDetailPage initState1111");
|
|
|
|
state.keyInfos.value = widget.lockListInfoItemEntity;
|
|
state.lockUserNo = state.keyInfos.value.lockUserNo!;
|
|
if (state.lockUserNo == 0) {
|
|
state.bottomBtnisUneable.value = true;
|
|
}
|
|
state.isOnlyOneData = widget.isOnlyOneData;
|
|
// print("state.lockUserNo==${state.lockUserNo}");
|
|
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!;
|
|
|
|
BlueManage().connectDeviceName =
|
|
state.keyInfos.value.bluetooth!.bluetoothDeviceName!;
|
|
|
|
List<int> publicKeyData =
|
|
state.keyInfos.value.bluetooth!.publicKey!.cast<int>();
|
|
var saveStrList = changeIntListToStringList(publicKeyData);
|
|
Storage.setStringList(saveBluePublicKey, saveStrList);
|
|
|
|
// 私钥
|
|
List<int> privateKeyData =
|
|
state.keyInfos.value.bluetooth!.privateKey!.cast<int>();
|
|
var savePrivateKeyList = changeIntListToStringList(privateKeyData);
|
|
Storage.setStringList(saveBluePrivateKey, savePrivateKeyList);
|
|
|
|
// signKey
|
|
List<int> signKeyData =
|
|
state.keyInfos.value.bluetooth!.signKey!.cast<int>();
|
|
var saveSignKeyList = changeIntListToStringList(signKeyData);
|
|
Storage.setStringList(saveBlueSignKey, saveSignKeyList);
|
|
|
|
var saveTokenList = changeIntListToStringList([0, 0, 0, 0]);
|
|
Storage.setStringList(saveBlueToken, saveTokenList);
|
|
// logic.startScanAction();
|
|
|
|
listeningAnimations();
|
|
|
|
state.pageController.addListener(() {
|
|
state.currentPage.value = state.pageController.page!.round();
|
|
});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return ListView(
|
|
children: [
|
|
Visibility(
|
|
visible: false,
|
|
child: Container(
|
|
// height: 30.h,
|
|
color: const Color(0xFFFBEFD4),
|
|
padding: EdgeInsets.only(top: 8.h, bottom: 8.h),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Text("钥匙将在2天后失效",
|
|
style: TextStyle(
|
|
color: const Color(0xffCBA74B), fontSize: 24.sp))
|
|
],
|
|
),
|
|
),
|
|
),
|
|
Stack(children: [
|
|
Container(
|
|
width: 1.sw,
|
|
height: 1.sh - ScreenUtil().statusBarHeight * 2,
|
|
color: Colors.white,
|
|
child: Column(
|
|
children: [
|
|
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,
|
|
// child: Row(
|
|
children: [
|
|
Obx(() => bottomWidget()),
|
|
Obx(() => attachmentWidget()),
|
|
],
|
|
// ),
|
|
),
|
|
)),
|
|
],
|
|
),
|
|
),
|
|
Obx(() => Visibility(
|
|
visible: state.iSClosedUnlockSuccessfulPopup.value,
|
|
// visible: true,
|
|
child: GestureDetector(
|
|
onTap: () {
|
|
state.iSClosedUnlockSuccessfulPopup.value = false;
|
|
},
|
|
child: Container(
|
|
width: 1.sw,
|
|
height: 1.sh - ScreenUtil().statusBarHeight * 2,
|
|
color: Colors.black.withOpacity(0.3),
|
|
child: _unlockSuccessWidget()),
|
|
),
|
|
))
|
|
]),
|
|
],
|
|
);
|
|
}
|
|
|
|
Widget topWidget() {
|
|
return Column(
|
|
children: [
|
|
SizedBox(height: 50.h),
|
|
Stack(
|
|
alignment: Alignment.center,
|
|
children: [
|
|
SizedBox(
|
|
width: 1.sw - 120.w * 2,
|
|
child: Obx(() => 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: Obx(() => Column(
|
|
children: [
|
|
GestureDetector(
|
|
onTap: () {
|
|
// logic.getStarLockStatus();
|
|
showDeletAlertDialog(
|
|
context,
|
|
DateTool().dateToYMDHNSString(state
|
|
.keyInfos.value.electricQuantityDate!
|
|
.toString()));
|
|
},
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.end,
|
|
children: [
|
|
Image.asset(
|
|
showElectricIcon(
|
|
state.electricQuantity.value),
|
|
width: 30.w,
|
|
height: 24.w),
|
|
SizedBox(width: 2.w),
|
|
Text("${state.electricQuantity.value}%",
|
|
style: TextStyle(
|
|
fontSize: 18.sp,
|
|
color: AppColors.darkGrayTextColor)),
|
|
SizedBox(width: 2.w),
|
|
Icon(
|
|
Icons.info, // 使用内置的 warning 图标,它是一个叹号
|
|
color: AppColors.mainColor, // 设置图标颜色为红色
|
|
size: 25.w, // 设置图标大小为 30
|
|
),
|
|
SizedBox(width: 20.w),
|
|
],
|
|
),
|
|
),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.end,
|
|
children: [
|
|
Image.asset(
|
|
showElectricIcon(state.electricQuantity.value),
|
|
width: 30.w,
|
|
height: 24.w),
|
|
SizedBox(width: 2.w),
|
|
Text("--%",
|
|
style: TextStyle(
|
|
fontSize: 18.sp,
|
|
color: AppColors.darkGrayTextColor)),
|
|
SizedBox(width: 2.w),
|
|
Icon(
|
|
Icons.info, // 使用内置的 warning 图标,它是一个叹号
|
|
color: AppColors.mainColor, // 设置图标颜色为红色
|
|
size: 25.w, // 设置图标大小为 30
|
|
),
|
|
SizedBox(width: 20.w),
|
|
],
|
|
),
|
|
],
|
|
)))
|
|
],
|
|
),
|
|
SizedBox(height: 30.h),
|
|
Container(
|
|
// width: 1.sw,
|
|
color: Colors.white,
|
|
height: 330.w,
|
|
child: Stack(
|
|
children: [
|
|
Center(
|
|
child: GestureDetector(
|
|
child: Obx(() => Stack(
|
|
children: [
|
|
Image.asset(
|
|
// state.connectState.value == 0 ? 'images/main/icon_main_openLockBtn_grey.png' : 'images/main/icon_main_openLockBtn_center.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,
|
|
),
|
|
state.openLockBtnState.value == 1
|
|
? buildRotationTransition()
|
|
: Positioned(
|
|
child: Image.asset(
|
|
// 'images/main/icon_main_openLockBtn_circle.png',
|
|
state.isOpenPassageMode.value == 1
|
|
? 'images/main/icon_main_normallyOpenMode_circle.png'
|
|
: 'images/main/icon_main_openLockBtn_circle.png',
|
|
width: 330.w,
|
|
height: 330.w,
|
|
)),
|
|
],
|
|
)),
|
|
onTap: () {
|
|
// Get.log("点击开锁");
|
|
logic.startOpenLock();
|
|
},
|
|
onLongPressStart: (details) {
|
|
Get.log("长按闭锁");
|
|
logic.startUnLock();
|
|
},
|
|
)),
|
|
],
|
|
),
|
|
),
|
|
SizedBox(
|
|
height: 30.h,
|
|
),
|
|
// Row(
|
|
// mainAxisAlignment: MainAxisAlignment.center,
|
|
// children: [
|
|
// Text(
|
|
// '门已上锁',
|
|
// style: TextStyle(
|
|
// fontSize: 26.sp,
|
|
// color: Colors.black,
|
|
// fontWeight: FontWeight.w500),
|
|
// ),
|
|
// ],
|
|
// ),
|
|
// SizedBox(
|
|
// height: 6.h,
|
|
// ),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Obx(() => Text(
|
|
state.isOpenPassageMode.value == 1
|
|
? "常开模式启动!长按闭锁"
|
|
: TranslationLoader
|
|
.lanKeys!.clickUnlockAndHoldDownClose!.tr,
|
|
style: TextStyle(
|
|
fontSize: 22.sp,
|
|
color: AppColors.btnDisableColor,
|
|
fontWeight: FontWeight.w500),
|
|
)),
|
|
],
|
|
),
|
|
SizedBox(
|
|
height: 30.h,
|
|
),
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
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),
|
|
),
|
|
SizedBox(width: 80.w),
|
|
Image.asset(
|
|
state.keyInfos.value.remoteEnable == 1
|
|
? 'images/main/icon_main_remoteUnlocking.png'
|
|
: 'images/main/icon_main_remoteUnlocking_grey.png',
|
|
width: 24.w,
|
|
height: 20.w,
|
|
// color: state.keyInfos.value.remoteEnable == 1
|
|
// ? AppColors.btnDisableColor
|
|
// : AppColors.mainColor,
|
|
),
|
|
SizedBox(width: 6.w),
|
|
Text(
|
|
TranslationLoader.lanKeys!.gatewayDevice!.tr,
|
|
style: TextStyle(
|
|
fontSize: 20.sp,
|
|
color: state.keyInfos.value.remoteEnable == 1
|
|
? AppColors.mainColor
|
|
: AppColors.btnDisableColor),
|
|
),
|
|
],
|
|
),
|
|
SizedBox(
|
|
height: 20.h,
|
|
),
|
|
Divider(
|
|
height: 1,
|
|
color: AppColors.greyLineColor,
|
|
indent: 20.w,
|
|
endIndent: 20.w,
|
|
)
|
|
],
|
|
);
|
|
}
|
|
|
|
//旋转动画
|
|
Widget buildRotationTransition() {
|
|
return Positioned(
|
|
child: RotationTransition(
|
|
//设置动画的旋转中心
|
|
alignment: Alignment.center,
|
|
//动画控制器
|
|
turns: state.animationController,
|
|
//将要执行动画的子view
|
|
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,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
|
|
//圆点指示器
|
|
Widget buildPageIndicator() {
|
|
return Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: List.generate(2, (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() {
|
|
var 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', '新增配件',
|
|
state.bottomBtnisUneable.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() {
|
|
var showWidgetArr = <Widget>[];
|
|
// 考勤
|
|
if (state.isAttendance.value == 1) {
|
|
showWidgetArr.add(bottomItem(
|
|
'images/main/icon_main_clockingIn.png',
|
|
TranslationLoader.lanKeys!.checkingIn!.tr,
|
|
state.bottomBtnisUneable.value, () {
|
|
Get.toNamed(Routers.checkingInListPage,
|
|
arguments: state.keyInfos.value);
|
|
}));
|
|
}
|
|
// 操作记录
|
|
showWidgetArr.add(bottomItem(
|
|
'images/main/icon_main_operatingRecord.png',
|
|
TranslationLoader.lanKeys!.operatingRecord!.tr,
|
|
state.bottomBtnisUneable.value, () {
|
|
Get.toNamed(Routers.lockOperatingRecordPage,
|
|
arguments: {"keyInfo": state.keyInfos.value});
|
|
}));
|
|
|
|
// 设置
|
|
showWidgetArr.add(bottomItem('images/main/icon_main_set.png',
|
|
TranslationLoader.lanKeys!.set!.tr, state.bottomBtnisUneable.value, () {
|
|
Get.toNamed(Routers.lockSetPage, arguments: {
|
|
"lockId": state.keyInfos.value.lockId,
|
|
"isOnlyOneData": state.isOnlyOneData
|
|
});
|
|
}));
|
|
|
|
return showWidgetArr;
|
|
}
|
|
|
|
// 授权管理员、超级管理员字段
|
|
List<Widget> getAllWidget() {
|
|
var showWidgetArr = <Widget>[];
|
|
// 考勤
|
|
if (state.isAttendance.value == 1) {
|
|
showWidgetArr.add(bottomItem(
|
|
'images/main/icon_main_clockingIn.png',
|
|
TranslationLoader.lanKeys!.checkingIn!.tr,
|
|
state.bottomBtnisUneable.value, () {
|
|
Get.toNamed(Routers.checkingInListPage,
|
|
arguments: state.keyInfos.value);
|
|
}));
|
|
}
|
|
|
|
// 电子钥匙
|
|
showWidgetArr.add(bottomItem(
|
|
'images/main/icon_main_electronicKey.png',
|
|
TranslationLoader.lanKeys!.electronicKey!.tr,
|
|
state.bottomBtnisUneable.value, () {
|
|
Get.toNamed(Routers.electronicKeyListPage,
|
|
arguments: {"keyInfo": state.keyInfos.value});
|
|
}));
|
|
|
|
// 密码
|
|
showWidgetArr.add(bottomItem(
|
|
'images/main/icon_main_password.png',
|
|
TranslationLoader.lanKeys!.password!.tr,
|
|
state.bottomBtnisUneable.value, () {
|
|
Get.toNamed(Routers.passwordKeyListPage,
|
|
arguments: {"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.bottomBtnisUneable.value, () {
|
|
// logic.showToast("普通用户第一次需要在锁旁边操作哦。", something: () {
|
|
// logic.showEasyLoading();
|
|
// });
|
|
Get.toNamed(Routers.cardListPage, arguments: {
|
|
"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.bottomBtnisUneable.value, () {
|
|
Get.toNamed(Routers.fingerprintListPage, arguments: {
|
|
"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.bottomBtnisUneable.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.bottomBtnisUneable.value, () {
|
|
Get.toNamed(Routers.faceList, arguments: {
|
|
"lockId": state.keyInfos.value.lockId,
|
|
}); // Toast.show(msg: "功能暂未开放");
|
|
}),
|
|
);
|
|
}
|
|
|
|
//可视对讲门锁新增->监控
|
|
if (state.keyInfos.value.lockFeature!.videoIntercom == 1) {
|
|
showWidgetArr.add(
|
|
bottomItem(
|
|
'images/main/icon_catEyes.png',
|
|
TranslationLoader.lanKeys!.monitoring!.tr,
|
|
state.bottomBtnisUneable.value, () {
|
|
Get.toNamed(Routers.realTimePicturePage, arguments: {
|
|
"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.bottomBtnisUneable.value, () {
|
|
Get.toNamed(Routers.authorizedAdminListPage,
|
|
arguments: {"keyInfo": state.keyInfos.value});
|
|
}));
|
|
}
|
|
// bottomItem('images/main/icon_main_authorizedAdmin.png', TranslationLoader.lanKeys!.authorizedAdmin!.tr, state.bottomBtnisUneable.value, () {
|
|
// Get.toNamed(Routers.authorizedAdminListPage,
|
|
// arguments: {"keyInfo": state.keyInfos.value});
|
|
// })
|
|
|
|
var endWiddget = [
|
|
// 操作记录
|
|
bottomItem(
|
|
'images/main/icon_main_operatingRecord.png',
|
|
TranslationLoader.lanKeys!.operatingRecord!.tr,
|
|
state.bottomBtnisUneable.value, () {
|
|
// Get.toNamed(Routers.lockOperatingRecordPage,
|
|
// arguments: {"keyInfo": state.keyInfos.value});
|
|
Get.toNamed(Routers.doorLockLogPage,
|
|
arguments: {"keyInfo": state.keyInfos.value});
|
|
}),
|
|
// 视频日志
|
|
bottomItem(
|
|
'images/main/icon_lockDetail_videoLog.png',
|
|
TranslationLoader.lanKeys!.videoLog!.tr,
|
|
state.bottomBtnisUneable.value, () {
|
|
//视频日志
|
|
Get.toNamed(Routers.videoLogPage);
|
|
}),
|
|
// 消息提醒
|
|
bottomItem(
|
|
'images/main/icon_lockDetail_messageReminding.png',
|
|
TranslationLoader.lanKeys!.messageReminding!.tr,
|
|
state.bottomBtnisUneable.value, () {
|
|
Get.toNamed(Routers.msgNotificationPage);
|
|
}),
|
|
// 设置
|
|
bottomItem(
|
|
'images/main/icon_main_set.png',
|
|
TranslationLoader.lanKeys!.set!.tr,
|
|
state.bottomBtnisUneable.value, () {
|
|
// logic.clickItemBtnAction(10);
|
|
Get.toNamed(Routers.lockSetPage, arguments: {
|
|
"lockId": state.keyInfos.value.lockId,
|
|
"isOnlyOneData": state.isOnlyOneData,
|
|
});
|
|
}),
|
|
];
|
|
showWidgetArr.addAll(endWiddget);
|
|
return showWidgetArr;
|
|
}
|
|
|
|
//
|
|
Widget bottomItem(
|
|
String iconUrl, String name, bool isForbidden, Function() onClick) {
|
|
var width = 42.w;
|
|
var height = 42.h;
|
|
return GestureDetector(
|
|
onTap: isForbidden
|
|
? () {
|
|
logic.showToast("请在锁旁边完成第一次开锁");
|
|
}
|
|
: onClick,
|
|
child: Container(
|
|
// height: 300.h,
|
|
color: Colors.white,
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
SizedBox(
|
|
width: width,
|
|
height:
|
|
height, // isForbidden ? "${iconUrl}_uneable.png" :"${iconUrl}.png"
|
|
child: Image.asset(iconUrl,
|
|
width: width,
|
|
height: height,
|
|
color: isForbidden
|
|
? AppColors.lockDetailBottomBtnUneable
|
|
: AppColors.mainColor,
|
|
fit: BoxFit.fitWidth),
|
|
),
|
|
SizedBox(height: 10.w),
|
|
Expanded(
|
|
child: Text(name,
|
|
style: TextStyle(
|
|
fontSize: 20.sp,
|
|
color: isForbidden
|
|
? AppColors.lockDetailBottomBtnUneable
|
|
: AppColors.blackColor),
|
|
textAlign: TextAlign.center))
|
|
],
|
|
)),
|
|
);
|
|
}
|
|
|
|
listeningAnimations() async {
|
|
await Future.delayed(Duration.zero, () {
|
|
state.animationController = AnimationController(
|
|
duration: const Duration(seconds: 1), vsync: this);
|
|
state.animationController.repeat();
|
|
//动画开始、结束、向前移动或向后移动时会调用StatusListener
|
|
state.animationController.addStatusListener((status) {
|
|
// print("AnimationStatus:$status");
|
|
if (status == AnimationStatus.completed) {
|
|
state.animationController.reset();
|
|
state.animationController.forward();
|
|
} else if (status == AnimationStatus.dismissed) {
|
|
state.animationController.reset();
|
|
state.animationController.forward();
|
|
}
|
|
});
|
|
});
|
|
|
|
// logic.connectBlueAndAnimationController();
|
|
}
|
|
|
|
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';
|
|
}
|
|
|
|
//开锁成功弹出的小界面
|
|
void _showFullScreenOverlay(BuildContext context) {
|
|
showModalBottomSheet(
|
|
context: context,
|
|
isScrollControlled: true,
|
|
backgroundColor: Colors.transparent,
|
|
builder: (BuildContext context) {
|
|
return GestureDetector(
|
|
onTap: () {
|
|
Navigator.of(context).pop(); // 关闭底部表单
|
|
},
|
|
child: Container(
|
|
height: MediaQuery.of(context).size.height,
|
|
width: MediaQuery.of(context).size.width,
|
|
color: Colors.black.withOpacity(0.5),
|
|
child: _unlockSuccessWidget(),
|
|
),
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
Widget _unlockSuccessWidget() {
|
|
return Stack(
|
|
alignment: Alignment.center,
|
|
children: [
|
|
Image.asset(
|
|
state.iSOpenLock.value == true
|
|
? 'images/main/unlocked_bg.png'
|
|
: 'images/main/locked_bg.png',
|
|
width: 358.w,
|
|
height: 348.h,
|
|
),
|
|
Positioned(
|
|
top: (1.sh - ScreenUtil().statusBarHeight * 2) / 2,
|
|
child: Column(
|
|
children: [
|
|
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),
|
|
)
|
|
],
|
|
))
|
|
],
|
|
);
|
|
}
|
|
|
|
String getCurrentFormattedTime() {
|
|
// 获取当前时间
|
|
DateTime now = DateTime.now();
|
|
// 格式化日期和时间
|
|
String formattedTime = DateFormat('MM/dd HH:mm').format(now);
|
|
return formattedTime;
|
|
}
|
|
|
|
void showDeletAlertDialog(BuildContext context, String dateStr) {
|
|
showCupertinoDialog(
|
|
context: context,
|
|
builder: (context) {
|
|
return CupertinoAlertDialog(
|
|
content: Text('锁更新时间:$dateStr'),
|
|
actions: [
|
|
CupertinoDialogAction(
|
|
child: Text(TranslationLoader.lanKeys!.sure!.tr),
|
|
onPressed: () {
|
|
Get.back();
|
|
},
|
|
),
|
|
],
|
|
);
|
|
},
|
|
);
|
|
}
|
|
|
|
@override
|
|
void didChangeDependencies() {
|
|
// TODO: implement didChangeDependencies
|
|
super.didChangeDependencies();
|
|
|
|
/// 路由订阅
|
|
AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!);
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
// TODO: implement dispose
|
|
/// 取消路由订阅
|
|
// print("LockDetailPage===dispose");
|
|
AppRouteObserver().routeObserver.unsubscribe(this);
|
|
state.closedUnlockSuccessfulTimer?.cancel();
|
|
if (state.animationController != null) {
|
|
state.animationController.reset();
|
|
state.animationController.forward();
|
|
state.animationController.dispose();
|
|
}
|
|
super.dispose();
|
|
}
|
|
|
|
/// 从上级界面进入 当前界面即将出现
|
|
@override
|
|
void didPush() {
|
|
super.didPush();
|
|
print("LockDetailPage===didPush");
|
|
state.ifCurrentScreen.value = true;
|
|
}
|
|
|
|
/// 返回上一个界面 当前界面即将消失
|
|
@override
|
|
void didPop() {
|
|
super.didPop();
|
|
print("LockDetailPage===didPop");
|
|
state.ifCurrentScreen.value = false;
|
|
logic.cancelBlueConnetctToastTimer();
|
|
BlueManage().stopScan();
|
|
BlueManage().disconnect(BlueManage().connectDeviceMacAddress);
|
|
state.openLockBtnState.value = 0;
|
|
|
|
// if(state.animationController != null){
|
|
// state.animationController.reset();
|
|
// state.animationController.forward();
|
|
// state.animationController.dispose();
|
|
// }
|
|
}
|
|
|
|
/// 从下级返回 当前界面即将出现
|
|
@override
|
|
void didPopNext() {
|
|
super.didPopNext();
|
|
state.ifCurrentScreen.value = true;
|
|
// print("LockDetailPage===didPopNext");
|
|
}
|
|
|
|
/// 进入下级界面 当前界面即将消失
|
|
@override
|
|
void didPushNext() {
|
|
super.didPushNext();
|
|
// print("LockDetailPage===didPushNext");
|
|
state.ifCurrentScreen.value = false;
|
|
logic.cancelBlueConnetctToastTimer();
|
|
BlueManage().stopScan();
|
|
state.openLockBtnState.value = 0;
|
|
|
|
state.animationController.reset();
|
|
state.animationController.forward();
|
|
}
|
|
}
|