build method
Widget
build(
- BuildContext context,
- Message message,
- Map<
String, List< attachmentsAttachment> >
override
Builds a widget for the given message
and attachments
.
This will only be called if canHandle returns true
.
Implementation
@override
Widget build(
BuildContext context,
Message message,
Map<String, List<Attachment>> attachments,
) {
assert(debugAssertCanHandle(message, attachments), '');
final urlPreviews = attachments[AttachmentType.urlPreview]!;
final client = StreamChat.of(context).client;
final isMyMessage = message.user?.id == client.state.currentUser?.id;
final streamChatTheme = StreamChatTheme.of(context);
final messageTheme = isMyMessage
? streamChatTheme.ownMessageTheme
: streamChatTheme.otherMessageTheme;
Widget _buildUrlPreview(Attachment urlPreview) {
VoidCallback? onTap;
if (onAttachmentTap != null) {
onTap = () => onAttachmentTap!(message, urlPreview);
}
final host = Uri.parse(urlPreview.titleLink!).host;
final splitList = host.split('.');
final hostName = splitList.length == 3 ? splitList[1] : splitList[0];
final hostDisplayName = urlPreview.authorName?.capitalize() ??
getWebsiteName(hostName.toLowerCase()) ??
hostName.capitalize();
return InkWell(
onTap: onTap,
child: StreamUrlAttachment(
message: message,
urlAttachment: urlPreview,
hostDisplayName: hostDisplayName,
messageTheme: messageTheme,
constraints: constraints,
shape: shape,
),
);
}
Widget child;
if (urlPreviews.length == 1) {
child = _buildUrlPreview(urlPreviews.first);
} else {
child = Column(
children: <Widget>[
for (final urlPreview in urlPreviews) _buildUrlPreview(urlPreview),
].insertBetween(
// Add a small vertical padding between each attachment.
SizedBox(height: padding.vertical / 2),
),
);
}
return Padding(
padding: padding,
child: child,
);
}