add attachment builders parameter

This commit is contained in:
Salvatore Giordano
2020-04-22 16:13:12 +02:00
parent 493ebe33f4
commit ad9709a2c9
2 changed files with 78 additions and 23 deletions
+8
View File
@@ -68,6 +68,7 @@ class MessageListView extends StatefulWidget {
this.showVideoFullScreen = true,
this.onMentionTap,
this.onMessageActions,
this.attachmentBuilders,
}) : super(key: key);
/// Function used to build a custom message widget
@@ -98,6 +99,9 @@ class MessageListView extends StatefulWidget {
/// Function called on message long press
final Function(BuildContext, Message) onMessageActions;
/// Map that defines a builder for an attachment type
final Map<String, AttachmentBuilder> attachmentBuilders;
@override
_MessageListViewState createState() => _MessageListViewState();
}
@@ -157,6 +161,7 @@ class _MessageListViewState extends State<MessageListView> {
widget.showOtherMessageUsername,
onMentionTap: widget.onMentionTap,
onMessageActions: widget.onMessageActions,
attachmentBuilders: widget.attachmentBuilders,
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 32),
@@ -219,6 +224,7 @@ class _MessageListViewState extends State<MessageListView> {
showVideoFullScreen: widget.showVideoFullScreen,
onMentionTap: widget.onMentionTap,
onMessageActions: widget.onMessageActions,
attachmentBuilders: widget.attachmentBuilders,
);
}
}
@@ -297,6 +303,7 @@ class _MessageListViewState extends State<MessageListView> {
showOtherMessageUsername: widget.showOtherMessageUsername,
onMentionTap: widget.onMentionTap,
onMessageActions: widget.onMessageActions,
attachmentBuilders: widget.attachmentBuilders,
);
}
@@ -336,6 +343,7 @@ class _MessageListViewState extends State<MessageListView> {
showOtherMessageUsername: widget.showOtherMessageUsername,
onMentionTap: widget.onMentionTap,
onMessageActions: widget.onMessageActions,
attachmentBuilders: widget.attachmentBuilders,
);
}
+70 -23
View File
@@ -4,6 +4,7 @@ import 'package:flutter/widgets.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:jiffy/jiffy.dart';
import 'package:stream_chat/stream_chat.dart';
import 'package:stream_chat_flutter/src/file_attachment.dart';
import 'package:stream_chat_flutter/src/giphy_attachment.dart';
import 'package:stream_chat_flutter/src/image_attachment.dart';
import 'package:stream_chat_flutter/src/message_input.dart';
@@ -19,9 +20,10 @@ import 'package:stream_chat_flutter/src/video_attachment.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'deleted_message.dart';
import 'file_attachment.dart';
import 'stream_chat.dart';
typedef AttachmentBuilder = Widget Function(BuildContext, Message, Attachment);
/// ![screenshot](https://raw.githubusercontent.com/GetStream/stream-chat-flutter/master/screenshots/message_widget.png)
/// ![screenshot](https://raw.githubusercontent.com/GetStream/stream-chat-flutter/master/screenshots/message_widget_paint.png)
///
@@ -44,6 +46,7 @@ class MessageWidget extends StatefulWidget {
this.onMentionTap,
this.showOtherMessageUsername = false,
this.showVideoFullScreen = true,
this.attachmentBuilders,
}) : super(key: key);
/// Function called on mention tap
@@ -73,8 +76,11 @@ class MessageWidget extends StatefulWidget {
/// True if the video player will allow fullscreen mode
final bool showVideoFullScreen;
/// Map that defines a builder for an attachment type
final Map<String, AttachmentBuilder> attachmentBuilders;
@override
_MessageWidgetState createState() => _MessageWidgetState();
_MessageWidgetState createState() => _MessageWidgetState(attachmentBuilders);
}
class _MessageWidgetState extends State<MessageWidget>
@@ -91,6 +97,38 @@ class _MessageWidgetState extends State<MessageWidget>
bool _isLastUser;
bool _isNextUser;
Map<String, AttachmentBuilder> _attachmentBuilders;
_MessageWidgetState(Map<String, AttachmentBuilder> attachmentBuilders) {
_attachmentBuilders = {
'image': (context, message, attachment) {
return ImageAttachment(
attachment: attachment,
messageTheme: _messageTheme,
);
},
'video': (context, message, attachment) {
return VideoAttachment(
enableFullScreen: widget.showVideoFullScreen,
attachment: attachment,
messageTheme: _messageTheme,
);
},
'giphy': (context, message, attachment) {
return GiphyAttachment(
attachment: attachment,
messageTheme: _messageTheme,
message: message,
);
},
'file': (context, message, attachment) {
return FileAttachment(
attachment: attachment,
);
},
}..addAll(attachmentBuilders ?? {});
}
@override
Widget build(BuildContext context) {
super.build(context);
@@ -213,28 +251,37 @@ class _MessageWidgetState extends State<MessageWidget>
nOfAttachmentWidgets++;
Widget attachmentWidget;
if (attachment.type == 'video') {
attachmentWidget = VideoAttachment(
attachment: attachment,
messageTheme: _messageTheme,
enableFullScreen: widget.showVideoFullScreen,
);
} else if (attachment.type == 'giphy') {
attachmentWidget = GiphyAttachment(
attachment: attachment,
message: widget.message,
messageTheme: _messageTheme,
);
} else if (attachment.type == 'image') {
attachmentWidget = ImageAttachment(
attachment: attachment,
messageTheme: _messageTheme,
);
} else if (attachment.type == 'file') {
attachmentWidget = FileAttachment(
attachment: attachment,
);
final attachmentBuilder = _attachmentBuilders[attachment.type];
if (attachmentBuilder == null) {
return SizedBox();
}
attachmentWidget = attachmentBuilder(
context,
widget.message,
attachment,
);
// if (attachment.type == 'video') {
// attachmentWidget = VideoAttachment(
// attachment: attachment,
// messageTheme: _messageTheme,
// enableFullScreen: widget.showVideoFullScreen,
// );
// } else if (attachment.type == 'giphy') {
// attachmentWidget = GiphyAttachment(
// attachment: attachment,
// message: widget.message,
// messageTheme: _messageTheme,
// );
// } else if (attachment.type == 'image') {
// attachmentWidget = ImageAttachment(
// attachment: attachment,
// messageTheme: _messageTheme,
// );
// } else if (attachment.type == 'file') {
// attachmentWidget = FileAttachment(
// attachment: attachment,
// );
// }
if (attachmentWidget != null) {
return _buildAttachment(