fix: 修复开锁页-给邮箱发电子钥匙、授权管理员、群发钥匙-接收者、批量授权选其他国家都能发送—关联多个bug

This commit is contained in:
“DaisyWu” 2025-03-03 18:41:57 +08:00
parent 4ec711fcc7
commit 484416255f
10 changed files with 184 additions and 129 deletions

View File

@ -333,6 +333,16 @@ class AuthorizedAdminLogic extends BaseGetXController {
} }
} }
@override
void onInit() {
super.onInit();
//
state.emailOrPhoneController.addListener(() {
state.emailOrPhone.value = state.emailOrPhoneController.text;
});
}
@override @override
void onReady() { void onReady() {
super.onReady(); super.onReady();

View File

@ -10,6 +10,7 @@ import 'package:star_lock/tools/dateTool.dart';
import 'package:star_lock/tools/pickers/pickers.dart'; import 'package:star_lock/tools/pickers/pickers.dart';
import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart'; import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart';
import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart'; import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart';
import 'package:star_lock/tools/regularExpression.dart';
import 'package:star_lock/tools/showTipView.dart'; import 'package:star_lock/tools/showTipView.dart';
import 'package:star_lock/tools/storage.dart'; import 'package:star_lock/tools/storage.dart';
@ -114,29 +115,32 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
// isHaveRightWidget: true, // isHaveRightWidget: true,
// rightWidget: getTFWidget(true, '请输入手机号或者邮箱'.tr, 1)), // rightWidget: getTFWidget(true, '请输入手机号或者邮箱'.tr, 1)),
perpetualKeyWidget('接收者'.tr, '请输入手机号或者邮箱'.tr), perpetualKeyWidget('接收者'.tr, '请输入手机号或者邮箱'.tr),
CommonItem( Obx(() => Visibility(
leftTitel: '国家/地区'.tr, visible: RegularExpression()
rightTitle: '', .isPhoneNumber(logic.state.emailOrPhone.value),
isHaveLine: true, child: CommonItem(
isHaveRightWidget: true, leftTitel: '国家/地区'.tr,
isHaveDirection: true, rightTitle: '',
rightWidget: Text( isHaveLine: true,
'${state.countryName.value} +${state.countryCode.value}', isHaveRightWidget: true,
textAlign: TextAlign.end, isHaveDirection: true,
style: rightWidget: Text(
TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor), '${state.countryName.value} +${state.countryCode.value}',
), textAlign: TextAlign.end,
action: () async { style: TextStyle(
final Object? result = await Navigator.pushNamed( fontSize: 22.sp, color: AppColors.darkGrayTextColor),
context, Routers.selectCountryRegionPage); ),
if (result != null) { action: () async {
result as Map<String, dynamic>; final Object? result = await Navigator.pushNamed(
state.countryCode.value = result['code']; context, Routers.selectCountryRegionPage);
state.countryName.value = result['countryName']; if (result != null) {
setState(() {}); result as Map<String, dynamic>;
} state.countryCode.value = result['code'];
}, state.countryName.value = result['countryName'];
), setState(() {});
}
},
))),
KeyNameItem( KeyNameItem(
leftTitel: '姓名'.tr, leftTitel: '姓名'.tr,
rightTitle: '请输入'.tr, rightTitle: '请输入'.tr,
@ -268,6 +272,10 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
) )
], ],
), ),
),
Container(
color: AppColors.greyLineColor, //
height: 2.0.h, //
) )
], ],
); );
@ -571,6 +579,9 @@ class _AuthorizedAdminPageState extends State<AuthorizedAdminPage>
BorderSide(width: 0, color: Colors.transparent)), BorderSide(width: 0, color: Colors.transparent)),
contentPadding: const EdgeInsets.symmetric(vertical: 0), contentPadding: const EdgeInsets.symmetric(vertical: 0),
), ),
onChanged: (value) {
logic.update();
},
), ),
), ),
SizedBox( SizedBox(

View File

@ -6,6 +6,7 @@ import 'package:star_lock/tools/dateTool.dart';
class AuthorizedAdminState { class AuthorizedAdminState {
final TextEditingController emailOrPhoneController = final TextEditingController emailOrPhoneController =
TextEditingController(); /// TextEditingController(); ///
RxString emailOrPhone = ''.obs; // logic的state中添加一个Rx变量
final TextEditingController keyNameController = final TextEditingController keyNameController =
TextEditingController(); // TextEditingController(); //
late TabController tabController; late TabController tabController;

View File

@ -1,4 +1,3 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:star_lock/main/lockDetail/lockSet/basicInformation/basicInformation/KeyDetailEntity.dart'; import 'package:star_lock/main/lockDetail/lockSet/basicInformation/basicInformation/KeyDetailEntity.dart';
import 'package:star_lock/network/api_repository.dart'; import 'package:star_lock/network/api_repository.dart';
@ -57,4 +56,13 @@ class VolumeAuthorizationLockLogic extends BaseGetXController {
} }
} }
@override
void onInit() {
super.onInit();
//
state.emailOrPhoneController.addListener(() {
state.emailOrPhone.value = state.emailOrPhoneController.text;
});
}
} }

View File

@ -1,4 +1,3 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
@ -11,6 +10,7 @@ import 'package:star_lock/main/lockDetail/authorizedAdmin/volumeAuthorizationLoc
import 'package:star_lock/tools/pickers/pickers.dart'; import 'package:star_lock/tools/pickers/pickers.dart';
import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart'; import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart';
import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart'; import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart';
import 'package:star_lock/tools/regularExpression.dart';
import 'package:star_lock/tools/showTipView.dart'; import 'package:star_lock/tools/showTipView.dart';
import '../../../../appRouters.dart'; import '../../../../appRouters.dart';
@ -90,40 +90,38 @@ class _VolumeAuthorizationLockPageState
isHaveLine: true, isHaveLine: true,
isHaveRightWidget: true, isHaveRightWidget: true,
rightWidget: getTFWidget( rightWidget: getTFWidget(
true, true, '请输入手机号或者邮箱'.tr, state.emailOrPhoneController)),
'请输入手机号或者邮箱'.tr, Obx(() => Visibility(
state.emailOrPhoneController)), visible: RegularExpression()
CommonItem( .isPhoneNumber(logic.state.emailOrPhone.value),
leftTitel: '国家/地区'.tr, child: CommonItem(
rightTitle: '', leftTitel: '国家/地区'.tr,
isHaveLine: true, rightTitle: '',
isHaveRightWidget: true, isHaveLine: true,
isHaveDirection: true, isHaveRightWidget: true,
rightWidget: Text( isHaveDirection: true,
'${state.countryName.value} +${state.countryCode.value}', rightWidget: Text(
textAlign: TextAlign.end, '${state.countryName.value} +${state.countryCode.value}',
style: textAlign: TextAlign.end,
TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor), style: TextStyle(
), fontSize: 22.sp, color: AppColors.darkGrayTextColor),
action: () async { ),
final Object? result = await Navigator.pushNamed( action: () async {
context, Routers.selectCountryRegionPage); final Object? result = await Navigator.pushNamed(
if (result != null) { context, Routers.selectCountryRegionPage);
result as Map<String, dynamic>; if (result != null) {
state.countryCode.value = result['code']; result as Map<String, dynamic>;
state.countryName.value = result['countryName']; state.countryCode.value = result['code'];
// setState(() {}); state.countryName.value = result['countryName'];
} // setState(() {});
}, }
), },
))),
CommonItem( CommonItem(
leftTitel: '姓名'.tr, leftTitel: '姓名'.tr,
rightTitle: '', rightTitle: '',
isHaveRightWidget: true, isHaveRightWidget: true,
rightWidget: getTFWidget( rightWidget: getTFWidget(false, '请输入'.tr, state.keyNameController)),
false,
'请输入'.tr,
state.keyNameController)),
Container(height: 10.h), Container(height: 10.h),
], ],
); );
@ -186,7 +184,8 @@ class _VolumeAuthorizationLockPageState
: state.lockIdList.length.toString(), : state.lockIdList.length.toString(),
isHaveDirection: true, isHaveDirection: true,
action: () async { action: () async {
final result = await Get.toNamed(Routers.massSendLockGroupListPage, final result = await Get.toNamed(
Routers.massSendLockGroupListPage,
arguments: <String, Object>{ arguments: <String, Object>{
'keyLimits': '1', 'keyLimits': '1',
'lockIdList': state.lockIdList.value 'lockIdList': state.lockIdList.value

View File

@ -4,8 +4,11 @@ import 'package:get/get.dart';
class VolumeAuthorizationLockState { class VolumeAuthorizationLockState {
final FlutterContactPicker contactPicker = FlutterContactPicker(); final FlutterContactPicker contactPicker = FlutterContactPicker();
final TextEditingController emailOrPhoneController = TextEditingController(); /// final TextEditingController emailOrPhoneController =
final TextEditingController keyNameController = TextEditingController(); // TextEditingController(); ///
RxString emailOrPhone = ''.obs; // logic的state中添加一个Rx变量
final TextEditingController keyNameController =
TextEditingController(); //
late Contact contact; late Contact contact;
RxList<int> lockIdList = <int>[].obs; RxList<int> lockIdList = <int>[].obs;
RxBool isSendSuccess = false.obs; RxBool isSendSuccess = false.obs;

View File

@ -1,4 +1,3 @@
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -17,7 +16,8 @@ import 'massSendElectronicKey_logic.dart';
import 'massSendElectronicKey_state.dart'; import 'massSendElectronicKey_state.dart';
class MassSendElectronicKeyPage extends StatefulWidget { class MassSendElectronicKeyPage extends StatefulWidget {
const MassSendElectronicKeyPage({required this.type, Key? key}) : super(key: key); const MassSendElectronicKeyPage({required this.type, Key? key})
: super(key: key);
final String type; final String type;
@override @override
@ -26,8 +26,10 @@ class MassSendElectronicKeyPage extends StatefulWidget {
} }
class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> { class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
final MassSendElectronicKeyLogic logic = Get.put(MassSendElectronicKeyLogic()); final MassSendElectronicKeyLogic logic =
final MassSendElectronicKeyState state = Get.find<MassSendElectronicKeyLogic>().state; Get.put(MassSendElectronicKeyLogic());
final MassSendElectronicKeyState state =
Get.find<MassSendElectronicKeyLogic>().state;
@override @override
initState() { initState() {
@ -47,9 +49,7 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
state.type.value = widget.type; state.type.value = widget.type;
return SingleChildScrollView( return SingleChildScrollView(
child: state.isDemoMode child: state.isDemoMode ? indexChangeWidget() : Obx(indexChangeWidget),
? indexChangeWidget()
: Obx(indexChangeWidget),
); );
} }
@ -153,25 +153,25 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
return Column( return Column(
children: <Widget>[ children: <Widget>[
Obx(() => CommonItem( Obx(() => CommonItem(
leftTitel: '接收者'.tr, leftTitel: '接收者'.tr,
rightTitle: state.receiverList.value.isEmpty rightTitle: state.receiverList.value.isEmpty
? '请添加'.tr ? '请添加'.tr
: state.receiverList.value.length.toString(), : state.receiverList.value.length.toString(),
isHaveLine: true, isHaveLine: true,
isHaveDirection: true, isHaveDirection: true,
action: () { action: () {
Navigator.pushNamed(context, Routers.massSendReceiverPage, Navigator.pushNamed(context, Routers.massSendReceiverPage,
arguments: <String, List>{ arguments: <String, List>{
'lockUserList': state.receiverList.value, 'lockUserList': state.receiverList.value,
}).then((Object? value) { }).then((Object? value) {
if (value != null) { if (value != null) {
value as Map<String, dynamic>; value as Map<String, dynamic>;
state.receiverList.value = value['lockUserList']; state.receiverList.value = value['lockUserList'];
// setState(() {}); // setState(() {});
} }
}); });
}, },
)), )),
CommonItem( CommonItem(
leftTitel: '国家/地区'.tr, leftTitel: '国家/地区'.tr,
rightTitle: '', rightTitle: '',
@ -202,7 +202,8 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
: state.lockIdList.length.toString(), : state.lockIdList.length.toString(),
isHaveDirection: true, isHaveDirection: true,
action: () async { action: () async {
final result = await Get.toNamed(Routers.massSendLockGroupListPage, final result = await Get.toNamed(
Routers.massSendLockGroupListPage,
arguments: <String, Object>{ arguments: <String, Object>{
'keyLimits': '2', 'keyLimits': '2',
'lockIdList': state.lockIdList 'lockIdList': state.lockIdList
@ -235,7 +236,8 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
PDuration selectDate = PDuration selectDate =
PDuration.parse(DateTime.tryParse(state.beginTime.value)); PDuration.parse(DateTime.tryParse(state.beginTime.value));
Pickers.showDatePicker(context, Pickers.showDatePicker(context,
selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { selectDate: selectDate,
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
state.beginTime.value = DateTool().getYMDHNDateString(p, 1); state.beginTime.value = DateTool().getYMDHNDateString(p, 1);
}); });
})), })),
@ -244,8 +246,11 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
rightTitle: state.endTime.value, rightTitle: state.endTime.value,
isHaveDirection: true, isHaveDirection: true,
action: () { action: () {
PDuration selectDate = PDuration.parse(DateTime.tryParse(state.endTime.value)); PDuration selectDate =
Pickers.showDatePicker(context, selectDate: selectDate, mode: DateMode.YMDHM, onConfirm: (PDuration p) { PDuration.parse(DateTime.tryParse(state.endTime.value));
Pickers.showDatePicker(context,
selectDate: selectDate,
mode: DateMode.YMDHM, onConfirm: (PDuration p) {
state.endTime.value = DateTool().getYMDHNDateString(p, 1); state.endTime.value = DateTool().getYMDHNDateString(p, 1);
}); });
})), })),
@ -279,14 +284,14 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
isHaveDirection: true, isHaveDirection: true,
isHaveLine: true, isHaveLine: true,
action: () async { action: () async {
var result = var result = await Get.toNamed(Routers.seletKeyCyclicDatePage,
await Get.toNamed(Routers.seletKeyCyclicDatePage, arguments: <String, Object>{ arguments: <String, Object>{
'validityValue': state.weekdaysList.value, 'validityValue': state.weekdaysList.value,
'starDate': state.beginTime.value, 'starDate': state.beginTime.value,
'endDate': state.endTime.value, 'endDate': state.endTime.value,
'starTime': state.effectiveDateTime.value, 'starTime': state.effectiveDateTime.value,
'endTime': state.failureDateTime.value 'endTime': state.failureDateTime.value
}); });
if (result != null && result.isNotEmpty) { if (result != null && result.isNotEmpty) {
state.weekdaysList.value = result['validityValue']; state.weekdaysList.value = result['validityValue'];
state.beginTime.value = result['starDate']; state.beginTime.value = result['starDate'];
@ -376,5 +381,4 @@ class _MassSendElectronicKeyPageState extends State<MassSendElectronicKeyPage> {
}, },
); );
} }
} }

View File

@ -39,6 +39,11 @@ class SendElectronicKeyViewLogic extends BaseGetXController {
void onInit() { void onInit() {
super.onInit(); super.onInit();
//
state.emailOrPhoneController.addListener(() {
state.emailOrPhone.value = state.emailOrPhoneController.text;
});
Storage.getBool(ifIsDemoModeOrNot) Storage.getBool(ifIsDemoModeOrNot)
.then((bool? value) => state.isDemoMode = value ?? false); .then((bool? value) => state.isDemoMode = value ?? false);
} }
@ -186,10 +191,11 @@ class SendElectronicKeyViewLogic extends BaseGetXController {
final String getMobile = (await Storage.getMobile())!; final String getMobile = (await Storage.getMobile())!;
if (entity.errorCode!.codeIsSuccessful) { if (entity.errorCode!.codeIsSuccessful) {
ApmHelper.instance.trackEvent('add_electronic_key', { ApmHelper.instance.trackEvent('add_electronic_key', {
'lock_name':BlueManage().connectDeviceName, 'lock_name': BlueManage().connectDeviceName,
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, 'account':
'date':DateTool().getNowDateWithType(1), getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
'add_electronic_key_result':'成功', 'date': DateTool().getNowDateWithType(1),
'add_electronic_key_result': '成功',
}); });
emailOrPhone = state.emailOrPhoneController.text; emailOrPhone = state.emailOrPhoneController.text;
@ -202,10 +208,11 @@ class SendElectronicKeyViewLogic extends BaseGetXController {
eventBus.fire(ElectronicKeyListRefreshUI()); eventBus.fire(ElectronicKeyListRefreshUI());
} else { } else {
ApmHelper.instance.trackEvent('add_electronic_key', { ApmHelper.instance.trackEvent('add_electronic_key', {
'lock_name':BlueManage().connectDeviceName, 'lock_name': BlueManage().connectDeviceName,
'account':getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!, 'account':
'date':DateTool().getNowDateWithType(1), getMobile.isNotEmpty ? getMobile : (await Storage.getEmail())!,
'add_electronic_key_result':'${entity.errorCode}--${entity.errorMsg}', 'date': DateTool().getNowDateWithType(1),
'add_electronic_key_result': '${entity.errorCode}--${entity.errorMsg}',
}); });
emailOrPhone = null; emailOrPhone = null;

View File

@ -17,6 +17,7 @@ import 'package:star_lock/tools/dateTool.dart';
import 'package:star_lock/tools/pickers/pickers.dart'; import 'package:star_lock/tools/pickers/pickers.dart';
import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart'; import 'package:star_lock/tools/pickers/time_picker/model/date_mode.dart';
import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart'; import 'package:star_lock/tools/pickers/time_picker/model/pduration.dart';
import 'package:star_lock/tools/regularExpression.dart';
import 'package:star_lock/tools/showTipView.dart'; import 'package:star_lock/tools/showTipView.dart';
import 'package:star_lock/tools/submitBtn.dart'; import 'package:star_lock/tools/submitBtn.dart';
@ -114,29 +115,33 @@ class _SendElectronicKeyViewState extends State<SendElectronicKeyView>
// 1, // 1,
// logic)), // logic)),
perpetualKeyWidget(logic, '接收者'.tr, '请输入手机号或者邮箱'.tr), perpetualKeyWidget(logic, '接收者'.tr, '请输入手机号或者邮箱'.tr),
CommonItem( Obx(() => Visibility(
leftTitel: '国家/地区'.tr, visible: RegularExpression()
rightTitle: '', .isPhoneNumber(logic.state.emailOrPhone.value),
isHaveLine: true, child: CommonItem(
isHaveRightWidget: true, leftTitel: '国家/地区'.tr,
isHaveDirection: true, rightTitle: '',
rightWidget: Text( isHaveLine: true,
'${logic.state.countryName} +${logic.state.countryCode}', isHaveRightWidget: true,
textAlign: TextAlign.end, isHaveDirection: true,
style: rightWidget: Text(
TextStyle(fontSize: 22.sp, color: AppColors.darkGrayTextColor), '${logic.state.countryName} +${logic.state.countryCode}',
), textAlign: TextAlign.end,
action: () async { style: TextStyle(
final Object? result = await Navigator.pushNamed( fontSize: 22.sp, color: AppColors.darkGrayTextColor),
context, Routers.selectCountryRegionPage); ),
if (result != null) { action: () async {
result as Map<String, dynamic>; final Object? result = await Navigator.pushNamed(
logic.state.countryCode = result['code']; context, Routers.selectCountryRegionPage);
logic.state.countryName = result['countryName']; if (result != null) {
logic.update(); result as Map<String, dynamic>;
} logic.state.countryCode = result['code'];
}, logic.state.countryName = result['countryName'];
), logic.update();
}
},
),
)),
CommonItem( CommonItem(
leftTitel: '姓名'.tr, leftTitel: '姓名'.tr,
rightTitle: '', rightTitle: '',
@ -589,6 +594,9 @@ class _SendElectronicKeyViewState extends State<SendElectronicKeyView>
), ),
style: TextStyle( style: TextStyle(
fontSize: 22.sp, textBaseline: TextBaseline.alphabetic), fontSize: 22.sp, textBaseline: TextBaseline.alphabetic),
onChanged: (String value) {
logic.update();
},
), ),
), ),
SizedBox( SizedBox(

View File

@ -4,8 +4,12 @@ import 'package:get/get.dart';
import 'package:star_lock/tools/dateTool.dart'; import 'package:star_lock/tools/dateTool.dart';
class SendElectronicKeyViewState { class SendElectronicKeyViewState {
//
TextEditingController emailOrPhoneController = TextEditingController emailOrPhoneController =
TextEditingController(); /// TextEditingController(); ///
//
RxString emailOrPhone = ''.obs; // logic的state中添加一个Rx变量
TextEditingController keyNameController = TextEditingController(); // TextEditingController keyNameController = TextEditingController(); //
TextEditingController realNameController = TextEditingController(); // TextEditingController realNameController = TextEditingController(); //
TextEditingController idCardController = TextEditingController(); // TextEditingController idCardController = TextEditingController(); //
@ -37,5 +41,5 @@ class SendElectronicKeyViewState {
final String timeLimitTips = '接收者在有效期内可以不限次数使用'.tr; // final String timeLimitTips = '接收者在有效期内可以不限次数使用'.tr; //
final String permanentTips = '接收者可以使用此App开关锁'.tr; // final String permanentTips = '接收者可以使用此App开关锁'.tr; //
final String onceLimitTips = '单次钥匙有效期为1小时只能使用一次'.tr; // final String onceLimitTips = '单次钥匙有效期为1小时只能使用一次'.tr; //
final String cycleLimitTips = '接收者可以在有效期内的固定时间段里,不限次数使用'.tr; // final String cycleLimitTips = '接收者可以在有效期内的固定时间段里,不限次数使用'.tr;
} }