feat: Converted message_list_view.dart

This commit is contained in:
Deven Joshi
2021-01-25 20:59:50 +05:30
parent 5594a9a116
commit a79f551332
2 changed files with 268 additions and 292 deletions
@@ -236,55 +236,44 @@ class _MessageListViewState extends State<MessageListView> {
bool _inBetweenList = false; bool _inBetweenList = false;
MessageListController _messageListController = MessageListController();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final messagesStream = _isThreadConversation return MessageListCore(
? streamChannel.channel.state.threadsStream loadingBuilder: (context) {
.where((threads) => threads.containsKey(widget.parentMessage.id))
.map((threads) => threads[widget.parentMessage.id])
: streamChannel.channel.state?.messagesStream;
return StreamBuilder<List<Message>>(
stream: messagesStream?.map((messages) => messages
?.where((e) =>
(!e.isDeleted && e.shadowed != true) ||
(e.isDeleted &&
e.user.id == streamChannel.channel.client.state.user.id))
?.toList()),
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center( return Center(
child: const CircularProgressIndicator(), child: const CircularProgressIndicator(),
); );
} },
emptyBuilder: (context) {
final messageList = snapshot.data?.reversed?.toList() ?? [];
if (messageList.isEmpty) {
if (_upToDate) {
return Center( return Center(
child: Text( child: Text(
'No chats here yet...', 'No chats here yet...',
style: StreamChatTheme.of(context) style: StreamChatTheme.of(context).textTheme.footnote.copyWith(
.textTheme
.footnote
.copyWith(
color: StreamChatTheme.of(context) color: StreamChatTheme.of(context)
.colorTheme .colorTheme
.black .black
.withOpacity(.5)), .withOpacity(.5)),
), ),
); );
} },
} else { messageListBuilder: (context, list) {
messages = messageList; return _buildListView(list);
},
messageListController: _messageListController,
parentMessage: widget.parentMessage,
showScrollToBottom: widget.showScrollToBottom,
);
} }
Widget _buildListView(List<Message> data) {
messages = data;
final newMessagesListLength = messages.length; final newMessagesListLength = messages.length;
if (_messageListLength != null) { if (_messageListLength != null) {
if (_bottomPaginationActive || (_inBetweenList && _upToDate)) { if (_bottomPaginationActive || (_inBetweenList && _upToDate)) {
if (_itemPositionListener.itemPositions.value?.isNotEmpty == if (_itemPositionListener.itemPositions.value?.isNotEmpty == true) {
true) {
final first = _itemPositionListener.itemPositions.value.first; final first = _itemPositionListener.itemPositions.value.first;
final diff = newMessagesListLength - _messageListLength; final diff = newMessagesListLength - _messageListLength;
if (diff > 0) { if (diff > 0) {
@@ -363,15 +352,13 @@ class _MessageListViewState extends State<MessageListView> {
physics: widget.scrollPhysics, physics: widget.scrollPhysics,
itemScrollController: _scrollController, itemScrollController: _scrollController,
reverse: true, reverse: true,
itemCount: messages.length + itemCount:
2 + messages.length + 2 + (_isThreadConversation ? 1 : 0),
(_isThreadConversation ? 1 : 0),
separatorBuilder: (context, i) { separatorBuilder: (context, i) {
if (i == messages.length) return Offstage(); if (i == messages.length) return Offstage();
if (i == 0) return SizedBox(height: 30); if (i == 0) return SizedBox(height: 30);
if (i == messages.length + 1) { if (i == messages.length + 1) {
final replyCount = final replyCount = widget.parentMessage.replyCount;
widget.parentMessage.replyCount;
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
gradient: StreamChatTheme.of(context) gradient: StreamChatTheme.of(context)
@@ -406,8 +393,7 @@ class _MessageListViewState extends State<MessageListView> {
dateTime: nextMessage.createdAt.toLocal(), dateTime: nextMessage.createdAt.toLocal(),
); );
return Padding( return Padding(
padding: padding: const EdgeInsets.symmetric(vertical: 12.0),
const EdgeInsets.symmetric(vertical: 12.0),
child: divider, child: divider,
); );
} }
@@ -473,8 +459,7 @@ class _MessageListViewState extends State<MessageListView> {
} else { } else {
if (widget.messageBuilder != null) { if (widget.messageBuilder != null) {
messageWidget = Builder( messageWidget = Builder(
key: key: ValueKey<String>('MESSAGE-${message.id}'),
ValueKey<String>('MESSAGE-${message.id}'),
builder: (context) => widget.messageBuilder( builder: (context) => widget.messageBuilder(
context, context,
MessageDetails( MessageDetails(
@@ -486,8 +471,7 @@ class _MessageListViewState extends State<MessageListView> {
messages), messages),
); );
} else { } else {
messageWidget = messageWidget = buildMessage(message, messages, i);
buildMessage(message, messages, i);
} }
} }
return messageWidget; return messageWidget;
@@ -529,16 +513,11 @@ class _MessageListViewState extends State<MessageListView> {
), ),
], ],
); );
});
} }
Future<void> _paginateData( Future<void> _paginateData(
StreamChannelState channel, QueryDirection direction) { StreamChannelState channel, QueryDirection direction) {
if (!_isThreadConversation) { return _messageListController.paginateData(direction: direction);
return channel.queryMessages(direction: direction);
} else {
return channel.getReplies(widget.parentMessage.id);
}
} }
ItemPosition _getTopElement(Iterable<ItemPosition> values) { ItemPosition _getTopElement(Iterable<ItemPosition> values) {
@@ -51,7 +51,6 @@ class MessageListCore extends StatefulWidget {
Key key, Key key,
this.showScrollToBottom = true, this.showScrollToBottom = true,
this.parentMessage, this.parentMessage,
this.dateDividerBuilder,
@required this.loadingBuilder, @required this.loadingBuilder,
@required this.emptyBuilder, @required this.emptyBuilder,
@required this.messageListBuilder, @required this.messageListBuilder,
@@ -74,9 +73,6 @@ class MessageListCore extends StatefulWidget {
/// Parent message in case of a thread /// Parent message in case of a thread
final Message parentMessage; final Message parentMessage;
/// Builder used to render date dividers
final Widget Function(DateTime) dateDividerBuilder;
@override @override
_MessageListCoreState createState() => _MessageListCoreState(); _MessageListCoreState createState() => _MessageListCoreState();
} }
@@ -128,7 +124,8 @@ class _MessageListCoreState extends State<MessageListCore> {
}); });
} }
Future<void> paginateData(QueryDirection direction) { Future<void> paginateData(
{QueryDirection direction = QueryDirection.bottom}) {
if (!_isThreadConversation) { if (!_isThreadConversation) {
return streamChannel.queryMessages(direction: direction); return streamChannel.queryMessages(direction: direction);
} else { } else {
@@ -162,5 +159,5 @@ class _MessageListCoreState extends State<MessageListCore> {
/// Controller used for paginating data in [ChannelListView] /// Controller used for paginating data in [ChannelListView]
class MessageListController { class MessageListController {
Function(QueryDirection direction) paginateData; Function({QueryDirection direction}) paginateData;
} }