From d3580a6a0b208cee81936db7d3e5f9c2f62506ae Mon Sep 17 00:00:00 2001 From: "guangfei.zhao" Date: Wed, 24 Sep 2025 15:42:30 +0800 Subject: [PATCH] =?UTF-8?q?basic=5Fintl=20=E4=BF=AE=E6=94=B9=E4=B8=BA=20t?= =?UTF-8?q?=5Fbasic=5Fintl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 +---- example/pubspec.lock | 14 ++--- lib/pages/full_screen.dart | 2 +- lib/screens/main_screen.dart | 3 +- lib/services/location_service.dart | 2 +- lib/services/message_service.dart | 2 +- lib/themes/AppTheme.dart | 2 +- lib/widgets/chat/chat_window_content.dart | 6 +++ lib/widgets/chat_bubble.dart | 2 +- lib/widgets/chat_floating_icon.dart | 2 +- lib/widgets/chat_footer.dart | 2 +- lib/widgets/chat_header.dart | 2 +- lib/widgets/chat_popup.dart | 63 +++++++++++------------ lib/widgets/floating_icon.dart | 2 +- packages/basic_intl/pubspec.yaml | 2 +- pubspec.lock | 14 ++--- pubspec.yaml | 2 +- 17 files changed, 62 insertions(+), 73 deletions(-) diff --git a/README.md b/README.md index 9be9cae..90b9f7c 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # AI Chat Assistant Flutter Plugin -一个功能丰富的 AI 聊天助手 Flutter 插件,专为车载系统设计,支持语音识别、AI 对话、车控命令执行、语音合成等功能。 +一个功能丰富的 AI 聊天助手 Flutter 插件,支持语音识别、AI 对话、车控命令执行、语音合成等功能。 ## 📱 功能特性 @@ -489,16 +489,6 @@ void main() { } ``` -## 🤝 贡献指南 - -欢迎提交 Issue 和 Pull Request! - -1. Fork 本仓库 -2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) -3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) -4. 推送到分支 (`git push origin feature/AmazingFeature`) -5. 打开 Pull Request - ## 📄 许可证 本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。 @@ -529,6 +519,5 @@ void main() { - 🎵 改进语音识别和TTS服务 #### 技术栈更新 -- 📦 Flutter SDK 升级到 ^3.5.0 - 🔧 添加 Meta 注解支持 - 🌐 保持与 basic_intl 国际化包的兼容 diff --git a/example/pubspec.lock b/example/pubspec.lock index 6f3836a..54f5d5a 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -80,13 +80,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "3.1.0" - basic_intl: - dependency: transitive - description: - path: "../packages/basic_intl" - relative: true - source: path - version: "0.2.0" boolean_selector: dependency: transitive description: @@ -539,6 +532,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "3.3.0+3" + t_basic_intl: + dependency: transitive + description: + path: "../packages/basic_intl" + relative: true + source: path + version: "0.2.0" term_glyph: dependency: transitive description: diff --git a/lib/pages/full_screen.dart b/lib/pages/full_screen.dart index 8a5d579..944277f 100644 --- a/lib/pages/full_screen.dart +++ b/lib/pages/full_screen.dart @@ -1,5 +1,5 @@ import 'package:ai_chat_assistant/models/chat_message.dart'; -import 'package:basic_intl/intl.dart'; +import 'package:t_basic_intl/intl.dart'; import 'package:flutter/material.dart'; import '../enums/message_status.dart'; import '../widgets/chat_box.dart'; diff --git a/lib/screens/main_screen.dart b/lib/screens/main_screen.dart index 67ced92..f8b0927 100644 --- a/lib/screens/main_screen.dart +++ b/lib/screens/main_screen.dart @@ -37,8 +37,7 @@ class _MainScreenState extends State { ), ), // FloatingIcon(), - ChatPopup( - ) + ChatPopup() ], ), ); diff --git a/lib/services/location_service.dart b/lib/services/location_service.dart index d48aad0..479277f 100644 --- a/lib/services/location_service.dart +++ b/lib/services/location_service.dart @@ -1,5 +1,5 @@ import 'dart:convert'; -import 'package:basic_intl/intl.dart'; +import 'package:t_basic_intl/intl.dart'; import 'package:http/http.dart' as http; class LocationService { diff --git a/lib/services/message_service.dart b/lib/services/message_service.dart index 9bf7e1b..67dec1b 100644 --- a/lib/services/message_service.dart +++ b/lib/services/message_service.dart @@ -3,7 +3,7 @@ import 'dart:async'; import 'package:ai_chat_assistant/ai_chat_assistant.dart'; import 'package:ai_chat_assistant/utils/common_util.dart'; import 'package:ai_chat_assistant/utils/tts_util.dart'; -import 'package:basic_intl/intl.dart'; +import 'package:t_basic_intl/intl.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:permission_handler/permission_handler.dart'; diff --git a/lib/themes/AppTheme.dart b/lib/themes/AppTheme.dart index 24a4a16..28d91df 100644 --- a/lib/themes/AppTheme.dart +++ b/lib/themes/AppTheme.dart @@ -1,4 +1,4 @@ -import 'package:basic_intl/intl.dart'; +import 'package:t_basic_intl/intl.dart'; import 'package:flutter/material.dart'; class AppTheme { diff --git a/lib/widgets/chat/chat_window_content.dart b/lib/widgets/chat/chat_window_content.dart index 07c4e15..c24e517 100644 --- a/lib/widgets/chat/chat_window_content.dart +++ b/lib/widgets/chat/chat_window_content.dart @@ -13,8 +13,11 @@ class ChatWindowContent extends StatefulWidget { final double? maxHeight; final double? chatWidth; + final VoidCallback? onCloseWindow; + const ChatWindowContent({ super.key, + this.onCloseWindow, this.animationController, this.minHeight, this.maxHeight, @@ -55,6 +58,9 @@ class _ChatWindowContentState extends State { } void _openFullScreen() async { + if (widget.onCloseWindow != null) { + widget.onCloseWindow!(); + } final messageService = context.read(); Navigator.of(context).push( diff --git a/lib/widgets/chat_bubble.dart b/lib/widgets/chat_bubble.dart index dc52ee3..8be0a6d 100644 --- a/lib/widgets/chat_bubble.dart +++ b/lib/widgets/chat_bubble.dart @@ -1,6 +1,6 @@ import 'package:ai_chat_assistant/utils/common_util.dart'; import 'package:ai_chat_assistant/widgets/rotating_image.dart'; -import 'package:basic_intl/intl.dart'; +import 'package:t_basic_intl/intl.dart'; import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import '../enums/message_status.dart'; diff --git a/lib/widgets/chat_floating_icon.dart b/lib/widgets/chat_floating_icon.dart index b6ea66a..7c1d493 100644 --- a/lib/widgets/chat_floating_icon.dart +++ b/lib/widgets/chat_floating_icon.dart @@ -4,7 +4,7 @@ import 'package:provider/provider.dart'; import '../services/message_service.dart'; import '../pages/full_screen.dart'; import 'floating_icon_with_wave.dart'; -import 'package:basic_intl/intl.dart'; +import 'package:t_basic_intl/intl.dart'; import '../utils/assets_util.dart'; class ChatFloatingIcon extends StatefulWidget { diff --git a/lib/widgets/chat_footer.dart b/lib/widgets/chat_footer.dart index 71b013a..883c754 100644 --- a/lib/widgets/chat_footer.dart +++ b/lib/widgets/chat_footer.dart @@ -1,4 +1,4 @@ -import 'package:basic_intl/intl.dart'; +import 'package:t_basic_intl/intl.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/chat_header.dart b/lib/widgets/chat_header.dart index d9ad52f..36ededd 100644 --- a/lib/widgets/chat_header.dart +++ b/lib/widgets/chat_header.dart @@ -1,4 +1,4 @@ -import 'package:basic_intl/intl.dart'; +import 'package:t_basic_intl/intl.dart'; import 'package:flutter/material.dart'; import 'assistant_avatar.dart'; diff --git a/lib/widgets/chat_popup.dart b/lib/widgets/chat_popup.dart index 0041337..e0f89e8 100644 --- a/lib/widgets/chat_popup.dart +++ b/lib/widgets/chat_popup.dart @@ -65,6 +65,20 @@ class _ChatPopupState extends State with SingleTickerProviderStateMix }); } + _openFullScreenPage() async { + final messageService = MessageService.instance; + _removeOverlay(); + + await Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => ChangeNotifierProvider.value( + value: messageService, // 传递同一个单例实例 + child: const FullScreenPage(), + ), + ), + ); + } + @override Widget build(BuildContext context) { return ChangeNotifierProvider.value( @@ -89,16 +103,17 @@ class _ChatPopupState extends State with SingleTickerProviderStateMix Widget _buildPopupBackground() { return Positioned.fill( - child: GestureDetector( - onTap: () { - final messageService = MessageService.instance; - _removeOverlay(); - messageService.abortReply(); - messageService.initializeEmpty(); - }, - child: SizedBox.expand() - ), - ); + child: GestureDetector( + onTap: () { + final messageService = MessageService.instance; + _removeOverlay(); + messageService.abortReply(); + messageService.initializeEmpty(); + }, + child: SizedBox.expand( + child: Container( + color: Colors.black45.withValues(alpha: 0.1), + )))); } Widget _buildPopupContent(BoxConstraints constraints) { @@ -112,6 +127,7 @@ class _ChatPopupState extends State with SingleTickerProviderStateMix right: position.right, bottom: position.bottom, child: ChatWindowContent( + onCloseWindow: _removeOverlay, animationController: _partScreenAnimationController, minHeight: minHeight, maxHeight: maxHeight, @@ -131,20 +147,9 @@ class _ChatPopupState extends State with SingleTickerProviderStateMix // 先执行外部传入的 onTap(如果有) if (widget.child!.onTap != null) { widget.child!.onTap!(); - } else { - // 默认行为:关闭弹窗并打开全屏 - final messageService = context.read(); - _removeOverlay(); - - await Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => ChangeNotifierProvider.value( - value: messageService, - child: const FullScreenPage(), - ), - ), - ); } + // 默认行为:关闭弹窗并打开全屏 + await _openFullScreenPage(); }, onLongPress: () async { debugPrint('⏳ FloatingIcon onLongPress triggered! (using child properties)'); @@ -195,17 +200,7 @@ class _ChatPopupState extends State with SingleTickerProviderStateMix icon: widget.icon, onTap: () async { debugPrint('🖱️ FloatingIcon onTap triggered!'); - final messageService = context.read(); - _removeOverlay(); - - await Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => ChangeNotifierProvider.value( - value: messageService, // 传递同一个单例实例 - child: const FullScreenPage(), - ), - ), - ); + await _openFullScreenPage(); }, onLongPress: () async { debugPrint('⏳ FloatingIcon onLongPress triggered!'); diff --git a/lib/widgets/floating_icon.dart b/lib/widgets/floating_icon.dart index bcc37ed..a98ca80 100644 --- a/lib/widgets/floating_icon.dart +++ b/lib/widgets/floating_icon.dart @@ -5,7 +5,7 @@ import '../pages/full_screen.dart'; import '../screens/part_screen.dart'; import 'floating_icon_with_wave.dart'; import 'dart:async'; -import 'package:basic_intl/intl.dart'; +import 'package:t_basic_intl/intl.dart'; import '../utils/assets_util.dart'; class FloatingIcon extends StatefulWidget { diff --git a/packages/basic_intl/pubspec.yaml b/packages/basic_intl/pubspec.yaml index 8c9d942..3122e48 100644 --- a/packages/basic_intl/pubspec.yaml +++ b/packages/basic_intl/pubspec.yaml @@ -1,4 +1,4 @@ -name: basic_intl +name: t_basic_intl description: Basic internationalization utilities for ai_chat_assistant version: 0.2.0 diff --git a/pubspec.lock b/pubspec.lock index a1f9a2b..7c6a0fa 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -73,13 +73,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "3.1.0" - basic_intl: - dependency: "direct main" - description: - path: "packages/basic_intl" - relative: true - source: path - version: "0.2.0" characters: dependency: transitive description: @@ -447,6 +440,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "3.3.0+3" + t_basic_intl: + dependency: "direct main" + description: + path: "packages/basic_intl" + relative: true + source: path + version: "0.2.0" term_glyph: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 457a3bc..f6edb97 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,7 +19,7 @@ dependencies: provider: ^6.1.5 flutter_tts: ^4.2.0 # basic_intl: 0.2.0 - basic_intl: + t_basic_intl: path: packages/basic_intl # flutter_ingeek_carkey: 1.4.7 # app_car: