Flutter聊天界面构建插件chat_ui_kit的使用

Flutter聊天界面构建插件chat_ui_kit的使用

此Flutter插件为您提供了一个基础结构以及一组工具,使您能够快速构建现代聊天UI。与其尝试创建一个满足所有人期望的一体化小部件,不如为您提供一些旨在作为示例并根据需要进行自定义的小部件。

特性

  • 支持群聊
  • 聊天列表(对话)
  • 群组头像
  • 未读消息标记
  • 消息标题(用户)
  • 消息头像
  • 根据相对位置自动调整的消息容器
  • 带有数据管理API(添加、删除、更新)的控制器
  • 自动化选择管理
  • 具有打字事件的消息输入
  • 文本、图片、音频和视频消息的示例

开始使用

首先,在pubspec.yaml文件中的依赖项部分添加以下行:

dependencies:
  chat_ui_kit: ^[最新版本]

接下来,设置您的模型以扩展基本模型:

class ChatMessage extends MessageBase {
  // ...

  ChatUser author;
  String text;

  [@override](/user/override)
  DateTime get createdAt => 
      DateTime.fromMillisecondsSinceEpoch(creationTimestamp);

  [@override](/user/override)
  String get id => messageId;

  [@override](/user/override)
  String get url => attachment;

  [@override](/user/override)
  MessageBaseType get messageType {
    // ...
  }
}
class ChatUser extends UserBase {
  // ...

  [@override](/user/override)
  String get name => username;

  [@override](/user/override)
  String get id => userid;

  [@override](/user/override)
  String get avatar => avatarURL;
}
class Chat extends ChatBase {

  // ...

  List<ChatUser> members;
  ChatMessage lastMessage;

  [@override](/user/override)
  int get unreadCount => chat.unreadCount;

  [@override](/user/override)
  String get name {
    if ((chat?.name ?? null).isNotNullOrEmpty()) return chat.name;
    return membersWithoutSelf.map((e) => e.username).toList().join(", ");
  }

  [@override](/user/override)
  String get id => chat?.id;

  [@override](/user/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;
  }
  
}

ChatsListScreen

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](/user/override)
void dispose() {
  controller.dispose();
  super.dispose();
}

ChatScreen

final MessagesListController _controller = MessagesListController();

[@override](/user/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](/user/override)
void dispose() {
  _controller.dispose();
  super.dispose();
}

更多关于Flutter聊天界面构建插件chat_ui_kit的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter聊天界面构建插件chat_ui_kit的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 chat_ui_kit 插件来构建 Flutter 聊天界面的代码示例。chat_ui_kit 是一个强大的 Flutter 插件,它提供了丰富的 UI 组件来快速构建聊天应用。

首先,确保你已经在 pubspec.yaml 文件中添加了 chat_ui_kit 依赖:

dependencies:
  flutter:
    sdk: flutter
  chat_ui_kit: ^latest_version  # 请替换为实际的最新版本号

然后运行 flutter pub get 来安装依赖。

以下是一个简单的聊天界面示例:

import 'package:flutter/material.dart';
import 'package:chat_ui_kit/chat_ui_kit.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ChatScreen(),
    );
  }
}

class ChatScreen extends StatefulWidget {
  @override
  _ChatScreenState createState() => _ChatScreenState();
}

class _ChatScreenState extends State<ChatScreen> {
  // 示例消息列表
  final List<ChatMessage> messages = [
    ChatMessage(
      id: '1',
      sender: ChatUser(id: 'user1', name: 'Alice', avatarUrl: 'https://example.com/alice.jpg'),
      text: 'Hello, how are you?',
      timestamp: DateTime.now().subtract(Duration(minutes: 5)),
      isMe: false,
    ),
    ChatMessage(
      id: '2',
      sender: ChatUser(id: 'user2', name: 'Bob', avatarUrl: 'https://example.com/bob.jpg'),
      text: 'I am good, thanks. How about you?',
      timestamp: DateTime.now().subtract(Duration(minutes: 3)),
      isMe: true,
    ),
    // 添加更多消息...
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Chat Screen'),
      ),
      body: ChatBuilder(
        messages: messages,
        user: ChatUser(id: 'user2', name: 'Bob', avatarUrl: 'https://example.com/bob.jpg'),
        onMessageSent: (ChatMessage message) {
          // 发送消息后的回调处理
          setState(() {
            messages.add(message);
          });
        },
        inputFieldBuilder: (_, controller, onSubmitted) {
          return TextField(
            controller: controller,
            onSubmitted: onSubmitted,
            decoration: InputDecoration(
              border: OutlineInputBorder(),
              labelText: 'Type a message...',
            ),
          );
        },
        sendButtonBuilder: (_, onPressed) {
          return IconButton(
            icon: Icon(Icons.send),
            onPressed: onPressed,
          );
        },
      ),
    );
  }
}

在这个示例中:

  1. ChatScreen 是一个包含聊天界面的状态类组件。
  2. messages 列表包含了一些示例消息。
  3. ChatBuilderchat_ui_kit 提供的一个构建器,用于快速构建聊天界面。
  4. onMessageSent 是一个回调,当用户发送消息时会被调用,这里我们简单地将新消息添加到 messages 列表中。
  5. inputFieldBuildersendButtonBuilder 用于自定义输入框和发送按钮。

你可以根据需要进一步自定义和扩展这个示例,比如添加消息加载、用户头像点击事件、消息时间戳格式化等功能。chat_ui_kit 提供了丰富的 API 来满足这些需求。

希望这个示例对你有所帮助!

回到顶部