fix:增加添加锁时选择语音包的页面

This commit is contained in:
liyi 2025-07-23 09:52:58 +08:00
parent b2952b3c72
commit 4045adf0b2
9 changed files with 183 additions and 51 deletions

View File

@ -1159,5 +1159,6 @@
"请确认后再继续": "Please confirm before continuing",
"需要相机权限": "Camera permission required",
"此功能的开启和关闭只能在锁附近通过手机蓝牙进行": "The activation and deactivation of this feature can only be done through Bluetooth on the phone near the lock",
"网关添加成功": "Gateway added successfully"
"网关添加成功": "Gateway added successfully",
"语音包设置": "Voice packet settings"
}

View File

@ -1101,7 +1101,7 @@
"支持的国家": "支持的国家",
"支持的国家值": "美国、加拿大、英国、澳大利亚、印度、德国、法国、意大利、西班牙、日本",
"操作流程": "操作流程",
"操作流程值":"1 用智能锁APP添加锁和网关\n\n2 在APP里开启锁的远程开锁功能这个功能默认是关闭的。如果没有这个选项则锁不支持Alexa \n\n3 在Alexa中添加Skill并用智能锁APP的账号和密码进行授权。授权成功后就可以发现账号下的设备\n\n4 在Alexa app里找到锁开启语音开锁的功能并设置语言密码\n\n5 可以通过Alexa操作锁了",
"操作流程值": "1 用智能锁APP添加锁和网关\n\n2 在APP里开启锁的远程开锁功能这个功能默认是关闭的。如果没有这个选项则锁不支持Alexa \n\n3 在Alexa中添加Skill并用智能锁APP的账号和密码进行授权。授权成功后就可以发现账号下的设备\n\n4 在Alexa app里找到锁开启语音开锁的功能并设置语言密码\n\n5 可以通过Alexa操作锁了",
"Google Home": "Google Home",
"Action name": "Action name",
"ScienerSmart": "ScienerSmart",
@ -1164,5 +1164,6 @@
"请确认后再继续": "请确认后再继续",
"需要相机权限": "需要相机权限",
"此功能的开启和关闭只能在锁附近通过手机蓝牙进行": "此功能的开启和关闭只能在锁附近通过手机蓝牙进行",
"网关添加成功": "网关添加成功"
"网关添加成功": "网关添加成功",
"语音包设置": "语音包设置",
}

View File

@ -1166,5 +1166,6 @@
"请确认后再继续": "请确认后再继续",
"需要相机权限": "需要相机权限",
"一键登录": "一键登录",
"网关添加成功": "网关添加成功"
"网关添加成功": "网关添加成功",
"语音包设置": "语音包设置"
}

View File

@ -79,10 +79,6 @@ class SpeechLanguageSettingsLogic extends BaseGetXController {
// await sendGetDeviceModelBleMessage();
}
@override
void onClose() {
_replySubscription?.cancel();
}
///
initList() async {
@ -185,7 +181,10 @@ class SpeechLanguageSettingsLogic extends BaseGetXController {
.packageData(),
);
} else if (deviceConnectionState ==
BluetoothConnectionState.disconnected) {}
BluetoothConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
}
});
}
@ -335,7 +334,6 @@ class SpeechLanguageSettingsLogic extends BaseGetXController {
@override
void dispose() async {
super.dispose();
await _replySubscription?.cancel();
_replySubscription = null;
await BlueManage().disconnect();
@ -347,5 +345,22 @@ class SpeechLanguageSettingsLogic extends BaseGetXController {
state.voiceSubcontractingIndex = 0;
state.voiceSubcontractingCount = 0;
state.data = null;
super.dispose();
}
@override
void onClose() async {
await _replySubscription?.cancel();
_replySubscription = null;
await BlueManage().disconnect();
dismissEasyLoading();
cancelBlueConnetctToastTimer();
EasyLoading.dismiss();
//
state.progress.value = 0.0;
state.voiceSubcontractingIndex = 0;
state.voiceSubcontractingCount = 0;
state.data = null;
super.onClose();
}
}

View File

@ -60,7 +60,38 @@ class _SpeechLanguageSettingsPageState
return Obx(
() => SingleChildScrollView(
child: Column(
children: _buildList(),
children: [
// Container(
// width: 1.sw,
// decoration: BoxDecoration(color: Colors.white),
// child: Column(
// children: [
// RadioListTile(
// title: Text("男声".tr),
// value: 1,
// groupValue: state.selectedValue.value,
// onChanged: (value) {
// state.selectedValue.value = int.parse(value.toString());
// },
// ),
// RadioListTile(
// title: Text("女声".tr),
// value: 2,
// groupValue: state.selectedValue.value,
// onChanged: (value) {
// state.selectedValue.value = int.parse(value.toString());
// },
// )
// ],
// ),
// ),
SizedBox(
height: 8.h,
),
Column(
children: _buildList(),
),
],
),
),
);

View File

@ -40,5 +40,7 @@ class SpeechLanguageSettingsState {
// 0.0~1.0
RxDouble progress = 0.0.obs;
RxInt selectedValue = 1.obs;
}

View File

@ -2,10 +2,13 @@ import 'dart:async';
import 'dart:typed_data';
import 'package:crypto/crypto.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:flutter_easyloading/flutter_easyloading.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/blue/blue_manage.dart';
import 'package:star_lock/blue/io_protocol/io_getDeviceModel.dart';
import 'package:star_lock/blue/io_protocol/io_voicePackageConfigure.dart';
@ -19,12 +22,14 @@ import 'package:star_lock/mine/addLock/lock_voice_setting/lock_voice_setting_sta
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import 'package:star_lock/tools/eventBusEventManage.dart';
import 'package:star_lock/tools/showTipView.dart';
import 'package:star_lock/tools/storage.dart';
import 'package:http/http.dart' as http;
class LockVoiceSettingLogic extends BaseGetXController {
LockVoiceSettingState state = LockVoiceSettingState();
StreamSubscription<Reply>? _replySubscription;
bool _isThrottled = false;
@override
void onInit() async {
@ -41,33 +46,81 @@ class LockVoiceSettingLogic extends BaseGetXController {
} else if (reply is VoicePackageConfigureProcessReply) {
_handlerVoicePackageConfigureProcess(reply);
} else if (reply is VoicePackageConfigureConfirmationReply) {
final PassthroughItem item =
state.languages[state.selectPassthroughListIndex.value];
final timbre = item.timbres[state.selectLanguageIndex.value];
final LoginEntity entity =
await ApiRepository.to.settingCurrentVoiceTimbre(
data: {
'lang': item.lang,
'timbre': timbre.timbre,
},
lockId: state.lockSetInfoData.value.lockId!,
);
if (entity.errorCode!.codeIsSuccessful) {
showSuccess('设置成功'.tr, something: () {
state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre
?.lang = item.lang;
state.lockSetInfoData.value.lockSettingInfo?.currentVoiceTimbre
?.timbre = timbre.timbre;
eventBus.fire(
PassCurrentLockInformationEvent(state.lockSetInfoData.value));
});
}
dismissEasyLoading();
handleVoiceConfigureThrottled(reply);
}
});
await sendGetDeviceModelBleMessage();
}
void handleVoiceConfigureThrottled(
VoicePackageConfigureConfirmationReply reply,
) {
if (_isThrottled) return;
_isThrottled = true;
//
_executeLogic(reply);
// 1
Future.delayed(Duration(seconds: 1), () {
_isThrottled = false;
});
}
Future<void> _executeLogic(
VoicePackageConfigureConfirmationReply reply) async {
final PassthroughItem item =
state.languages[state.selectPassthroughListIndex.value];
final timbre = item.timbres[state.selectLanguageIndex.value];
final LoginEntity entity = await ApiRepository.to.settingCurrentVoiceTimbre(
data: {
'lang': item.lang,
'timbre': timbre.timbre,
},
lockId: state.lockSetInfoData.value.lockId!,
);
if (entity.errorCode!.codeIsSuccessful) {
showCupertinoDialog(
context: Get.context!,
builder: (BuildContext context) {
return CupertinoAlertDialog(
title: Text('语音设置'.tr),
content: Text('语音设置成功'.tr),
actions: <Widget>[
CupertinoDialogAction(
child: Text(
'取消'.tr,
style: TextStyle(color: AppColors.mainColor),
),
onPressed: () {
Get.back();
},
),
CupertinoDialogAction(
child: Text(
'返回主页'.tr,
style: TextStyle(color: AppColors.mainColor),
),
onPressed: () {
state.lockSetInfoData.value.lockSettingInfo
?.currentVoiceTimbre?.lang = item.lang;
state.lockSetInfoData.value.lockSettingInfo
?.currentVoiceTimbre?.timbre = timbre.timbre;
eventBus.fire(PassCurrentLockInformationEvent(
state.lockSetInfoData.value));
Get.offAllNamed(Routers.starLockMain);
},
),
],
);
},
);
}
dismissEasyLoading();
}
void saveSpeechLanguageSettings() async {
//
if (state.progress.value > 0) {
@ -132,7 +185,11 @@ class LockVoiceSettingLogic extends BaseGetXController {
.packageData(),
);
} else if (deviceConnectionState ==
BluetoothConnectionState.disconnected) {}
BluetoothConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
// showBlueConnetctToast();
}
});
}
@ -309,14 +366,13 @@ class LockVoiceSettingLogic extends BaseGetXController {
BluetoothConnectionState.disconnected) {
dismissEasyLoading();
cancelBlueConnetctToastTimer();
showBlueConnetctToast();
// showBlueConnetctToast();
}
});
}
@override
void dispose() async {
super.dispose();
await _replySubscription?.cancel();
_replySubscription = null;
await BlueManage().disconnect();
@ -328,5 +384,23 @@ class LockVoiceSettingLogic extends BaseGetXController {
state.voiceSubcontractingIndex = 0;
state.voiceSubcontractingCount = 0;
state.data = null;
super.dispose();
}
@override
void onClose() async {
await _replySubscription?.cancel();
_replySubscription = null;
await BlueManage().disconnect();
dismissEasyLoading();
cancelBlueConnetctToastTimer();
EasyLoading.dismiss();
//
state.progress.value = 0.0;
state.voiceSubcontractingIndex = 0;
state.voiceSubcontractingCount = 0;
state.data = null;
super.onClose();
}
}

View File

@ -40,7 +40,7 @@ class _LockVoiceSettingState extends State<LockVoiceSetting> {
Get.offAllNamed(Routers.starLockMain);
},
child: Text(
'跳过',
'跳过'.tr,
style: TextStyle(
color: Colors.white,
fontSize: 24.sp,

View File

@ -84,17 +84,17 @@ class _SelectLockTypePageState extends State<SelectLockTypePage>
arguments: <String, int>{'getLockType': 1});
}),
// if (!F.isLite)
lockTypeItem('images/lockType/lockType_NFCLock.png', 'NFC无源锁'.tr, () {
CommonDataManage().seletLockType = 2;
// Navigator.pushNamed(context, Routers.addLockPage);
logic.getNearByLimits();
}),
lockTypeItem('images/lockType/lockType_NFCLock.png', 'NFC无源锁'.tr, () {
CommonDataManage().seletLockType = 2;
// Navigator.pushNamed(context, Routers.addLockPage);
logic.getNearByLimits();
}),
// if (!F.isLite)
lockTypeItem('images/lockType/lockType_padlock.png', '挂锁'.tr, () {
CommonDataManage().seletLockType = 3;
// Navigator.pushNamed(context, Routers.addLockPage);
logic.getNearByLimits();
}),
lockTypeItem('images/lockType/lockType_padlock.png', '挂锁'.tr, () {
CommonDataManage().seletLockType = 3;
// Navigator.pushNamed(context, Routers.addLockPage);
logic.getNearByLimits();
}),
lockTypeItem('images/lockType/lockType_safeLock.png', '保险箱锁'.tr, () {
CommonDataManage().seletLockType = 4;
Navigator.pushNamed(context, Routers.addLockPage,
@ -223,9 +223,16 @@ class _SelectLockTypePageState extends State<SelectLockTypePage>
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(lockTypeTitle,
style: TextStyle(
fontSize: 22.sp, color: AppColors.blackColor)),
Text(
lockTypeTitle,
maxLines: 2, //
overflow: TextOverflow.ellipsis, //
softWrap: true, //
style: TextStyle(
fontSize: 22.sp,
color: AppColors.blackColor,
),
),
],
),
),