use MessageWidget.copyWith in messagelistview

This commit is contained in:
Salvatore Giordano
2021-06-25 11:23:52 +02:00
parent 1ceabb90f1
commit 8b71b32bdb
2 changed files with 42 additions and 85 deletions
@@ -56,32 +56,35 @@ typedef ReplyTapCallback = void Function(Message);
class MessageDetails { class MessageDetails {
/// Constructor for creating [MessageDetails] /// Constructor for creating [MessageDetails]
MessageDetails( MessageDetails(
BuildContext context, String currentUserId,
this.message, this.message,
List<Message> messages, List<Message> messages,
this.index, this.index,
this.defaultMessageWidget,
) { ) {
isMyMessage = message.user?.id == StreamChat.of(context).user?.id; isMyMessage = message.user?.id == currentUserId;
isLastUser = index + 1 < messages.length && isLastUser = index + 1 < messages.length &&
message.user?.id == messages[index + 1].user?.id; message.user?.id == messages[index + 1].user?.id;
isNextUser = isNextUser =
index - 1 >= 0 && message.user!.id == messages[index - 1].user?.id; index - 1 >= 0 && message.user!.id == messages[index - 1].user?.id;
} }
late final MessageWidget defaultMessageWidget;
/// True if the message belongs to the current user /// True if the message belongs to the current user
bool? isMyMessage; late final bool isMyMessage;
/// True if the user message is the same of the previous message /// True if the user message is the same of the previous message
bool? isLastUser; late final bool isLastUser;
/// True if the user message is the same of the next message /// True if the user message is the same of the next message
bool? isNextUser; late final bool isNextUser;
/// The message /// The message
Message message; late final Message message;
/// The index of the message /// The index of the message
int index; late final int index;
} }
/// ![screenshot](https://raw.githubusercontent.com/GetStream/stream-chat-flutter/master/screenshots/message_listview.png) /// ![screenshot](https://raw.githubusercontent.com/GetStream/stream-chat-flutter/master/screenshots/message_listview.png)
@@ -576,46 +579,21 @@ class _MessageListViewState extends State<MessageListView> {
const Offstage(); const Offstage();
} }
final topMessageIndex = itemCount -
4; // 7 -> parent // 6 -> header // 5 -> loader
const bottomMessageIndex = 2; // 1 -> loader // 0 -> footer const bottomMessageIndex = 2; // 1 -> loader // 0 -> footer
final message = messages[i - 2]; final message = messages[i - 2];
Widget messageWidget; Widget messageWidget;
if (i == topMessageIndex) { if (i == bottomMessageIndex) {
messageWidget = _buildTopMessage(
context,
message,
messages,
streamChannel,
i,
);
} else if (i == bottomMessageIndex) {
messageWidget = _buildBottomMessage( messageWidget = _buildBottomMessage(
context, context,
message, message,
messages, messages,
streamChannel!, streamChannel!,
i, i - 2,
); );
} else { } else {
if (widget.messageBuilder != null) { messageWidget = buildMessage(message, messages, i - 2);
messageWidget = Builder(
key: ValueKey<String>('MESSAGE-${message.id}'),
builder: (context) => widget.messageBuilder!(
context,
MessageDetails(
context,
message,
messages,
i,
),
messages),
);
} else {
messageWidget = buildMessage(message, messages, i);
}
} }
return messageWidget; return messageWidget;
}, },
@@ -785,34 +763,6 @@ class _MessageListViewState extends State<MessageListView> {
isThreadConversation: _isThreadConversation, isThreadConversation: _isThreadConversation,
); );
Widget _buildTopMessage(
BuildContext context,
Message message,
List<Message> messages,
StreamChannelState? streamChannel,
int index,
) {
Widget messageWidget;
if (widget.messageBuilder != null) {
messageWidget = Builder(
key: const ValueKey<String>('TOP-MESSAGE'),
builder: (_) => widget.messageBuilder!(
context,
MessageDetails(
context,
message,
messages,
messages.length - 1,
),
messages,
),
);
} else {
messageWidget = buildMessage(message, messages, index);
}
return messageWidget;
}
Widget _buildBottomMessage( Widget _buildBottomMessage(
BuildContext context, BuildContext context,
Message message, Message message,
@@ -820,24 +770,7 @@ class _MessageListViewState extends State<MessageListView> {
StreamChannelState streamChannel, StreamChannelState streamChannel,
int index, int index,
) { ) {
Widget messageWidget; final messageWidget = buildMessage(message, messages, index);
if (widget.messageBuilder != null) {
messageWidget = Builder(
key: ValueKey<String>('BOTTOM-MESSAGE-${message.id}'),
builder: (_) => widget.messageBuilder!(
context,
MessageDetails(
context,
message,
messages,
0,
),
messages,
),
);
} else {
messageWidget = buildMessage(message, messages, index);
}
return VisibilityDetector( return VisibilityDetector(
key: ValueKey<String>('BOTTOM-MESSAGE-${message.id}'), key: ValueKey<String>('BOTTOM-MESSAGE-${message.id}'),
@@ -1015,7 +948,7 @@ class _MessageListViewState extends State<MessageListView> {
final currentUserMember = final currentUserMember =
members.firstWhere((e) => e.user!.id == currentUser!.id); members.firstWhere((e) => e.user!.id == currentUser!.id);
Widget child = MessageWidget( Widget messageWidget = MessageWidget(
key: ValueKey<String>('MESSAGE-${message.id}'), key: ValueKey<String>('MESSAGE-${message.id}'),
message: message, message: message,
reverse: isMyMessage, reverse: isMyMessage,
@@ -1130,6 +1063,21 @@ class _MessageListViewState extends State<MessageListView> {
showPinButton: widget.pinPermissions.contains(currentUserMember.role), showPinButton: widget.pinPermissions.contains(currentUserMember.role),
); );
if (widget.messageBuilder != null) {
messageWidget = widget.messageBuilder!(
context,
MessageDetails(
userId,
message,
messages,
index,
messageWidget as MessageWidget,
),
messages,
);
}
var child = messageWidget;
if (!message.isDeleted && if (!message.isDeleted &&
!message.isSystem && !message.isSystem &&
!message.isEphemeral && !message.isEphemeral &&
@@ -572,7 +572,7 @@ class _MessageWidgetState extends State<MessageWidget>
super.build(context); super.build(context);
final avatarWidth = final avatarWidth =
widget.messageTheme.avatarTheme?.constraints.maxWidth ?? 40; widget.messageTheme.avatarTheme?.constraints.maxWidth ?? 40;
final leftPadding = final bottomRowPadding =
widget.showUserAvatar != DisplayWidget.gone ? avatarWidth + 8.5 : 0.5; widget.showUserAvatar != DisplayWidget.gone ? avatarWidth + 8.5 : 0.5;
return Material( return Material(
@@ -627,7 +627,8 @@ class _MessageWidgetState extends State<MessageWidget>
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: <Widget>[ children: <Widget>[
if (widget.showUserAvatar == if (!widget.reverse &&
widget.showUserAvatar ==
DisplayWidget.show && DisplayWidget.show &&
widget.message.user != null) ...[ widget.message.user != null) ...[
_buildUserAvatar(), _buildUserAvatar(),
@@ -753,6 +754,13 @@ class _MessageWidgetState extends State<MessageWidget>
), ),
), ),
), ),
if (widget.reverse &&
widget.showUserAvatar ==
DisplayWidget.show &&
widget.message.user != null) ...[
_buildUserAvatar(),
const SizedBox(width: 4),
]
], ],
), ),
if (showBottomRow) if (showBottomRow)
@@ -763,7 +771,8 @@ class _MessageWidgetState extends State<MessageWidget>
if (showBottomRow) if (showBottomRow)
Padding( Padding(
padding: EdgeInsets.only( padding: EdgeInsets.only(
left: leftPadding, left: !widget.reverse ? bottomRowPadding : 0,
right: widget.reverse ? bottomRowPadding : 0,
bottom: bottom:
isPinned && widget.showPinHighlight ? 6.0 : 0.0, isPinned && widget.showPinHighlight ? 6.0 : 0.0,
), ),