chat_ui_kit
1.1.0
此撲朔迷離的軟件包為您提供了基礎結構以及一組工具,使您可以快速建立現代的聊天UI。您沒有嘗試在一個符合每個人期望的小部件中提出所有的小部件,而是為您提供了被用作示例並隨意定制的助手。

首先將以下行添加到您的pubspec.yaml依賴性:
chat_ui_kit : ^ [latest_version]接下來,設置模型以擴展基本模型:
class ChatMessage extends MessageBase {
//...
ChatUser author;
String text;
@override
DateTime get createdAt =>
DateTime . fromMillisecondsSinceEpoch (creationTimestamp);
@override
String get id => messageId;
@override
String get url => attachment;
@override
MessageBaseType get messageType {
//...
}
} class ChatUser extends UserBase {
//...
@override
String get name => username;
@override
String get id => userid;
@override
String get avatar => avatarURL;
} class Chat extends ChatBase {
//...
List < ChatUser > members;
ChatMessage lastMessage;
@override
int get unreadCount => chat.unreadCount;
@override
String get name {
if ((chat ? .name ?? null ). isNotNullOrEmpty ()) return chat.name;
return membersWithoutSelf. map ((e) => e.username). toList (). join ( ", " );
}
@override
String get id => chat ? .id;
@override
List < ChatUser > get membersWithoutSelf {
List < ChatUser > membersWithoutSelf = [];
final localUserId = chat ? .localUserId ??
FirebaseAuth .instance.currentUser ? .uid;
for ( ChatUser chatUser in members) {
if (localUserId != chatUser.userid) membersWithoutSelf. add (chatUser);
}
return membersWithoutSelf;
}
} ChatsListController controller = ChatsListController ();
ChatsList (
controller : _controller,
appUserId : _currentUser.id,
scrollHandler : _handleScrollEvent,
groupAvatarStyle : GroupAvatarStyle (withSeparator : true ),
builders : ChatsListTileBuilders (
groupAvatarBuilder :
(context, imageIndex, itemIndex, size, item) {
final chat = item as Chat ;
return CachedNetworkImage (
cacheManager : CustomCacheManager (),
imageUrl : chat.membersWithoutSelf[imageIndex].avatar,
width : size.width,
height : size.height,
fit : BoxFit .cover,
errorWidget : (ctx, url, val) =>
AppErrorWidget ( true , size : size));
},
lastMessageBuilder : _buildLastMessage,
wrapper : _buildTileWrapper,
dateBuilder : (context, date) => Padding (
padding : EdgeInsets . only (left : 16 ),
child : Text ( DateFormatter . getVerboseDateTimeRepresentation (
context, date)))))
@override
void dispose () {
_controller. dispose ();
super . dispose ();
} final MessagesListController _controller = MessagesListController ();
@override
void initState () {
_controller.selectionEventStream. listen ((event) {
setState (() {
_selectedItemsCount = event.currentSelectionCount;
});
});
super . initState ();
}
Widget _buildMessagesList () {
IncomingMessageTileBuilders incomingBuilders = _isGroupChat
? IncomingMessageTileBuilders (
bodyBuilder : (context, index, item, messagePosition) =>
_buildMessageBody (context, index, item, messagePosition,
MessageFlow .incoming),
avatarBuilder : (context, index, item, messagePosition) {
final _chatMessage = item as ChatMessage ;
return Padding (
padding :
EdgeInsets . only (right : 16 ),
child : _buildAvatarWithScore (_chatMessage.author));
})
: IncomingMessageTileBuilders (
bodyBuilder : (context, index, item, messagePosition) =>
_buildMessageBody (context, index, item, messagePosition,
MessageFlow .incoming),
titleBuilder : null );
return Expanded (
child : MessagesList (
controller : _controller,
appUserId : _currentUser.id,
useCustomTile : (i, item, pos) {
final msg = item as ChatMessage ;
return msg.isTypeEvent;
},
messagePosition : _messagePosition,
builders : MessageTileBuilders (
customTileBuilder : _buildEventMessage,
customDateBuilder : _buildDate,
incomingMessageBuilders : incomingBuilders,
outgoingMessageBuilders : OutgoingMessageTileBuilders (
bodyBuilder : (context, index, item, messagePosition) =>
_buildMessageBody (context, index, item,
messagePosition, MessageFlow .outgoing)))));
}
@override
void dispose () {
_controller. dispose ();
super . dispose ();
}在詢問任何問題之前,請確保瀏覽班級的文檔。 PR非常歡迎!