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,21 +52,7 @@ class _DefaultMessageTextState extends State<DefaultMessageText> { ...@@ -52,21 +52,7 @@ class _DefaultMessageTextState extends State<DefaultMessageText> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// CustomPopupMenu( Widget chatMessageBody = Column(
// // 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(
crossAxisAlignment: widget.isOwnMessage crossAxisAlignment: widget.isOwnMessage
? CrossAxisAlignment.end ? CrossAxisAlignment.end
: CrossAxisAlignment.start, : CrossAxisAlignment.start,
...@@ -89,14 +75,16 @@ class _DefaultMessageTextState extends State<DefaultMessageText> { ...@@ -89,14 +75,16 @@ class _DefaultMessageTextState extends State<DefaultMessageText> {
color: widget.isOwnMessage color: widget.isOwnMessage
? (widget.messageOptions.currentUserTextColor ?? ? (widget.messageOptions.currentUserTextColor ??
Colors.white70) Colors.white70)
: (widget.messageOptions.textColor ?? : (widget.messageOptions.textColor ?? Colors.black54),
Colors.black54),
fontSize: 10, 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;
} }
...@@ -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