refactor: IndexKey to ValueKey

This commit is contained in:
Gordon Hayes
2021-10-08 10:33:11 +02:00
parent b9866a709a
commit 74c8e67406
@@ -473,12 +473,15 @@ class _MessageListViewState extends State<MessageListView> {
physics: widget.scrollPhysics, physics: widget.scrollPhysics,
itemScrollController: _scrollController, itemScrollController: _scrollController,
reverse: widget.reverse, reverse: widget.reverse,
itemCount: messages.length, itemCount: itemCount,
findChildIndexCallback: (Key key) { findChildIndexCallback: (Key key) {
final indexedKey = key as IndexedKey; final indexedKey = key as IndexedKey;
final index = messagesIndex[indexedKey.value]; final valueKey = indexedKey.key as ValueKey<String>?;
if (index != null) { if (valueKey != null) {
return ((index + 2) * 2) - 1; final index = messagesIndex[valueKey.value];
if (index != null) {
return ((index + 2) * 2) - 1;
}
} }
}, },
@@ -628,12 +631,14 @@ class _MessageListViewState extends State<MessageListView> {
messages, messages,
streamChannel!, streamChannel!,
i - 2, i - 2,
i,
); );
} else { } else {
messageWidget = buildMessage(message, messages, i - 2, i); messageWidget = buildMessage(message, messages, i - 2);
} }
return messageWidget; return KeyedSubtree(
key: ValueKey(message.id),
child: messageWidget,
);
}, },
), ),
), ),
@@ -856,13 +861,10 @@ class _MessageListViewState extends State<MessageListView> {
List<Message> messages, List<Message> messages,
StreamChannelState streamChannel, StreamChannelState streamChannel,
int index, int index,
int buildItemIndex,
) { ) {
final messageWidget = final messageWidget = buildMessage(message, messages, index);
buildMessage(message, messages, index, buildItemIndex);
return VisibilityDetector( return VisibilityDetector(
key: IndexedKey(message.id, buildItemIndex), key: ValueKey('visibility: ${message.id}'),
onVisibilityChanged: (visibility) { onVisibilityChanged: (visibility) {
final isVisible = visibility.visibleBounds != Rect.zero; final isVisible = visibility.visibleBounds != Rect.zero;
if (isVisible) { if (isVisible) {
@@ -954,13 +956,11 @@ class _MessageListViewState extends State<MessageListView> {
return defaultMessageWidget; return defaultMessageWidget;
} }
Widget buildMessage( Widget buildMessage(Message message, List<Message> messages, int index) {
Message message, List<Message> messages, int index, int buildItemIndex) {
if ((message.type == 'system' || message.type == 'error') && if ((message.type == 'system' || message.type == 'error') &&
message.text?.isNotEmpty == true) { message.text?.isNotEmpty == true) {
return widget.systemMessageBuilder?.call(context, message) ?? return widget.systemMessageBuilder?.call(context, message) ??
SystemMessage( SystemMessage(
key: IndexedKey(message.id, buildItemIndex),
message: message, message: message,
onMessageTap: (message) { onMessageTap: (message) {
if (widget.onSystemMessageTap != null) { if (widget.onSystemMessageTap != null) {
@@ -1040,7 +1040,6 @@ class _MessageListViewState extends State<MessageListView> {
members.firstWhereOrNull((e) => e.user!.id == currentUser!.id); members.firstWhereOrNull((e) => e.user!.id == currentUser!.id);
Widget messageWidget = MessageWidget( Widget messageWidget = MessageWidget(
key: IndexedKey(message.id, buildItemIndex),
message: message, message: message,
reverse: isMyMessage, reverse: isMyMessage,
showReactions: !message.isDeleted, showReactions: !message.isDeleted,