This commit is contained in:
xh 2024-07-23 14:08:40 +08:00
parent abceb3b772
commit a1bfd4a3f8
3 changed files with 98 additions and 53 deletions

View File

@ -29,6 +29,7 @@ import 'package:trans_lark/widget/speak_dialog.dart';
/// @author /// @author
/// @date: 2024-06-26 14:23:43 /// @date: 2024-06-26 14:23:43
class HomeLogic extends GetxController { class HomeLogic extends GetxController {
static HomeLogic get to => Get.find<HomeLogic>();
var lastWords = ''; var lastWords = '';
var fromLanguage = Rx<LanguageEntity?>(null); var fromLanguage = Rx<LanguageEntity?>(null);
@ -45,14 +46,19 @@ class HomeLogic extends GetxController {
@override @override
void onReady() { void onReady() {
super.onReady(); super.onReady();
_getDailyQuote(); getDailyQuote();
} }
Future<void> _getDailyQuote() async { Future<void> getDailyQuote() async {
LanguageEntity fromLanguageEntity =
TranslateLanguage().fromLanguageEntity.value;
LanguageEntity toLanguageEntity =
TranslateLanguage().toLanguageEntity.value;
var languageScene = <LanguageEntity>[ var languageScene = <LanguageEntity>[
LanguageEntity(languageCode: 'ar', languageName: 'Arabic'), LanguageEntity(languageCode: 'ar', languageName: 'Arabic'),
LanguageEntity(languageCode: 'bn', languageName: 'Bengali'), LanguageEntity(languageCode: 'bn', languageName: 'Bengali'),
LanguageEntity(languageCode: 'zh-cn', languageName: 'Chinese (Simplified)'), LanguageEntity(
languageCode: 'zh-cn', languageName: 'Chinese (Simplified)'),
LanguageEntity(languageCode: 'en', languageName: 'English'), LanguageEntity(languageCode: 'en', languageName: 'English'),
LanguageEntity(languageCode: 'fr', languageName: 'French'), LanguageEntity(languageCode: 'fr', languageName: 'French'),
LanguageEntity(languageCode: 'de', languageName: 'German'), LanguageEntity(languageCode: 'de', languageName: 'German'),
@ -65,12 +71,27 @@ class HomeLogic extends GetxController {
LanguageEntity(languageCode: 'ru', languageName: 'Russian'), LanguageEntity(languageCode: 'ru', languageName: 'Russian'),
LanguageEntity(languageCode: 'es', languageName: 'Spanish'), LanguageEntity(languageCode: 'es', languageName: 'Spanish'),
]; ];
final f = NumUtil.getRandomNumber(0, languageScene.length); fromLanguage.value = languageScene.firstWhereOrNull(
final t = NumUtil.getRandomNumberExcludingCurrent(0, languageScene.length, f); (e) => e.languageCode == fromLanguageEntity.languageCode,
fromLanguage.value = languageScene[f]; ) ??
toLanguage.value = languageScene[t]; LanguageEntity(
languageCode: 'en',
languageName: 'English',
);
toLanguage.value = languageScene.firstWhereOrNull(
(e) => e.languageCode == toLanguageEntity.languageCode,
) ??
LanguageEntity(
languageCode: 'zh-cn',
languageName: 'Chinese (Simplified)',
);
// final f = NumUtil.getRandomNumber(0, languageScene.length);
// final t = NumUtil.getRandomNumberExcludingCurrent(0, languageScene.length, f);
// fromLanguage.value = languageScene[f];
// toLanguage.value = languageScene[t];
var data = jsonDecode(await rootBundle.loadString(Assets.jsonTranslationScene)); var data =
jsonDecode(await rootBundle.loadString(Assets.jsonTranslationScene));
if (data != null && data is List) { if (data != null && data is List) {
var sceneTypeList = data.map((e) => SceneEntity.fromMap(e)).toList(); var sceneTypeList = data.map((e) => SceneEntity.fromMap(e)).toList();
if (sceneTypeList.isNotEmpty) { if (sceneTypeList.isNotEmpty) {
@ -91,7 +112,10 @@ class HomeLogic extends GetxController {
int index = 0; int index = 0;
for (var i = 0; i < keys.length; ++i) { for (var i = 0; i < keys.length; ++i) {
var e = keys[i]; var e = keys[i];
if (e == (isFrom ? fromLanguage.value?.languageName : toLanguage.value?.languageName)) { if (e ==
(isFrom
? fromLanguage.value?.languageName
: toLanguage.value?.languageName)) {
index = i; index = i;
break; break;
} }
@ -106,7 +130,9 @@ class HomeLogic extends GetxController {
if (fromLanguage.value != null && toLanguage.value != null) { if (fromLanguage.value != null && toLanguage.value != null) {
TtsManager().translatorTtsPlay( TtsManager().translatorTtsPlay(
isFrom ? fromStr.value! : toStr.value!, isFrom ? fromStr.value! : toStr.value!,
isFrom ? fromLanguage.value!.languageCode : toLanguage.value!.languageCode, isFrom
? fromLanguage.value!.languageCode
: toLanguage.value!.languageCode,
); );
} }
} }
@ -127,7 +153,8 @@ class HomeLogic extends GetxController {
isScrollControlled: true, isScrollControlled: true,
PhotoPickerBottomSheet( PhotoPickerBottomSheet(
funCamera: () async { funCamera: () async {
bool result = await PermissionUtil.checkPermission([Permission.camera]); bool result =
await PermissionUtil.checkPermission([Permission.camera]);
if (!result) return; if (!result) return;
_openCameraGallery(ImageSource.camera); _openCameraGallery(ImageSource.camera);
}, },
@ -155,29 +182,33 @@ class HomeLogic extends GetxController {
final XFile? photo = await picker.pickImage(source: source); final XFile? photo = await picker.pickImage(source: source);
if (photo != null) { if (photo != null) {
Get.to(() => SelectImageAreaTextDetect( Get.to(() => SelectImageAreaTextDetect(
detectOnce: true, detectOnce: true,
enableImageInteractions: true, enableImageInteractions: true,
imagePath: photo.path, imagePath: photo.path,
onDetectText: (v) { onDetectText: (v) {
if (v is String) { if (v is String) {
detectedValue = v; detectedValue = v;
} }
if (v is List) { if (v is List) {
int counter = 0; int counter = 0;
for (var element in v) { for (var element in v) {
detectedValue += "$counter. \t\t $element \n\n"; detectedValue += "$counter. \t\t $element \n\n";
counter++; counter++;
} }
} }
}, },
onDetectError: (error) { onDetectError: (error) {
///This error will occurred in Android only while user will try to crop image at max zoom level then ml kit will throw max 32 height/width exception ///This error will occurred in Android only while user will try to crop image at max zoom level then ml kit will throw max 32 height/width exception
if (error is PlatformException && (error.message?.contains("InputImage width and height should be at least 32!") ?? false)) { if (error is PlatformException &&
BaseEasyLoading.toast('Selected area should be able to crop image with at least 32 width and height.'); (error.message?.contains(
} "InputImage width and height should be at least 32!") ??
}, false)) {
))?.then( BaseEasyLoading.toast(
(onValue) { 'Selected area should be able to crop image with at least 32 width and height.');
}
},
))?.then(
(onValue) {
if (ObjUtil.isEmpty(detectedValue)) { if (ObjUtil.isEmpty(detectedValue)) {
BaseEasyLoading.toast('No text recognized'); BaseEasyLoading.toast('No text recognized');
return; return;
@ -192,10 +223,12 @@ class HomeLogic extends GetxController {
} }
Future<void> onTapSpeak() async { Future<void> onTapSpeak() async {
bool micResult = await PermissionUtil.checkPermission([Permission.microphone]); bool micResult =
await PermissionUtil.checkPermission([Permission.microphone]);
if (!micResult) return; if (!micResult) return;
if (Platform.isIOS) { if (Platform.isIOS) {
bool speechResult = await PermissionUtil.checkPermission([Permission.speech]); bool speechResult =
await PermissionUtil.checkPermission([Permission.speech]);
if (!speechResult) return; if (!speechResult) return;
} }
await Get.dialog( await Get.dialog(
@ -211,7 +244,9 @@ class HomeLogic extends GetxController {
if (SpeechToTextManager().isListening.value) { if (SpeechToTextManager().isListening.value) {
_openTranslatorResultPage(); _openTranslatorResultPage();
} else { } else {
SpeechToTextManager().startListening(TranslateLanguage().fromLanguageEntity.value.languageCode, _onSpeechResult); SpeechToTextManager().startListening(
TranslateLanguage().fromLanguageEntity.value.languageCode,
_onSpeechResult);
} }
} else { } else {
Get.back(); Get.back();
@ -247,10 +282,12 @@ class HomeLogic extends GetxController {
} }
Future<void> openFaceToFace() async { Future<void> openFaceToFace() async {
bool micResult = await PermissionUtil.checkPermission([Permission.microphone]); bool micResult =
await PermissionUtil.checkPermission([Permission.microphone]);
if (!micResult) return; if (!micResult) return;
if (Platform.isIOS) { if (Platform.isIOS) {
bool speechResult = await PermissionUtil.checkPermission([Permission.speech]); bool speechResult =
await PermissionUtil.checkPermission([Permission.speech]);
if (!speechResult) return; if (!speechResult) return;
} }
Get.toNamed(GetRouter.faceToFace); Get.toNamed(GetRouter.faceToFace);

View File

@ -145,7 +145,8 @@ class HomePage extends StatelessWidget {
height: 76, height: 76,
alignment: Alignment.center, alignment: Alignment.center,
decoration: BoxDecoration( decoration: BoxDecoration(
color: const Color.fromARGB(213, 69, 168, 254), color:
const Color.fromARGB(213, 69, 168, 254),
borderRadius: BorderRadius.circular(16), borderRadius: BorderRadius.circular(16),
border: Border.all( border: Border.all(
width: 1.5, width: 1.5,
@ -168,7 +169,8 @@ class HomePage extends StatelessWidget {
), ),
), ),
Padding( Padding(
padding: const EdgeInsets.only(right: 20), padding:
const EdgeInsets.only(right: 20),
child: GestureDetector( child: GestureDetector(
onTap: logic.onTapSpeak, onTap: logic.onTapSpeak,
child: Container( child: Container(
@ -177,10 +179,11 @@ class HomePage extends StatelessWidget {
padding: const EdgeInsets.all(5), padding: const EdgeInsets.all(5),
decoration: BoxDecoration( decoration: BoxDecoration(
color: const Color(0xff8BCFFE), color: const Color(0xff8BCFFE),
borderRadius: BorderRadius.circular(18), borderRadius:
BorderRadius.circular(18),
), ),
child: child: SvgPicture.asset(
SvgPicture.asset(Assets.svgHomeVoice), Assets.svgHomeVoice),
), ),
), ),
) )
@ -188,13 +191,9 @@ class HomePage extends StatelessWidget {
), ),
), ),
), ),
const SizedBox( const SizedBox(height: 20),
height: 20,
),
const LanguageBar(), const LanguageBar(),
const SizedBox( const SizedBox(height: 20),
height: 20,
),
], ],
), ),
], ],
@ -323,7 +322,9 @@ class HomePage extends StatelessWidget {
children: [ children: [
Obx(() { Obx(() {
return Text( return Text(
logic.fromLanguage.value != null ? logic.fromLanguage.value!.languageName : '', logic.fromLanguage.value != null
? logic.fromLanguage.value!.languageName
: '',
style: const TextStyle( style: const TextStyle(
fontSize: 12, fontSize: 12,
color: Color(0xffC2C3C5), color: Color(0xffC2C3C5),
@ -354,7 +355,8 @@ class HomePage extends StatelessWidget {
height: 24, height: 24,
padding: const EdgeInsets.all(3), padding: const EdgeInsets.all(3),
decoration: BoxDecoration( decoration: BoxDecoration(
color: const Color.fromARGB(78, 78, 202, 140), color:
const Color.fromARGB(78, 78, 202, 140),
borderRadius: BorderRadius.circular(12)), borderRadius: BorderRadius.circular(12)),
child: FittedBox( child: FittedBox(
fit: BoxFit.none, fit: BoxFit.none,
@ -382,7 +384,9 @@ class HomePage extends StatelessWidget {
children: [ children: [
Obx(() { Obx(() {
return Text( return Text(
logic.toLanguage.value != null ? logic.toLanguage.value!.languageName : '', logic.toLanguage.value != null
? logic.toLanguage.value!.languageName
: '',
style: const TextStyle( style: const TextStyle(
fontSize: 12, fontSize: 12,
color: Color(0xffC2C3C5), color: Color(0xffC2C3C5),

View File

@ -4,6 +4,7 @@ import 'package:get/get_state_manager/get_state_manager.dart';
import 'package:trans_lark/entity/language_entity.dart'; import 'package:trans_lark/entity/language_entity.dart';
import 'package:trans_lark/generated/assets.dart'; import 'package:trans_lark/generated/assets.dart';
import 'package:trans_lark/global/translate_language.dart'; import 'package:trans_lark/global/translate_language.dart';
import 'package:trans_lark/page/home/home_logic.dart';
import 'package:trans_lark/widget/base_scrollbar.dart'; import 'package:trans_lark/widget/base_scrollbar.dart';
import 'package:trans_lark/widget/language_bar.dart'; import 'package:trans_lark/widget/language_bar.dart';
@ -112,6 +113,9 @@ class LanguageBottomSheet extends StatelessWidget {
fn?.languageName = item.languageName; fn?.languageName = item.languageName;
}); });
} }
if(Get.isRegistered<HomeLogic>()) {
HomeLogic.to.getDailyQuote();
}
} }
void _onTapFrom() { void _onTapFrom() {