wolfplus 2 years ago
parent
commit
c6e389ac82
  1. 43
      README.md
  2. 47
      lib/core/controllers/permission_controller.dart
  3. 0
      lib/core/themes/app_theme.dart
  4. 0
      lib/core/themes/theme_service.dart
  5. 0
      lib/core/translations/app_translations.dart
  6. 2
      lib/core/widgets/common_bottom_nav.dart
  7. 10
      lib/main.dart
  8. 2
      lib/modules/explore/controllers/explore_controller.dart
  9. 2
      lib/modules/home/controllers/home_controller.dart
  10. 4
      lib/modules/home/views/home_view.dart
  11. 2
      lib/modules/login/controllers/login_controller.dart
  12. 2
      lib/modules/login/views/login_view.dart
  13. 2
      lib/modules/pairing/controllers/pairing_controller.dart
  14. 2
      lib/modules/pairing/views/pairing_view.dart
  15. 2
      lib/modules/profile/views/profile_view.dart
  16. 2
      lib/modules/settings/controllers/settings_controller.dart
  17. 2
      lib/modules/settings/views/settings_view.dart
  18. 4
      lib/modules/splash/controllers/splash_controller.dart
  19. 1
      lib/modules/translation/controllers/translation_controller.dart
  20. 62
      lib/routes/app_pages.dart
  21. 0
      lib/routes/app_routes.dart

43
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 # 程序入口
```

47
lib/core/controllers/permission_controller.dart

@ -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<void> 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('悬浮窗权限已授予');
}
}
}
}
}

0
lib/app/theme/app_theme.dart → lib/core/themes/app_theme.dart

0
lib/app/theme/theme_service.dart → lib/core/themes/theme_service.dart

0
lib/app/translations/app_translations.dart → lib/core/translations/app_translations.dart

2
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;

10
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绑定初始化

2
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;

2
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;

4
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';
// 导入枚举

2
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, // 欢迎页面

2
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<LoginController> {
const LoginView({Key? key}) : super(key: key);

2
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';

2
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<PairingController> {

2
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<ProfileController> {
const ProfileView({Key? key}) : super(key: key);

2
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 {
// 主题服务

2
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<SettingsController> {
const SettingsView({Key? key}) : super(key: key);

4
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 {
// 进度条动画控制

1
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();

62
lib/core/routes/app_pages.dart → 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 = [

0
lib/core/routes/app_routes.dart → lib/routes/app_routes.dart

Loading…
Cancel
Save