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
acb9d7e1
Commit
acb9d7e1
authored
Apr 20, 2023
by
skeyboy
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
百晓通聊天列表多选分享
parent
7209ed34
Changes
5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
457 additions
and
209 deletions
+457
-209
lib/package/chat_dash/src/models/chat_message.dart
lib/package/chat_dash/src/models/chat_message.dart
+3
-0
lib/package/chat_dash/src/models/message_options.dart
lib/package/chat_dash/src/models/message_options.dart
+7
-1
lib/package/chat_dash/src/widgets/message_row/message_row.dart
...ackage/chat_dash/src/widgets/message_row/message_row.dart
+258
-97
lib/pages/home/controller.dart
lib/pages/home/controller.dart
+142
-40
lib/pages/home/view.dart
lib/pages/home/view.dart
+47
-71
No files found.
lib/package/chat_dash/src/models/chat_message.dart
View file @
acb9d7e1
...
...
@@ -12,6 +12,7 @@ class ChatMessage {
this
.
mentions
,
this
.
status
=
MessageStatus
.
none
,
this
.
replyTo
,
this
.
showMenu
=
false
});
/// Create a ChatMessage instance from json data
...
...
@@ -77,6 +78,8 @@ class ChatMessage {
/// If the message is a reply of another one TODO:
ChatMessage
?
replyTo
;
bool
?
showMenu
=
false
;
bool
?
selected
=
false
;
/// Convert a ChatMessage into a json
Map
<
String
,
dynamic
>
toJson
()
{
...
...
lib/package/chat_dash/src/models/message_options.dart
View file @
acb9d7e1
...
...
@@ -33,7 +33,8 @@ class MessageOptions {
this
.
messageMediaBuilder
,
this
.
onLongPressStart
,
this
.
onLongPressEnd
,
this
.
shareMenuBuilder
});
this
.
shareMenuBuilder
,
this
.
multiSelectedBuilder
});
//长按
...
...
@@ -158,9 +159,14 @@ class MessageOptions {
/// Will not work with the default video player
final
void
Function
(
ChatMedia
media
)?
onTapMedia
;
/// 多选
final
ChatRowSelected
?
Function
(
ChatMessage
chatMessage
)?
multiSelectedBuilder
;
final
Widget
?
Function
(
ChatMessage
message
,
CustomPopupMenuController
controller
,
Widget
chatMessageBody
,
bool
?
showMenus
)?
shareMenuBuilder
;
}
typedef
ChatRowSelected
=
void
Function
(
ChatMessage
message
,
bool
?
value
);
lib/package/chat_dash/src/widgets/message_row/message_row.dart
View file @
acb9d7e1
This diff is collapsed.
Click to expand it.
lib/pages/home/controller.dart
View file @
acb9d7e1
...
...
@@ -3,6 +3,7 @@ import 'dart:async';
import
'package:chart/common/apis/apis.dart'
;
import
'package:chart/common/routers/routes.dart'
;
import
'package:chart/common/store/store.dart'
;
import
'package:chart/common/values/colors.dart'
;
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
;
...
...
@@ -45,6 +46,10 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin {
late
Animation
<
double
>
_animation
;
bool
_isRotated
=
false
;
/// 选中的分享条目
RxList
<
ChatMessage
>
selectedItems
=
<
ChatMessage
>[].
obs
;
RxBool
chatRowCheckRadioShowed
=
false
.
obs
;
// ignore: prefer_typing_uninitialized_variables
late
var
sse
;
...
...
@@ -73,6 +78,61 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin {
/// 事件
/// 右上角分享管理相关菜单
List
<
Widget
>
topRightBarMenus
()
{
/// 选中数据不为空 或者 展示选择菜单右侧即显示 分享相关控制
return
(
selectedItems
.
isEmpty
==
true
&&
chatRowCheckRadioShowed
.
value
==
false
)
?
[
RotationTransition
(
turns:
animation
,
child:
IconButton
(
tooltip:
'重置'
,
icon:
const
Icon
(
Icons
.
settings_backup_restore_sharp
,
color:
AppColors
.
primaryElementText
,
),
onPressed:
()
{
reset
();
},
),
),
IconButton
(
tooltip:
'设置'
,
icon:
const
Icon
(
Icons
.
settings
,
color:
AppColors
.
primaryElementText
,
),
onPressed:
()
{
share
();
},
)
]
:
[
IconButton
(
tooltip:
"分享"
,
onPressed:
()
async
{
selectedItems
.
sort
((
l
,
r
)
=>
r
.
createdAt
.
difference
(
DateTime
.
now
())
.
compareTo
(
l
.
createdAt
.
difference
(
DateTime
.
now
())));
String
sharedMsg
=
selectedItems
.
reversed
.
map
((
element
)
=>
element
.
text
)
.
join
(
"
\n\n
"
);
ShareResult
result
=
await
Share
.
shareWithResult
(
sharedMsg
);
if
(
result
.
status
==
ShareResultStatus
.
success
)
{
EasyLoading
.
showToast
(
"分享成功"
);
}
else
{
EasyLoading
.
showToast
(
"分享取消"
);
}
},
icon:
const
Icon
(
Icons
.
share
)),
IconButton
(
onPressed:
()
{
_hideChatMessageCheckbox
();
},
icon:
const
Icon
(
Icons
.
cancel_outlined
))
];
}
bool
gotoLoginPage
()
{
if
(
UserStore
.
to
.
isLogin
==
false
)
{
Get
.
toNamed
(
AppRoutes
.
SIGN_IN
);
...
...
@@ -420,47 +480,67 @@ 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
"
,
);
List
<
ItemModel
>
get
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
,
(
message
,
controller
)
{
state
.
messageList
.
forEach
((
element
)
{
element
.
showMenu
=
true
;
});
state
.
messageList
.
replaceRange
(
0
,
state
.
messageList
.
length
-
1
,
state
.
messageList
);
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),
];
chatRowCheckRadioShowed
.
value
=
true
;
}),
// ItemModel('引用', Icons.format_quote),
// ItemModel('提醒', Icons.add_alert),
// ItemModel('搜一搜', Icons.search),
];
_hideChatMessageCheckbox
()
{
state
.
messageList
.
forEach
((
element
)
{
element
.
showMenu
=
false
;
element
.
selected
=
false
;
});
state
.
messageList
.
replaceRange
(
0
,
state
.
messageList
.
length
-
1
,
state
.
messageList
);
selectedItems
.
value
.
clear
();
chatRowCheckRadioShowed
.
value
=
false
;
}
Widget
shareMenuBody
(
ChatMessage
message
,
CustomPopupMenuController
controller
)
{
...
...
@@ -506,6 +586,28 @@ class HomeController extends GetxController with SingleGetTickerProviderMixin {
);
}
// 分享菜单回调事项
ChatRowSelected
?
multiSelectedBuilder
(
ChatMessage
message
)
{
return
(
message
,
value
)
{
_update
(
message
,
value:
value
);
};
}
_update
(
ChatMessage
message
,
{
bool
?
value
=
false
})
{
message
.
selected
=
value
??
false
;
int
index
=
state
.
messageList
.
indexWhere
((
element
)
=>
element
==
message
);
state
.
messageList
.
replaceRange
(
index
,
index
+
1
,
[
message
]);
if
(
value
==
false
)
{
selectedItems
.
remove
(
message
);
}
else
{
selectedItems
.
add
(
message
);
selectedItems
.
value
.
sort
();
}
selectedItems
.
forEach
((
element
)
{
print
(
element
.
text
);
});
}
/// 根据需要自己判断怎么构建长按菜单
Widget
?
shareMenuBuilder
(
ChatMessage
message
,
...
...
lib/pages/home/view.dart
View file @
acb9d7e1
...
...
@@ -49,36 +49,11 @@ class _HomePageState extends State<_HomePage>
@override
Widget
build
(
BuildContext
context
)
{
final
cc
=
Get
.
put
(
HomeController
());
return
Obx
(()
=>
Scaffold
(
return
Obx
(()
=>
Scaffold
(
resizeToAvoidBottomInset:
false
,
backgroundColor:
Color
.
fromARGB
(
0
,
0
,
0
,
0
),
appBar:
transparentAppBar
(
actions:
[
RotationTransition
(
turns:
controller
.
animation
,
child:
IconButton
(
tooltip:
'重置'
,
icon:
const
Icon
(
Icons
.
settings_backup_restore_sharp
,
color:
AppColors
.
primaryElementText
,
),
onPressed:
()
{
controller
.
reset
();
},
),
),
IconButton
(
tooltip:
'设置'
,
icon:
const
Icon
(
Icons
.
settings
,
color:
AppColors
.
primaryElementText
,
),
onPressed:
()
{
controller
.
share
();
},
)
],
actions:
controller
.
topRightBarMenus
(),
title:
RichText
(
textAlign:
TextAlign
.
center
,
text:
TextSpan
(
children:
[
...
...
@@ -119,8 +94,7 @@ class _HomePageState extends State<_HomePage>
),
Text
(
"订阅"
,
style:
TextStyle
(
color:
Color
.
fromARGB
(
255
,
95
,
54
,
0
),
fontSize:
16
)),
color:
Color
.
fromARGB
(
255
,
95
,
54
,
0
),
fontSize:
16
)),
]),
callback:
()
=>
controller
.
virtualPay
()),
),
...
...
@@ -148,41 +122,43 @@ class _HomePageState extends State<_HomePage>
// GradientButton(
// child: Icon(Icons.text_fields_sharp), callback: () {}),
/*Android语音转换文字有问题暂时屏蔽掉*/
(
Platform
.
isAndroid
?
Container
()
:
Container
(
margin:
const
EdgeInsets
.
only
(
right:
10
),
child:
InkWell
(
borderRadius:
BorderRadius
.
circular
(
100
),
onTap:
cc
.
changeInput
,
child:
Container
(
decoration:
const
BoxDecoration
(
shape:
BoxShape
.
circle
,
border:
GradientBoxBorder
(
gradient:
LinearGradient
(
colors:
[
Color
(
0xFFbe6afb
),
// Color(0xFF9c67f6),
Color
(
0xFF7965f8
)
]),
width:
2
,
),
),
padding:
const
EdgeInsets
.
all
(
10
),
child:
Icon
(
!
cc
.
state
.
isInputText
?
Icons
.
keyboard
:
Icons
.
keyboard_voice
,
),
)))
// padding: EdgeInsets.all(10),
// margin: EdgeInsets.only(right: 10),
// child: Icon(Icons.text_fields_sharp),
// decoration: const BoxDecoration(
// shape: BoxShape.circle,
// border: GradientBoxBorder(
// gradient: LinearGradient(
// colors: [Colors.pink, Colors.orange]),
// width: 2,
// ),
// ),
(
Platform
.
isAndroid
?
Container
()
:
Container
(
margin:
const
EdgeInsets
.
only
(
right:
10
),
child:
InkWell
(
borderRadius:
BorderRadius
.
circular
(
100
),
onTap:
cc
.
changeInput
,
child:
Container
(
decoration:
const
BoxDecoration
(
shape:
BoxShape
.
circle
,
border:
GradientBoxBorder
(
gradient:
LinearGradient
(
colors:
[
Color
(
0xFFbe6afb
),
// Color(0xFF9c67f6),
Color
(
0xFF7965f8
)
]),
width:
2
,
),
),
padding:
const
EdgeInsets
.
all
(
10
),
child:
Icon
(
!
cc
.
state
.
isInputText
?
Icons
.
keyboard
:
Icons
.
keyboard_voice
,
),
)))
// padding: EdgeInsets.all(10),
// margin: EdgeInsets.only(right: 10),
// child: Icon(Icons.text_fields_sharp),
// decoration: const BoxDecoration(
// shape: BoxShape.circle,
// border: GradientBoxBorder(
// gradient: LinearGradient(
// colors: [Colors.pink, Colors.orange]),
// width: 2,
// ),
// ),
),
// Container(
// padding: EdgeInsets.all(10),
...
...
@@ -225,8 +201,8 @@ class _HomePageState extends State<_HomePage>
),
inputToolbarMargin:
EdgeInsets
.
all
(
0
),
sendButtonBuilder:
null
,
inputToolbarPadding:
EdgeInsets
.
only
(
top:
15
,
right:
15
,
left:
15
,
bottom:
10
),
inputToolbarPadding:
EdgeInsets
.
only
(
top:
15
,
right:
15
,
left:
15
,
bottom:
10
),
),
currentUser:
_user
,
onSend:
cc
.
sendMessage
,
...
...
@@ -234,13 +210,13 @@ class _HomePageState extends State<_HomePage>
messageOptions:
Chat
.
MessageOptions
(
onPressMessage:
cc
.
tabMessage
,
onLongPressMessage:
(
mes
)
=>
{},
shareMenuBuilder:
cc
.
shareMenuBuilder
// containerColor: Colors.black,
),
shareMenuBuilder:
cc
.
shareMenuBuilder
,
multiSelectedBuilder:
cc
.
multiSelectedBuilder
// 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