Flutter聊天消息时间戳插件chat_message_timestamp的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter聊天消息时间戳插件 chat_message_timestamp 的使用

chat_message_timestamp 是一个用于在 Flutter 应用中显示带有时间戳和发送状态图标的消息的插件。本文将介绍如何使用该插件,并提供完整的示例代码。

预览

以下是插件支持的所有场景:

  • 时间戳适合最后一行
  • 时间戳不适合最后一行
  • 带有发送状态图标的发送时间
  • 消息的最大行数限制

聊天预览

开始使用

添加依赖

首先,在 pubspec.yaml 文件中添加 chat_message_timestamp 依赖:

dependencies:
  chat_message_timestamp: ^最新版本号

然后,导入该包:

import 'package:chat_message_timestamp/chat_message_timestamp.dart';

使用方法

您可以使用任何形状的容器(如 ContainerCard 或自定义画笔),并为其添加一些填充即可。例如:

Container(
    color: Colors.blue,
    padding: const EdgeInsets.all(15.0),
    child: TimestampedChatMessage(
        text: '您的消息内容',
        sentAt: DateTime.now().formattedTimeHm, // 使用扩展方法格式化时间
    ),
)

该插件还提供了一个名为 formattedTimeHm 的扩展方法,用于格式化 DateTime 实例为字符串形式的时间戳(如:13:06)。

属性说明

以下是 TimestampedChatMessage 的属性说明:

  • text: 消息文本,必需的 String
  • sentAt: 消息时间戳,必需的 String
  • style: 消息文本样式,可选的 TextStyle
  • sentAtStyle: 时间戳文本样式,可选的 TextStyle
  • sendingStatusIcon: 发送状态图标,可选的 Icon
  • maxLines: 设置消息的最大行数,可选的 int
  • delimiter: 如果消息需要显示“查看更多”按钮时使用的分隔符,默认为三个点,可选的 String
  • showMoreText: “查看更多”按钮的文本,默认为“查看更多”,可选的 String
  • showMoreTextStyle: “查看更多”按钮文本样式,可选的 TextStyle

示例代码

以下是一个完整的示例应用,展示了如何使用 chat_message_timestamp 插件:

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

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const ChatScreen(),
    );
  }
}

class ChatScreen extends StatefulWidget {
  const ChatScreen({super.key});

  [@override](/user/override)
  State<ChatScreen> createState() => _ChatScreenState();
}

class _ChatScreenState extends State<ChatScreen> {
  late TextEditingController controller;

  [@override](/user/override)
  void initState() {
    super.initState();
    controller = TextEditingController();
  }

  [@override](/user/override)
  void dispose() {
    controller.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    final size = MediaQuery.of(context).size;
    return Scaffold(
      body: SafeArea(
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            children: [
              Expanded(
                child: ListView.separated(
                  padding: const EdgeInsets.all(15.0),
                  itemCount: messages.length,
                  itemBuilder: (_, index) {
                    final message = messages[index];
                    return Align(
                      alignment: message.isFromMe
                          ? Alignment.centerRight
                          : Alignment.centerLeft,
                      child: Container(
                        padding: const EdgeInsets.all(10.0),
                        constraints: BoxConstraints(maxWidth: size.width * 0.8),
                        decoration: BoxDecoration(
                          color: message.isFromMe
                              ? Colors.pinkAccent.shade200
                              : Colors.grey.shade400,
                          borderRadius: BorderRadius.circular(15.0),
                          boxShadow: [
                            BoxShadow(
                              color: Colors.grey.shade600,
                              offset: const Offset(0, 0),
                              blurRadius: 9,
                              spreadRadius: 0,
                            ),
                          ],
                        ),
                        child: TimestampedChatMessage(
                          text: message.text,
                          sentAt: message.sentAt.formattedTimeHm,
                          maxLines: 4,
                          showMoreTextStyle: const TextStyle(color: Colors.deepPurpleAccent),
                          style: TextStyle(
                            color: message.isFromMe ? Colors.white : Colors.black,
                            fontSize: 16,
                          ),
                          sendingStatusIcon: message.isFromMe ? message.sendingStatus.icon : null,
                        ),
                      ),
                    );
                  },
                  separatorBuilder: (_, __) => const SizedBox(height: 15),
                ),
              ),
              Row(
                children: [
                  Expanded(
                    child: TextField(
                      controller: controller,
                    ),
                  ),
                  const SizedBox(width: 5),
                  IconButton.filledTonal(
                    onPressed: () {
                      if (controller.text.trim().isNotEmpty) {
                        // 处理发送消息逻辑
                        sendMessage(controller.text);
                        controller.clear();
                      }
                    },
                    icon: const Icon(Icons.send),
                  ),
                ],
              )
            ],
          ),
        ),
      ),
    );
  }
}

// 示例消息数据结构
class Message {
  final String text;
  final DateTime sentAt;
  final bool isFromMe;
  final Icon? sendingStatus;

  Message({
    required this.text,
    required this.sentAt,
    required this.isFromMe,
    this.sendingStatus,
  });
}

List<Message> messages = [
  Message(
    text: "这是一个测试消息",
    sentAt: DateTime.now(),
    isFromMe: true,
    sendingStatus: const Icon(Icons.done_all, color: Colors.blue),
  ),
  // 可以继续添加更多消息
];

更多关于Flutter聊天消息时间戳插件chat_message_timestamp的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter聊天消息时间戳插件chat_message_timestamp的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用chat_message_timestamp插件来显示聊天消息时间戳的示例代码。这个插件主要用于在聊天消息之间插入时间戳,以便用户能够更容易地识别消息的时间顺序。

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

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

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

接下来,在你的Flutter项目中,你可以按照以下步骤使用chat_message_timestamp插件:

  1. 导入插件

在你的Dart文件中导入插件:

import 'package:chat_message_timestamp/chat_message_timestamp.dart';
  1. 准备消息数据

假设你有一个消息列表,每个消息包含一个时间戳和消息内容:

List<Map<String, dynamic>> messages = [
  {'text': 'Hello!', 'timestamp': DateTime(2023, 10, 1, 10, 0, 0)},
  {'text': 'How are you?', 'timestamp': DateTime(2023, 10, 1, 10, 5, 0)},
  {'text': 'I am good!', 'timestamp': DateTime(2023, 10, 1, 12, 0, 0)},
  {'text': 'Nice to hear!', 'timestamp': DateTime(2023, 10, 1, 12, 1, 0)},
];
  1. 使用ChatMessageTimestamp组件

在你的聊天界面中使用ChatMessageTimestamp组件来显示消息和时间戳:

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

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

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

class ChatScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Chat Screen'),
      ),
      body: ListView.builder(
        itemCount: messages.length + 1, // +1 for possible additional timestamps
        itemBuilder: (context, index) {
          if (index == messages.length) {
            // This is just to ensure we have enough space at the end
            return SizedBox(height: 20);
          }

          DateTime currentTime = messages[index]['timestamp'];
          String currentText = messages[index]['text'];

          return Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              if (index == 0 ||
                  !currentTime.isSameDateAndTimeAs(
                      messages[index - 1]['timestamp']!.subtract(Duration(minutes: 1))))
                ChatMessageTimestamp(
                  time: currentTime,
                  builder: (context, time) {
                    return Padding(
                      padding: const EdgeInsets.only(left: 16.0, top: 8.0, bottom: 4.0),
                      child: Text(
                        time.toLocal().format(context), // Use local formatting
                        style: TextStyle(color: Colors.grey, fontSize: 12),
                      ),
                    );
                  },
                ),
              Padding(
                padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
                child: Text(
                  currentText,
                  style: TextStyle(fontSize: 16),
                ),
              ),
            ],
          );
        },
      ),
    );
  }
}

在上面的代码中,我们使用了ListView.builder来构建消息列表。对于每条消息,我们首先检查是否需要显示时间戳(如果这是第一条消息,或者当前消息的时间与前一条消息的时间相差超过1分钟)。然后,我们使用ChatMessageTimestamp组件来显示时间戳,并在其下方显示消息内容。

注意:time.toLocal().format(context)用于根据用户的本地设置格式化时间戳。你可能需要根据你的应用需求调整时间格式。

这个示例展示了如何在Flutter中使用chat_message_timestamp插件来显示聊天消息的时间戳。根据你的具体需求,你可能需要进一步调整代码。

回到顶部