Commit 1610ec8c authored by skeyboy's avatar skeyboy

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

parent 1b13148f
library dash_chat_2;
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:animated_text_kit/animated_text_kit.dart';
import 'package:chart/package/markdown/flutter_markdown.dart';
......@@ -14,9 +18,11 @@ import 'package:gradient_borders/input_borders/gradient_outline_input_border.dar
import 'package:highlight/highlight.dart';
import 'package:intl/intl.dart' as intl;
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:video_player/video_player.dart' as vp;
import '../../pages/home/controller.dart';
import '../markdown/src/style_sheet.dart';
import 'src/widgets/image_provider/image_provider.dart';
......
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
class MessageList extends StatefulWidget {
const MessageList({
......@@ -42,6 +83,7 @@ class _MessageListState extends State<MessageList> {
bool scrollToBottomIsVisible = false;
bool isLoadingMore = false;
late ScrollController scrollController;
late ChartTTS chartTTS = ChartTTS();
@override
void initState() {
......@@ -118,23 +160,23 @@ class _MessageListState extends State<MessageList> {
margin: const EdgeInsets.only(top: 20),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceBetween,
MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Text(
message.text,
overflow: TextOverflow.ellipsis,
maxLines: 1,
style: const TextStyle(
color: Color.fromARGB(
255, 170, 170, 194)),
)),
message.text,
overflow: TextOverflow.ellipsis,
maxLines: 1,
style: const TextStyle(
color: Color.fromARGB(
255, 170, 170, 194)),
)),
const Icon(
Icons.arrow_forward,
color: Color(0xFF9c67f6),
),
]),
)
),
],
),
),
......
......@@ -131,20 +131,47 @@ class MessageRow extends StatelessWidget {
// messageLength: messageLength,
),
if (message.text.isNotEmpty)
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,
),
(isOwnMessage
? 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,
)
: 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 &&
message.medias!.isNotEmpty &&
!messageOptions.textBeforeMedia)
......
......@@ -78,7 +78,14 @@ class HomeController extends GetxController {
);
_addMessage(textMessage);
final receiveMessage = Chat.ChatMessage(
user: receiveUser,
createdAt: DateTime.now(),
status: MessageStatus.pending,
// id: const Uuid().v4(),
text: "LOADING",
);
_addMessage(receiveMessage);
// return;
// _addMessage(loadingMessage);
......@@ -113,14 +120,7 @@ class HomeController extends GetxController {
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;
} else {
// EasyLoading.showError("网络异常");
......
......@@ -122,6 +122,9 @@ dependencies:
loading_animation_widget: ^1.2.0+4
flutter_keyboard_visibility: ^5.4.0
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
......
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