Commit 2aff02c7 authored by skeyboy's avatar skeyboy

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

parent 8a903885
......@@ -32,7 +32,8 @@ class MessageOptions {
this.messageTimeBuilder,
this.messageMediaBuilder,
this.onLongPressStart,
this.onLongPressEnd});
this.onLongPressEnd,
this.shareMenuBuilder});
//长按
......@@ -156,4 +157,10 @@ class MessageOptions {
/// Function to call when the user clicks on a media
/// Will not work with the default video player
final void Function(ChatMedia media)? onTapMedia;
final Widget? Function(
ChatMessage message,
CustomPopupMenuController controller,
Widget chatMessageBody,
bool? showMenus)? shareMenuBuilder;
}
......@@ -52,21 +52,7 @@ class _DefaultMessageTextState extends State<DefaultMessageText> {
@override
Widget build(BuildContext context) {
// CustomPopupMenu(
// // controller: CustomPopupMenuController().hideMenu(),
// menuBuilder: () => _buildLongPressMenu(message, context),
// barrierColor: Colors.transparent,
// position: PreferredPosition.bottom,
// pressType: PressType.longPress,
// child: ,
// ));
return CustomPopupMenu(
controller: controller,
menuBuilder: () => _buildLongPressMenu(widget.message),
barrierColor: Colors.transparent,
// position: PreferredPosition.bottom,
pressType: PressType.longPress,
child: Column(
Widget chatMessageBody = Column(
crossAxisAlignment: widget.isOwnMessage
? CrossAxisAlignment.end
: CrossAxisAlignment.start,
......@@ -89,14 +75,16 @@ class _DefaultMessageTextState extends State<DefaultMessageText> {
color: widget.isOwnMessage
? (widget.messageOptions.currentUserTextColor ??
Colors.white70)
: (widget.messageOptions.textColor ??
Colors.black54),
: (widget.messageOptions.textColor ?? Colors.black54),
fontSize: 10,
),
),
),
],
));
);
return widget.messageOptions.shareMenuBuilder
?.call(widget.message, controller, chatMessageBody, true) ??
Container();
}
List<Widget> getMessage(
......@@ -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 = ""}) {
// return ClipRRect(
// borderRadius: BorderRadius.circular(5),
......@@ -468,6 +371,7 @@ class ItemModel {
String title;
IconData icon;
dynamic tapEvent;
ItemModel(this.title, this.icon, this.tapEvent);
}
......
......@@ -7,9 +7,11 @@ import 'package:chart/common/values/server.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';
import 'package:chart/package/chat_dash/src/widgets/message_row/pop_menu.dart';
import 'package:chart/pages/application/controller.dart';
import 'package:chart/pages/category/controller.dart';
import 'package:chart/pages/frame/product/controller.dart';
import 'package:clipboard/clipboard.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
......@@ -81,9 +83,7 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin {
}
void sendMessage(Chat.ChatMessage message) async {
if (state.isLoading || message.text
.trim()
.isEmpty) {
if (state.isLoading || message.text.trim().isEmpty) {
return;
}
......@@ -384,8 +384,7 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin {
try {
await UserAPI.resetConversion();
EasyLoading.showToast(
'已将对话上下文重置!', maskType: EasyLoadingMaskType.none);
EasyLoading.showToast('已将对话上下文重置!', maskType: EasyLoadingMaskType.none);
} catch (e) {}
}
......@@ -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) {
if (message.user.id == '0' && !state.isLoading) {
sendMessage(Chat.ChatMessage(
......
......@@ -209,7 +209,7 @@ class HomePage extends GetView<HomeController> {
messageOptions: Chat.MessageOptions(
onPressMessage: cc.tabMessage,
onLongPressMessage: (mes) => {},
shareMenuBuilder: cc.shareMenuBuilder
// 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