diff --git a/lan/lan_en.json b/lan/lan_en.json index e9cf111d..2e60a8c3 100644 --- a/lan/lan_en.json +++ b/lan/lan_en.json @@ -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" } diff --git a/lan/lan_keys.json b/lan/lan_keys.json index c289bd0e..9f4edfab 100755 --- a/lan/lan_keys.json +++ b/lan/lan_keys.json @@ -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 @@ "请确认后再继续": "请确认后再继续", "需要相机权限": "需要相机权限", "此功能的开启和关闭只能在锁附近通过手机蓝牙进行": "此功能的开启和关闭只能在锁附近通过手机蓝牙进行", - "网关添加成功": "网关添加成功" + "网关添加成功": "网关添加成功", + "语音包设置": "语音包设置", } diff --git a/lan/lan_zh.json b/lan/lan_zh.json index c856e8bb..633e2931 100755 --- a/lan/lan_zh.json +++ b/lan/lan_zh.json @@ -1166,5 +1166,6 @@ "请确认后再继续": "请确认后再继续", "需要相机权限": "需要相机权限", "一键登录": "一键登录", - "网关添加成功": "网关添加成功" + "网关添加成功": "网关添加成功", + "语音包设置": "语音包设置" } diff --git a/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_logic.dart b/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_logic.dart index d96a065a..921a8ef8 100644 --- a/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_logic.dart +++ b/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_logic.dart @@ -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(); } } diff --git a/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_page.dart b/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_page.dart index 86149fd9..bb5275a8 100644 --- a/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_page.dart +++ b/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_page.dart @@ -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(), + ), + ], ), ), ); diff --git a/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_state.dart b/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_state.dart index 8bcaa4e7..02079884 100644 --- a/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_state.dart +++ b/lib/main/lockDetail/lockSet/speechLanguageSettings/speech_language_settings_state.dart @@ -40,5 +40,7 @@ class SpeechLanguageSettingsState { // 分包发送进度(0.0~1.0) RxDouble progress = 0.0.obs; - + RxInt selectedValue = 1.obs; + + } diff --git a/lib/mine/addLock/lock_voice_setting/lock_voice_setting_logic.dart b/lib/mine/addLock/lock_voice_setting/lock_voice_setting_logic.dart index 16e4fdb1..fd30419f 100644 --- a/lib/mine/addLock/lock_voice_setting/lock_voice_setting_logic.dart +++ b/lib/mine/addLock/lock_voice_setting/lock_voice_setting_logic.dart @@ -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? _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 _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: [ + 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(); } } diff --git a/lib/mine/addLock/lock_voice_setting/lock_voice_setting_page.dart b/lib/mine/addLock/lock_voice_setting/lock_voice_setting_page.dart index 39facc57..543f0903 100644 --- a/lib/mine/addLock/lock_voice_setting/lock_voice_setting_page.dart +++ b/lib/mine/addLock/lock_voice_setting/lock_voice_setting_page.dart @@ -40,7 +40,7 @@ class _LockVoiceSettingState extends State { Get.offAllNamed(Routers.starLockMain); }, child: Text( - '跳过', + '跳过'.tr, style: TextStyle( color: Colors.white, fontSize: 24.sp, diff --git a/lib/mine/addLock/selectLockType/selectLockType_page.dart b/lib/mine/addLock/selectLockType/selectLockType_page.dart index 3688d0ae..fdc9ad60 100755 --- a/lib/mine/addLock/selectLockType/selectLockType_page.dart +++ b/lib/mine/addLock/selectLockType/selectLockType_page.dart @@ -84,17 +84,17 @@ class _SelectLockTypePageState extends State arguments: {'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 mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ - 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, + ), + ), ], ), ),