会话页面

This commit is contained in:
2022-10-26 14:05:58 +08:00
parent 099d2b4423
commit 76bd3f94fd
33 changed files with 2956 additions and 31 deletions

View File

@@ -0,0 +1,126 @@
import 'package:chat/services/tim/message_service.dart';
import 'package:chat/widgets/custom_easy_refresh.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyrefresh/easy_refresh.dart';
import 'package:get/get.dart';
import 'package:scroll_to_index/scroll_to_index.dart';
import 'package:tencent_im_sdk_plugin/models/v2_tim_conversation.dart';
import 'package:tencent_im_sdk_plugin/models/v2_tim_message.dart';
import 'message_widget.dart';
class MessageList extends StatefulWidget {
final V2TimConversation conversation;
const MessageList(this.conversation, {Key? key}) : super(key: key);
@override
State<MessageList> createState() => _MessageListState();
}
class _MessageListState extends State<MessageList> {
final EasyRefreshController _refreshController = EasyRefreshController();
late AutoScrollController _scrollController;
String? _lastMessageId;
bool isFirst = true;
@override
void dispose() {
super.dispose();
}
@override
void initState() {
super.initState();
_scrollController = AutoScrollController(
viewportBoundaryGetter: () => Rect.fromLTRB(
0,
0,
0,
MediaQuery.of(context).padding.bottom,
),
axis: Axis.vertical,
);
/// 接收到消息 和 自己发送消息 使列表滚动到最底部
// eventBus.on().listen((event) {
// if (TimMessageService.to.curConversationId ==
// widget.conversation.conversationID) {
// if (event is V2TimMessage) {
// if (mounted) {
// setState(() {
// TimMessageService.to.addMessage(event);
// });
// }
// _scrollController.scrollToIndex(
// TimMessageService.to.messages.length - 1,
// preferPosition: AutoScrollPosition.begin,
// );
// }
// }
// if (event is String && event == 'scrollToBottom') {
// Future.delayed(const Duration(milliseconds: 200), () {
// _scrollController.animateTo(
// _scrollController.position.maxScrollExtent,
// duration: const Duration(milliseconds: 200),
// curve: Curves.easeOut,
// );
// });
// }
// });
_loadMessages();
}
Future<void> _loadMessages() async {
TimMessageService.to
.loadMessagesFromService(
widget.conversation,
_lastMessageId,
_scrollController,
)
.then((value) {
_lastMessageId = value;
});
}
@override
Widget build(BuildContext context) {
return GetX<TimMessageService>(builder: (service) {
return EasyRefresh(
controller: _refreshController,
header: CustomEasyRefresh.header,
footer: CustomEasyRefresh.footer,
firstRefresh: false,
onRefresh: _loadMessages,
child: ListView.separated(
scrollDirection: Axis.vertical,
controller: _scrollController,
shrinkWrap: true,
physics: const ClampingScrollPhysics(),
padding: const EdgeInsets.only(
left: 8,
right: 8,
top: 8,
bottom: 8,
),
reverse: false,
itemCount: service.messages.length,
itemBuilder: (_, index) {
V2TimMessage? message = service.messages[index];
return AutoScrollTag(
key: ValueKey(index),
controller: _scrollController,
index: index,
child: MessageWidget(message),
);
},
separatorBuilder: (c, i) {
return Container(
height: 8,
);
},
),
);
});
}
}