Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
ChatGPT
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Jobs
Commits
Open sidebar
关振斌
ChatGPT
Commits
2aff02c7
Commit
2aff02c7
authored
Apr 13, 2023
by
skeyboy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
长按弹出菜单功能提取共用
parent
8a903885
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
164 additions
and
146 deletions
+164
-146
lib/package/chat_dash/src/models/message_options.dart
lib/package/chat_dash/src/models/message_options.dart
+8
-1
lib/package/chat_dash/src/widgets/message_row/default_message_text.dart
...at_dash/src/widgets/message_row/default_message_text.dart
+33
-129
lib/pages/home/controller.dart
lib/pages/home/controller.dart
+122
-15
lib/pages/home/view.dart
lib/pages/home/view.dart
+1
-1
No files found.
lib/package/chat_dash/src/models/message_options.dart
View file @
2aff02c7
...
@@ -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
;
}
}
lib/package/chat_dash/src/widgets/message_row/default_message_text.dart
View file @
2aff02c7
...
@@ -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
);
}
}
...
...
lib/pages/home/controller.dart
View file @
2aff02c7
...
@@ -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
(
...
...
lib/pages/home/view.dart
View file @
2aff02c7
...
@@ -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,
),
),
),
),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment