diff --git a/README.md b/README.md index 9fd545d45..4d98d097a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,42 @@ -# deep_voice +# Deep Voice -A new Flutter project. +Flutter 应用程序,使用 GetX 状态管理和依赖注入。 + +## 项目目录结构 + +``` +lib/ +├─ core/ +│ ├─ bindings/ # 全局或通用的 Bindings +│ ├─ constants/ # 常量、枚举、Key、全局配置等 +│ ├─ errors/ # 异常/错误处理相关 +│ ├─ themes/ # 主题(Color, TextStyle 等) +│ ├─ translations/ # 国际化、语言相关 +│ ├─ utils/ # 通用工具类、Helper、扩展函数等 +│ └─ widgets/ # 通用的无业务逻辑的Widgets +│ +├─ data/ +│ ├─ models/ # 数据模型(可与后端DTO对应) +│ ├─ repositories/ # 数据仓库(实际操作数据 CRUD, 远程或本地) +│ ├─ services/ # 第三方或原生平台封装,如网络请求、缓存、数据库等 +│ └─ providers/ # 适配器层,比如把网络、数据库等转换为 Repository 可调用的接口 +│ +├─ modules/ +│ ├─ login/ +│ │ ├─ controllers/ # GetX Controller +│ │ ├─ views/ # 页面、Widget +│ │ ├─ bindings/ # 该模块的 Bindings +│ │ └─ ... # 其他文件 +│ ├─ home/ +│ │ ├─ controllers/ +│ │ ├─ views/ +│ │ ├─ bindings/ +│ │ └─ ... +│ └─ ... +│ +├─ routes/ +│ ├─ app_pages.dart # 定义所有页面的 Route 列表 +│ └─ app_routes.dart # 定义路由常量或路由字符串 +│ +└─ main.dart # 程序入口 +``` diff --git a/lib/core/controllers/permission_controller.dart b/lib/core/controllers/permission_controller.dart deleted file mode 100644 index 6a07b3c96..000000000 --- a/lib/core/controllers/permission_controller.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:get/get.dart'; -import 'package:permission_handler/permission_handler.dart'; -import 'dart:io' show Platform; - -class PermissionController extends GetxController { - @override - void onReady() async { - super.onReady(); - await requestPermissions(); - } - - Future requestPermissions() async { - if (Platform.isAndroid || Platform.isIOS) { - // 请求所有必要的权限 - final permissions = [ - Permission.microphone, - Permission.storage, - Permission.bluetooth, - Permission.bluetoothConnect, - ]; - - // Android 13+ 需要额外请求 POST_NOTIFICATIONS 权限 - if (Platform.isAndroid) { - permissions.add(Permission.notification); - } - - // 请求权限并打印结果 - final statuses = await permissions.request(); - - // 打印权限状态,便于调试 - statuses.forEach((permission, status) { - print('权限 $permission: $status'); - }); - - // 请求悬浮窗权限(需要特殊处理) - if (Platform.isAndroid) { - if (!await Permission.systemAlertWindow.isGranted) { - print('请求悬浮窗权限'); - final status = await Permission.systemAlertWindow.request(); - print('悬浮窗权限状态: $status'); - } else { - print('悬浮窗权限已授予'); - } - } - } - } -} \ No newline at end of file diff --git a/lib/app/theme/app_theme.dart b/lib/core/themes/app_theme.dart similarity index 100% rename from lib/app/theme/app_theme.dart rename to lib/core/themes/app_theme.dart diff --git a/lib/app/theme/theme_service.dart b/lib/core/themes/theme_service.dart similarity index 100% rename from lib/app/theme/theme_service.dart rename to lib/core/themes/theme_service.dart diff --git a/lib/app/translations/app_translations.dart b/lib/core/translations/app_translations.dart similarity index 100% rename from lib/app/translations/app_translations.dart rename to lib/core/translations/app_translations.dart diff --git a/lib/core/widgets/common_bottom_nav.dart b/lib/core/widgets/common_bottom_nav.dart index c1689bc6d..9f8c2ec08 100644 --- a/lib/core/widgets/common_bottom_nav.dart +++ b/lib/core/widgets/common_bottom_nav.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import '../routes/app_routes.dart'; +import '../../routes/app_routes.dart'; class CommonBottomNav extends StatelessWidget { final int currentIndex; diff --git a/lib/main.dart b/lib/main.dart index fa7b3a009..d256d0c33 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,13 +4,13 @@ import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:get_storage/get_storage.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'core/bindings/initial_binding.dart'; -import 'core/routes/app_pages.dart'; -import 'core/routes/app_routes.dart'; +import 'routes/app_pages.dart'; +import 'routes/app_routes.dart'; import 'dart:io'; import 'package:window_size/window_size.dart'; -import 'app/translations/app_translations.dart'; -import 'app/theme/app_theme.dart'; -import 'app/theme/theme_service.dart'; +import 'core/translations/app_translations.dart'; +import 'core/themes/app_theme.dart'; +import 'core/themes/theme_service.dart'; void main() async { // 确保Flutter绑定初始化 diff --git a/lib/modules/explore/controllers/explore_controller.dart b/lib/modules/explore/controllers/explore_controller.dart index 15d809c8c..a452df264 100644 --- a/lib/modules/explore/controllers/explore_controller.dart +++ b/lib/modules/explore/controllers/explore_controller.dart @@ -1,7 +1,7 @@ import 'package:get/get.dart'; import 'package:flutter/material.dart'; import '../../../data/providers/agent_provider.dart'; -import '../../../core/routes/app_routes.dart'; +import '../../../routes/app_routes.dart'; class AIFeature { final String title; diff --git a/lib/modules/home/controllers/home_controller.dart b/lib/modules/home/controllers/home_controller.dart index b74cd8674..5d15736b2 100644 --- a/lib/modules/home/controllers/home_controller.dart +++ b/lib/modules/home/controllers/home_controller.dart @@ -1,5 +1,5 @@ import 'package:get/get.dart'; -import '../../../core/routes/app_routes.dart'; +import '../../../routes/app_routes.dart'; import '../../../data/services/bluetooth_service.dart'; import '../../../core/utils/logger.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart' hide BluetoothService; diff --git a/lib/modules/home/views/home_view.dart b/lib/modules/home/views/home_view.dart index 526e9925f..71ae638a2 100644 --- a/lib/modules/home/views/home_view.dart +++ b/lib/modules/home/views/home_view.dart @@ -3,8 +3,8 @@ import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'dart:ui'; import '../controllers/home_controller.dart'; -import '../../../core/routes/app_pages.dart'; -import '../../../core/routes/app_routes.dart'; +import '../../../routes/app_pages.dart'; +import '../../../routes/app_routes.dart'; import '../../../core/widgets/common_bottom_nav.dart'; // 导入枚举 diff --git a/lib/modules/login/controllers/login_controller.dart b/lib/modules/login/controllers/login_controller.dart index 75ea11823..f591b32cc 100644 --- a/lib/modules/login/controllers/login_controller.dart +++ b/lib/modules/login/controllers/login_controller.dart @@ -1,6 +1,6 @@ import 'package:get/get.dart'; import 'package:flutter/material.dart'; -import '../../../core/routes/app_routes.dart'; +import '../../../routes/app_routes.dart'; enum LoginViewState { welcome, // 欢迎页面 diff --git a/lib/modules/login/views/login_view.dart b/lib/modules/login/views/login_view.dart index c4f791c82..9fda142f7 100644 --- a/lib/modules/login/views/login_view.dart +++ b/lib/modules/login/views/login_view.dart @@ -3,7 +3,7 @@ import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import '../controllers/login_controller.dart'; -import '../../../app/theme/app_theme.dart'; +import '../../../core/themes/app_theme.dart'; class LoginView extends GetView { const LoginView({Key? key}) : super(key: key); diff --git a/lib/modules/pairing/controllers/pairing_controller.dart b/lib/modules/pairing/controllers/pairing_controller.dart index c9ea4bed3..e98b1e7c3 100644 --- a/lib/modules/pairing/controllers/pairing_controller.dart +++ b/lib/modules/pairing/controllers/pairing_controller.dart @@ -1,5 +1,5 @@ import 'package:get/get.dart'; -import '../../../core/routes/app_routes.dart'; +import '../../../routes/app_routes.dart'; import '../../../data/services/bluetooth_service.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart' hide BluetoothService; import '../../../core/utils/logger.dart'; diff --git a/lib/modules/pairing/views/pairing_view.dart b/lib/modules/pairing/views/pairing_view.dart index 7341fbe48..e85143d0e 100644 --- a/lib/modules/pairing/views/pairing_view.dart +++ b/lib/modules/pairing/views/pairing_view.dart @@ -3,7 +3,7 @@ import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import '../controllers/pairing_controller.dart'; import '../../../core/widgets/common_bottom_nav.dart'; -import '../../../app/theme/app_theme.dart'; +import '../../../core/themes/app_theme.dart'; import 'package:permission_handler/permission_handler.dart'; class PairingView extends GetView { diff --git a/lib/modules/profile/views/profile_view.dart b/lib/modules/profile/views/profile_view.dart index 553f54cf1..175bb2ce8 100644 --- a/lib/modules/profile/views/profile_view.dart +++ b/lib/modules/profile/views/profile_view.dart @@ -4,7 +4,7 @@ import '../controllers/profile_controller.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import '../../../core/widgets/common_bottom_nav.dart'; import '../../../data/services/audio_service.dart'; -import '../../../core/routes/app_routes.dart'; +import '../../../routes/app_routes.dart'; class ProfileView extends GetView { const ProfileView({Key? key}) : super(key: key); diff --git a/lib/modules/settings/controllers/settings_controller.dart b/lib/modules/settings/controllers/settings_controller.dart index 7d6dc7931..3b806ecf2 100644 --- a/lib/modules/settings/controllers/settings_controller.dart +++ b/lib/modules/settings/controllers/settings_controller.dart @@ -1,6 +1,6 @@ import 'package:get/get.dart'; import 'package:flutter/material.dart'; -import '../../../app/theme/theme_service.dart'; +import '../../../core/themes/theme_service.dart'; class SettingsController extends GetxController { // 主题服务 diff --git a/lib/modules/settings/views/settings_view.dart b/lib/modules/settings/views/settings_view.dart index d9fc6c890..683076e9c 100644 --- a/lib/modules/settings/views/settings_view.dart +++ b/lib/modules/settings/views/settings_view.dart @@ -4,7 +4,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'dart:ui'; import '../controllers/settings_controller.dart'; import '../../../core/widgets/common_bottom_nav.dart'; -import '../../../core/routes/app_routes.dart'; +import '../../../routes/app_routes.dart'; class SettingsView extends GetView { const SettingsView({Key? key}) : super(key: key); diff --git a/lib/modules/splash/controllers/splash_controller.dart b/lib/modules/splash/controllers/splash_controller.dart index 309c7c78c..b12ae7050 100644 --- a/lib/modules/splash/controllers/splash_controller.dart +++ b/lib/modules/splash/controllers/splash_controller.dart @@ -1,8 +1,8 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; -import '../../../core/routes/app_routes.dart'; -import '../../../app/theme/theme_service.dart'; +import '../../../routes/app_routes.dart'; +import '../../../core/themes/theme_service.dart'; class SplashController extends GetxController { // 进度条动画控制 diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index a8b1df0e8..038b5104c 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -142,6 +142,7 @@ class TranslationController extends GetxController { void onClose() { stopRecognition(); _recognitionSubscription?.cancel(); + _voiceInteractionSubscription?.cancel(); _translationDebounceTimer?.cancel(); scrollController.dispose(); super.onClose(); diff --git a/lib/core/routes/app_pages.dart b/lib/routes/app_pages.dart similarity index 57% rename from lib/core/routes/app_pages.dart rename to lib/routes/app_pages.dart index 651b22bd6..2441f966d 100644 --- a/lib/core/routes/app_pages.dart +++ b/lib/routes/app_pages.dart @@ -1,36 +1,36 @@ import 'package:get/get.dart'; -import '../../modules/home/views/home_view.dart'; -import '../../modules/home/bindings/home_binding.dart'; -import '../../modules/explore/views/explore_view.dart'; -import '../../modules/explore/bindings/explore_binding.dart'; -import '../../modules/profile/views/profile_view.dart'; -import '../../modules/profile/bindings/profile_binding.dart'; -import '../../modules/chat/bindings/chat_binding.dart'; -import '../../modules/chat/views/chat_view.dart'; -import '../../modules/test/views/volcano_tts_test_view.dart'; -import '../../modules/test/views/azure_tts_test_view.dart'; -import '../../modules/test/views/azure_asr_test_view.dart'; -import '../../modules/test/views/volcano_asr_test_view.dart'; -import '../../modules/test/views/flutter_tts_test_view.dart'; -import '../../modules/test/views/flutter_asr_test_view.dart'; -import '../../modules/test/bindings/test_binding.dart'; -import '../../modules/test/bindings/azure_tts_test_binding.dart'; -import '../../modules/test/bindings/volcano_asr_test_binding.dart'; -import '../../modules/test/bindings/flutter_tts_test_binding.dart'; -import '../../modules/test/bindings/flutter_asr_test_binding.dart'; -import '../../modules/translation/views/translation_view.dart'; -import '../../modules/translation/bindings/translation_binding.dart'; -import '../../modules/translation/views/translation_history_view.dart'; -import '../../modules/translation/bindings/translation_history_binding.dart'; -import '../../modules/login/views/login_view.dart'; -import '../../modules/login/bindings/login_binding.dart'; -import '../../modules/splash/views/splash_view.dart'; -import '../../modules/splash/bindings/splash_binding.dart'; -import '../../modules/pairing/views/pairing_view.dart'; -import '../../modules/pairing/bindings/pairing_binding.dart'; +import '../modules/home/views/home_view.dart'; +import '../modules/home/bindings/home_binding.dart'; +import '../modules/explore/views/explore_view.dart'; +import '../modules/explore/bindings/explore_binding.dart'; +import '../modules/profile/views/profile_view.dart'; +import '../modules/profile/bindings/profile_binding.dart'; +import '../modules/chat/bindings/chat_binding.dart'; +import '../modules/chat/views/chat_view.dart'; +import '../modules/test/views/volcano_tts_test_view.dart'; +import '../modules/test/views/azure_tts_test_view.dart'; +import '../modules/test/views/azure_asr_test_view.dart'; +import '../modules/test/views/volcano_asr_test_view.dart'; +import '../modules/test/views/flutter_tts_test_view.dart'; +import '../modules/test/views/flutter_asr_test_view.dart'; +import '../modules/test/bindings/test_binding.dart'; +import '../modules/test/bindings/azure_tts_test_binding.dart'; +import '../modules/test/bindings/volcano_asr_test_binding.dart'; +import '../modules/test/bindings/flutter_tts_test_binding.dart'; +import '../modules/test/bindings/flutter_asr_test_binding.dart'; +import '../modules/translation/views/translation_view.dart'; +import '../modules/translation/bindings/translation_binding.dart'; +import '../modules/translation/views/translation_history_view.dart'; +import '../modules/translation/bindings/translation_history_binding.dart'; +import '../modules/login/views/login_view.dart'; +import '../modules/login/bindings/login_binding.dart'; +import '../modules/splash/views/splash_view.dart'; +import '../modules/splash/bindings/splash_binding.dart'; +import '../modules/pairing/views/pairing_view.dart'; +import '../modules/pairing/bindings/pairing_binding.dart'; import './app_routes.dart'; -import '../../modules/settings/views/settings_view.dart'; -import '../../modules/settings/bindings/settings_binding.dart'; +import '../modules/settings/views/settings_view.dart'; +import '../modules/settings/bindings/settings_binding.dart'; abstract class AppPages { static final pages = [ diff --git a/lib/core/routes/app_routes.dart b/lib/routes/app_routes.dart similarity index 100% rename from lib/core/routes/app_routes.dart rename to lib/routes/app_routes.dart