Flutter聊天消息时间戳插件chat_message_timestamp的使用
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';
使用方法
您可以使用任何形状的容器(如 Container
、Card
或自定义画笔),并为其添加一些填充即可。例如:
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
更多关于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
插件:
- 导入插件:
在你的Dart文件中导入插件:
import 'package:chat_message_timestamp/chat_message_timestamp.dart';
- 准备消息数据:
假设你有一个消息列表,每个消息包含一个时间戳和消息内容:
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)},
];
- 使用
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
插件来显示聊天消息的时间戳。根据你的具体需求,你可能需要进一步调整代码。