Commit 1610ec8c authored by skeyboy's avatar skeyboy

回答消息增加复制、分享菜单和tts语音播报

parent 1b13148f
library dash_chat_2; library dash_chat_2;
import 'dart:math'; import 'dart:math';
import 'package:custom_pop_up_menu/custom_pop_up_menu.dart';
import 'package:clipboard/clipboard.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_tts/flutter_tts.dart';
import 'package:highlight/highlight.dart' show highlight, Node; import 'package:highlight/highlight.dart' show highlight, Node;
import 'package:animated_text_kit/animated_text_kit.dart'; import 'package:animated_text_kit/animated_text_kit.dart';
import 'package:chart/package/markdown/flutter_markdown.dart'; import 'package:chart/package/markdown/flutter_markdown.dart';
...@@ -14,9 +18,11 @@ import 'package:gradient_borders/input_borders/gradient_outline_input_border.dar ...@@ -14,9 +18,11 @@ import 'package:gradient_borders/input_borders/gradient_outline_input_border.dar
import 'package:highlight/highlight.dart'; import 'package:highlight/highlight.dart';
import 'package:intl/intl.dart' as intl; import 'package:intl/intl.dart' as intl;
import 'package:loading_animation_widget/loading_animation_widget.dart'; import 'package:loading_animation_widget/loading_animation_widget.dart';
import 'package:share_plus/share_plus.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'package:video_player/video_player.dart' as vp; import 'package:video_player/video_player.dart' as vp;
import '../../pages/home/controller.dart';
import '../markdown/src/style_sheet.dart'; import '../markdown/src/style_sheet.dart';
import 'src/widgets/image_provider/image_provider.dart'; import 'src/widgets/image_provider/image_provider.dart';
......
part of dash_chat_2; part of dash_chat_2;
enum TtsState { playing, stopped, paused, continued }
class ChartTTS {
String voiceName;
String locale;
double volume;
double speechRate;
String language = "en-US";
static ChartTTS tts = ChartTTS();
ChartTTS(
{this.voiceName = "Karen",
this.locale = 'en-AU',
this.volume = 1.0,
this.speechRate = 1.0}) {
flutterTts.setLanguage(language);
flutterTts.setVolume(volume);
flutterTts.setSpeechRate(speechRate);
flutterTts.setVoice({"name": voiceName, "locale": locale});
}
final FlutterTts _flutterTts = FlutterTts();
FlutterTts get flutterTts => _flutterTts;
Future<void> speak(String message, VoidCallback? onFinishedCallback) async {
//先停止
await stop();
_flutterTts.setCompletionHandler(() {
if (onFinishedCallback != null) {
onFinishedCallback();
}
});
var rev = await _flutterTts.speak(message);
}
Future<void> stop() async {
await _flutterTts.stop();
}
}
/// @nodoc /// @nodoc
class MessageList extends StatefulWidget { class MessageList extends StatefulWidget {
const MessageList({ const MessageList({
...@@ -42,6 +83,7 @@ class _MessageListState extends State<MessageList> { ...@@ -42,6 +83,7 @@ class _MessageListState extends State<MessageList> {
bool scrollToBottomIsVisible = false; bool scrollToBottomIsVisible = false;
bool isLoadingMore = false; bool isLoadingMore = false;
late ScrollController scrollController; late ScrollController scrollController;
late ChartTTS chartTTS = ChartTTS();
@override @override
void initState() { void initState() {
...@@ -134,7 +176,7 @@ class _MessageListState extends State<MessageList> { ...@@ -134,7 +176,7 @@ class _MessageListState extends State<MessageList> {
color: Color(0xFF9c67f6), color: Color(0xFF9c67f6),
), ),
]), ]),
) ),
], ],
), ),
), ),
......
...@@ -131,7 +131,8 @@ class MessageRow extends StatelessWidget { ...@@ -131,7 +131,8 @@ class MessageRow extends StatelessWidget {
// messageLength: messageLength, // messageLength: messageLength,
), ),
if (message.text.isNotEmpty) if (message.text.isNotEmpty)
TextContainer( (isOwnMessage
? TextContainer(
index: index, index: index,
messageOptions: messageOptions, messageOptions: messageOptions,
message: message, message: message,
...@@ -143,8 +144,34 @@ class MessageRow extends StatelessWidget { ...@@ -143,8 +144,34 @@ class MessageRow extends StatelessWidget {
isPreviousSameAuthor: isPreviousSameAuthor, isPreviousSameAuthor: isPreviousSameAuthor,
isAfterDateSeparator: isAfterDateSeparator, isAfterDateSeparator: isAfterDateSeparator,
isBeforeDateSeparator: isBeforeDateSeparator, isBeforeDateSeparator: isBeforeDateSeparator,
messageTextBuilder: messageOptions.messageTextBuilder, messageTextBuilder:
), messageOptions.messageTextBuilder,
)
: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: TextContainer(
index: index,
messageOptions: messageOptions,
message: message,
messageLength: messageLength,
previousMessage: previousMessage,
nextMessage: nextMessage,
isOwnMessage: isOwnMessage,
isNextSameAuthor: isNextSameAuthor,
isPreviousSameAuthor: isPreviousSameAuthor,
isAfterDateSeparator: isAfterDateSeparator,
isBeforeDateSeparator: isBeforeDateSeparator,
messageTextBuilder:
messageOptions.messageTextBuilder,
)),
Padding(
padding: EdgeInsets.only(left: 10, top: 15),
child: ChartTTSWave(text: message.text)),
],
)),
if (message.medias != null && if (message.medias != null &&
message.medias!.isNotEmpty && message.medias!.isNotEmpty &&
!messageOptions.textBeforeMedia) !messageOptions.textBeforeMedia)
......
...@@ -78,7 +78,14 @@ class HomeController extends GetxController { ...@@ -78,7 +78,14 @@ class HomeController extends GetxController {
); );
_addMessage(textMessage); _addMessage(textMessage);
final receiveMessage = Chat.ChatMessage(
user: receiveUser,
createdAt: DateTime.now(),
status: MessageStatus.pending,
// id: const Uuid().v4(),
text: "LOADING",
);
_addMessage(receiveMessage);
// return; // return;
// _addMessage(loadingMessage); // _addMessage(loadingMessage);
...@@ -113,14 +120,7 @@ class HomeController extends GetxController { ...@@ -113,14 +120,7 @@ class HomeController extends GetxController {
integral: value.integral)); integral: value.integral));
}); });
final receiveMessage = Chat.ChatMessage(
user: receiveUser,
createdAt: DateTime.now(),
status: MessageStatus.pending,
// id: const Uuid().v4(),
text: "LOADING",
);
_addMessage(receiveMessage);
// index.value = state.messageList.length; // index.value = state.messageList.length;
} else { } else {
// EasyLoading.showError("网络异常"); // EasyLoading.showError("网络异常");
......
...@@ -122,6 +122,9 @@ dependencies: ...@@ -122,6 +122,9 @@ dependencies:
loading_animation_widget: ^1.2.0+4 loading_animation_widget: ^1.2.0+4
flutter_keyboard_visibility: ^5.4.0 flutter_keyboard_visibility: ^5.4.0
flutter_barrage: ^0.5.2 flutter_barrage: ^0.5.2
clipboard: ^0.1.3
flutter_tts: ^3.6.3
custom_pop_up_menu: ^1.2.4
# package:bubble/bubble.dart # package:bubble/bubble.dart
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment