Readd-widget key cache
continuous-integration/drone/pr Build is passing Details

This commit is contained in:
Sarah Jamie Lewis 2022-03-04 12:14:26 -08:00
parent 1fea540f9d
commit 6cc5146744
7 changed files with 16 additions and 11 deletions

View File

@ -32,7 +32,7 @@ const GroupConversationHandleLength = 32;
abstract class Message { abstract class Message {
MessageMetadata getMetadata(); MessageMetadata getMetadata();
Widget getWidget(BuildContext context); Widget getWidget(BuildContext context, Key key);
Widget getPreviewWidget(BuildContext context); Widget getPreviewWidget(BuildContext context);
} }

View File

@ -18,7 +18,7 @@ class FileMessage extends Message {
FileMessage(this.metadata, this.content); FileMessage(this.metadata, this.content);
@override @override
Widget getWidget(BuildContext context) { Widget getWidget(BuildContext context, Key key) {
return ChangeNotifierProvider.value( return ChangeNotifierProvider.value(
value: this.metadata, value: this.metadata,
builder: (bcontext, child) { builder: (bcontext, child) {
@ -42,7 +42,7 @@ class FileMessage extends Message {
return MessageRow(MalformedBubble()); return MessageRow(MalformedBubble());
} }
return MessageRow(FileBubble(nameSuggestion, rootHash, nonce, fileSize, isAuto: metadata.isAuto)); return MessageRow(FileBubble(nameSuggestion, rootHash, nonce, fileSize, isAuto: metadata.isAuto), key: key);
}); });
} }

View File

@ -17,7 +17,7 @@ class InviteMessage extends Message {
InviteMessage(this.overlay, this.metadata, this.content); InviteMessage(this.overlay, this.metadata, this.content);
@override @override
Widget getWidget(BuildContext context) { Widget getWidget(BuildContext context, Key key) {
return ChangeNotifierProvider.value( return ChangeNotifierProvider.value(
value: this.metadata, value: this.metadata,
builder: (bcontext, child) { builder: (bcontext, child) {
@ -39,7 +39,7 @@ class InviteMessage extends Message {
return MessageRow(MalformedBubble()); return MessageRow(MalformedBubble());
} }
} }
return MessageRow(InvitationBubble(overlay, inviteTarget, inviteNick, invite)); return MessageRow(InvitationBubble(overlay, inviteTarget, inviteNick, invite), key: key);
}); });
} }

View File

@ -9,11 +9,11 @@ class MalformedMessage extends Message {
MalformedMessage(this.metadata); MalformedMessage(this.metadata);
@override @override
Widget getWidget(BuildContext context) { Widget getWidget(BuildContext context, Key key) {
return ChangeNotifierProvider.value( return ChangeNotifierProvider.value(
value: this.metadata, value: this.metadata,
builder: (context, child) { builder: (context, child) {
return MessageRow(MalformedBubble()); return MessageRow(MalformedBubble(), key: key);
}); });
} }

View File

@ -48,7 +48,7 @@ class QuotedMessage extends Message {
} }
@override @override
Widget getWidget(BuildContext context) { Widget getWidget(BuildContext context, Key key) {
try { try {
dynamic message = jsonDecode(this.content); dynamic message = jsonDecode(this.content);
@ -59,7 +59,7 @@ class QuotedMessage extends Message {
return ChangeNotifierProvider.value( return ChangeNotifierProvider.value(
value: this.metadata, value: this.metadata,
builder: (bcontext, child) { builder: (bcontext, child) {
return MessageRow(QuotedMessageBubble(message["body"], messageHandler(bcontext, metadata.profileOnion, metadata.conversationIdentifier, ByContentHash(message["quotedHash"])))); return MessageRow(QuotedMessageBubble(message["body"], messageHandler(bcontext, metadata.profileOnion, metadata.conversationIdentifier, ByContentHash(message["quotedHash"]))), key: key);
}); });
} catch (e) { } catch (e) {
return MalformedBubble(); return MalformedBubble();

View File

@ -29,12 +29,13 @@ class TextMessage extends Message {
} }
@override @override
Widget getWidget(BuildContext context) { Widget getWidget(BuildContext context, Key key) {
return ChangeNotifierProvider.value( return ChangeNotifierProvider.value(
value: this.metadata, value: this.metadata,
builder: (bcontext, child) { builder: (bcontext, child) {
return MessageRow( return MessageRow(
MessageBubble(this.content), MessageBubble(this.content),
key: key,
); );
}); });
} }

View File

@ -87,7 +87,11 @@ class _MessageListState extends State<MessageList> {
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.hasData) { if (snapshot.hasData) {
var message = snapshot.data as Message; var message = snapshot.data as Message;
return message.getWidget(context); // here we create an index key for the contact and assign it to the row. Indexes are unique so we can
// reliably use this without running into duplicate keys...it isn't ideal as it means keys need to be re-built
// when new messages are added...however it is better than the alternative of not having widget keys at all.
var key = Provider.of<ContactInfoState>(outerContext, listen: false).getMessageKey(contactHandle, messageIndex);
return message.getWidget(context, key);
} else { } else {
return MessageLoadingBubble(); return MessageLoadingBubble();
} }