Files
zh-chat-flutter/lib/views/conversation/widgets/message_area.dart
2022-10-26 14:05:58 +08:00

81 lines
2.1 KiB
Dart

import 'package:chat/services/tim/message_service.dart';
import 'package:chat/views/conversation/widgets/message_widget.dart';
import 'package:flutter/material.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';
class MessageArea extends StatefulWidget {
final V2TimConversation conversation;
const MessageArea(this.conversation, {Key? key}) : super(key: key);
@override
State<MessageArea> createState() => _MessageAreaState();
}
class _MessageAreaState extends State<MessageArea> {
late AutoScrollController _scrollController;
String? _lastMessageId;
@override
void initState() {
super.initState();
_scrollController = AutoScrollController(
viewportBoundaryGetter: () => Rect.fromLTRB(
0,
0,
0,
MediaQuery.of(context).padding.bottom,
),
axis: Axis.vertical,
);
_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 ListView.separated(
scrollDirection: Axis.vertical,
controller: _scrollController,
shrinkWrap: true,
physics: const ClampingScrollPhysics(),
padding: const EdgeInsets.all(8),
reverse: true,
cacheExtent: 1200,
addAutomaticKeepAlives: true,
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,
);
},
);
});
}
}