Commit 2aff02c7 authored by skeyboy's avatar skeyboy

长按弹出菜单功能提取共用

parent 8a903885
...@@ -32,7 +32,8 @@ class MessageOptions { ...@@ -32,7 +32,8 @@ class MessageOptions {
this.messageTimeBuilder, this.messageTimeBuilder,
this.messageMediaBuilder, this.messageMediaBuilder,
this.onLongPressStart, this.onLongPressStart,
this.onLongPressEnd}); this.onLongPressEnd,
this.shareMenuBuilder});
//长按 //长按
...@@ -156,4 +157,10 @@ class MessageOptions { ...@@ -156,4 +157,10 @@ class MessageOptions {
/// Function to call when the user clicks on a media /// Function to call when the user clicks on a media
/// Will not work with the default video player /// Will not work with the default video player
final void Function(ChatMedia media)? onTapMedia; final void Function(ChatMedia media)? onTapMedia;
final Widget? Function(
ChatMessage message,
CustomPopupMenuController controller,
Widget chatMessageBody,
bool? showMenus)? shareMenuBuilder;
} }
...@@ -52,51 +52,39 @@ class _DefaultMessageTextState extends State<DefaultMessageText> { ...@@ -52,51 +52,39 @@ class _DefaultMessageTextState extends State<DefaultMessageText> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// CustomPopupMenu( Widget chatMessageBody = Column(
// // controller: CustomPopupMenuController().hideMenu(), crossAxisAlignment: widget.isOwnMessage
// menuBuilder: () => _buildLongPressMenu(message, context), ? CrossAxisAlignment.end
// barrierColor: Colors.transparent, : CrossAxisAlignment.start,
// position: PreferredPosition.bottom, children: <Widget>[
// pressType: PressType.longPress, Wrap(
// child: , children: getMessage(
// )); widget.isOwnMessage, widget.messageLength, widget.index),
return CustomPopupMenu( ),
controller: controller, if (widget.messageOptions.showTime)
menuBuilder: () => _buildLongPressMenu(widget.message), widget.messageOptions.messageTimeBuilder != null
barrierColor: Colors.transparent, ? widget.messageOptions.messageTimeBuilder!(
// position: PreferredPosition.bottom, widget.message, widget.isOwnMessage)
pressType: PressType.longPress, : Padding(
child: Column( padding: const EdgeInsets.only(top: 5),
crossAxisAlignment: widget.isOwnMessage child: Text(
? CrossAxisAlignment.end (widget.messageOptions.timeFormat ??
: CrossAxisAlignment.start, intl.DateFormat('HH:mm'))
children: <Widget>[ .format(widget.message.createdAt),
Wrap( style: TextStyle(
children: getMessage( color: widget.isOwnMessage
widget.isOwnMessage, widget.messageLength, widget.index), ? (widget.messageOptions.currentUserTextColor ??
), Colors.white70)
if (widget.messageOptions.showTime) : (widget.messageOptions.textColor ?? Colors.black54),
widget.messageOptions.messageTimeBuilder != null fontSize: 10,
? widget.messageOptions.messageTimeBuilder!(
widget.message, widget.isOwnMessage)
: Padding(
padding: const EdgeInsets.only(top: 5),
child: Text(
(widget.messageOptions.timeFormat ??
intl.DateFormat('HH:mm'))
.format(widget.message.createdAt),
style: TextStyle(
color: widget.isOwnMessage
? (widget.messageOptions.currentUserTextColor ??
Colors.white70)
: (widget.messageOptions.textColor ??
Colors.black54),
fontSize: 10,
),
),
), ),
], ),
)); ),
],
);
return widget.messageOptions.shareMenuBuilder
?.call(widget.message, controller, chatMessageBody, true) ??
Container();
} }
List<Widget> getMessage( List<Widget> getMessage(
...@@ -266,91 +254,6 @@ class _DefaultMessageTextState extends State<DefaultMessageText> { ...@@ -266,91 +254,6 @@ class _DefaultMessageTextState extends State<DefaultMessageText> {
*/ */
List<ItemModel> menuItems = [
ItemModel(
'复制',
Icons.content_copy,
(ChatMessage message, CustomPopupMenuController controller) {
FlutterClipboard.copy(message.text).then((value) {
EasyLoading.showToast("复制成功", maskType: EasyLoadingMaskType.none);
controller.hideMenu();
// Get.back();
});
// controller.hideMenu();
},
),
ItemModel(
'转发',
Icons.share,
(ChatMessage message, CustomPopupMenuController controller) async {
if (message.text.isNotEmpty) {
await Share.share(
"${message.text}\n\n",
);
controller.hideMenu();
} else {
EasyLoading.showToast("分享内容不能为空", maskType: EasyLoadingMaskType.none);
}
// FlutterClipboard.copy(message.text).then((value) {
// EasyLoading.showToast("复制成功", maskType: EasyLoadingMaskType.none);
// controller.hideMenu();
// // Get.back();
// });
},
),
// ItemModel('收藏', Icons.collections),
// ItemModel('删除', Icons.delete),
// ItemModel('多选', Icons.playlist_add_check),
// ItemModel('引用', Icons.format_quote),
// ItemModel('提醒', Icons.add_alert),
// ItemModel('搜一搜', Icons.search),
];
Widget _buildLongPressMenu(ChatMessage message) {
return ClipRRect(
borderRadius: BorderRadius.circular(5),
child: Container(
width: menuItems.menuMaxWidth,
// padding: EdgeInsets.symmetric(horizontal: 5, vertical: 5),
color: const Color(0xFF4C4C4C),
child: GridView.count(
padding: EdgeInsets.symmetric(horizontal: 10, vertical: 10),
crossAxisCount: menuItems.rowMaxItemCount,
crossAxisSpacing: 0,
mainAxisSpacing: 5,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
children: menuItems
.map((item) => InkWell(
onTap: () {
item.tapEvent(message, controller);
},
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
item.icon,
size: 20,
color: Colors.white,
),
Container(
margin: EdgeInsets.only(top: 2),
child: Text(
item.title,
style: TextStyle(color: Colors.white, fontSize: 12),
),
),
],
),
))
.toList(),
),
),
);
}
// Widget _buildLongPressMenu({String message = ""}) { // Widget _buildLongPressMenu({String message = ""}) {
// return ClipRRect( // return ClipRRect(
// borderRadius: BorderRadius.circular(5), // borderRadius: BorderRadius.circular(5),
...@@ -468,6 +371,7 @@ class ItemModel { ...@@ -468,6 +371,7 @@ class ItemModel {
String title; String title;
IconData icon; IconData icon;
dynamic tapEvent; dynamic tapEvent;
ItemModel(this.title, this.icon, this.tapEvent); ItemModel(this.title, this.icon, this.tapEvent);
} }
......
...@@ -7,9 +7,11 @@ import 'package:chart/common/values/server.dart'; ...@@ -7,9 +7,11 @@ import 'package:chart/common/values/server.dart';
import 'package:chart/entity/user_entity.dart'; import 'package:chart/entity/user_entity.dart';
import 'package:chart/package/chat_dash/dash_chat_2.dart' as Chat; import 'package:chart/package/chat_dash/dash_chat_2.dart' as Chat;
import 'package:chart/package/chat_dash/dash_chat_2.dart'; import 'package:chart/package/chat_dash/dash_chat_2.dart';
import 'package:chart/package/chat_dash/src/widgets/message_row/pop_menu.dart';
import 'package:chart/pages/application/controller.dart'; import 'package:chart/pages/application/controller.dart';
import 'package:chart/pages/category/controller.dart'; import 'package:chart/pages/category/controller.dart';
import 'package:chart/pages/frame/product/controller.dart'; import 'package:chart/pages/frame/product/controller.dart';
import 'package:clipboard/clipboard.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
...@@ -81,9 +83,7 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin { ...@@ -81,9 +83,7 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin {
} }
void sendMessage(Chat.ChatMessage message) async { void sendMessage(Chat.ChatMessage message) async {
if (state.isLoading || message.text if (state.isLoading || message.text.trim().isEmpty) {
.trim()
.isEmpty) {
return; return;
} }
...@@ -353,11 +353,11 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin { ...@@ -353,11 +353,11 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin {
user: receiveUser, user: receiveUser,
createdAt: DateTime.now(), createdAt: DateTime.now(),
text: "您关联的上下文超出了我的理解能力范围,请点击右上角刷新按钮重置会话。" text: "您关联的上下文超出了我的理解能力范围,请点击右上角刷新按钮重置会话。"
// user: receiveUser, // user: receiveUser,
// createdAt: DateTime.now(), // createdAt: DateTime.now(),
// // id: const Uuid().v4(), // // id: const Uuid().v4(),
// text: "", // text: "",
) )
]); ]);
} else { } else {
state.messageList.setRange(0, 1, [ state.messageList.setRange(0, 1, [
...@@ -367,11 +367,11 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin { ...@@ -367,11 +367,11 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin {
text: state.messageList.value[0].text == "LOADING" text: state.messageList.value[0].text == "LOADING"
? text ? text
: state.messageList.value[0].text + text : state.messageList.value[0].text + text
// user: receiveUser, // user: receiveUser,
// createdAt: DateTime.now(), // createdAt: DateTime.now(),
// // id: const Uuid().v4(), // // id: const Uuid().v4(),
// text: "", // text: "",
) )
]); ]);
} }
...@@ -384,8 +384,7 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin { ...@@ -384,8 +384,7 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin {
try { try {
await UserAPI.resetConversion(); await UserAPI.resetConversion();
EasyLoading.showToast( EasyLoading.showToast('已将对话上下文重置!', maskType: EasyLoadingMaskType.none);
'已将对话上下文重置!', maskType: EasyLoadingMaskType.none);
} catch (e) {} } catch (e) {}
} }
...@@ -411,6 +410,114 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin { ...@@ -411,6 +410,114 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin {
// } // }
} }
List<ItemModel> menuItems = [
ItemModel(
'复制',
Icons.content_copy,
(ChatMessage message, CustomPopupMenuController controller) {
FlutterClipboard.copy(message.text).then((value) {
EasyLoading.showToast("复制成功", maskType: EasyLoadingMaskType.none);
controller.hideMenu();
// Get.back();
});
// controller.hideMenu();
},
),
ItemModel(
'转发',
Icons.share,
(ChatMessage message, CustomPopupMenuController controller) async {
if (message.text.isNotEmpty) {
await Share.share(
"${message.text}\n\n",
);
controller.hideMenu();
} else {
EasyLoading.showToast("分享内容不能为空", maskType: EasyLoadingMaskType.none);
}
// FlutterClipboard.copy(message.text).then((value) {
// EasyLoading.showToast("复制成功", maskType: EasyLoadingMaskType.none);
// controller.hideMenu();
// // Get.back();
// });
},
),
// ItemModel('收藏', Icons.collections),
// ItemModel('删除', Icons.delete),
// ItemModel('多选', Icons.playlist_add_check),
// ItemModel('引用', Icons.format_quote),
// ItemModel('提醒', Icons.add_alert),
// ItemModel('搜一搜', Icons.search),
];
Widget shareMenuBody(
ChatMessage message, CustomPopupMenuController controller) {
return ClipRRect(
borderRadius: BorderRadius.circular(5),
child: Container(
width: menuItems.menuMaxWidth,
// padding: EdgeInsets.symmetric(horizontal: 5, vertical: 5),
color: const Color(0xFF4C4C4C),
child: GridView.count(
padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 10),
crossAxisCount: menuItems.rowMaxItemCount,
crossAxisSpacing: 0,
mainAxisSpacing: 5,
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
children: menuItems
.map((item) => InkWell(
onTap: () {
item.tapEvent(message, controller);
},
child: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Icon(
item.icon,
size: 20,
color: Colors.white,
),
Container(
margin: EdgeInsets.only(top: 2),
child: Text(
item.title,
style: TextStyle(color: Colors.white, fontSize: 12),
),
),
],
),
))
.toList(),
),
),
);
}
/// 根据需要自己判断怎么构建长按菜单
Widget? shareMenuBuilder(
ChatMessage message,
CustomPopupMenuController controller,
Widget chatMessageBody,
bool? showMenus) {
if ((showMenus ?? false) == false || menuItems.isEmpty) {
return chatMessageBody;
}
// 构建菜单
Widget menuBody = shareMenuBody(message, controller);
return CustomPopupMenu(
controller: controller,
menuBuilder: () => menuBody,
barrierColor: Colors.transparent,
// position: PreferredPosition.bottom,
pressType: PressType.longPress,
child: chatMessageBody);
}
tabMessage(ChatMessage message) { tabMessage(ChatMessage message) {
if (message.user.id == '0' && !state.isLoading) { if (message.user.id == '0' && !state.isLoading) {
sendMessage(Chat.ChatMessage( sendMessage(Chat.ChatMessage(
......
...@@ -209,7 +209,7 @@ class HomePage extends GetView<HomeController> { ...@@ -209,7 +209,7 @@ class HomePage extends GetView<HomeController> {
messageOptions: Chat.MessageOptions( messageOptions: Chat.MessageOptions(
onPressMessage: cc.tabMessage, onPressMessage: cc.tabMessage,
onLongPressMessage: (mes) => {}, onLongPressMessage: (mes) => {},
shareMenuBuilder: cc.shareMenuBuilder
// containerColor: Colors.black, // containerColor: Colors.black,
), ),
), ),
......
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