improved performance and battery usage on older devices
This commit is contained in:
@@ -59,6 +59,13 @@ class _ChatBubbleState extends State<ChatBubble>
|
||||
with SingleTickerProviderStateMixin, DownloadTrigger<ChatBubble> {
|
||||
late ChatMessage message;
|
||||
|
||||
// The parsed message and its widget are only rebuilt when their inputs
|
||||
// change. The bubble itself rebuilds on every chat emit, swipe frame and
|
||||
// keyboard frame; re-running rich-object parsing, linkify/Markdown and emoji
|
||||
// detection each time is what makes long chats stutter.
|
||||
Object? _messageKey;
|
||||
late Widget _messageWidget;
|
||||
|
||||
Offset _position = Offset.zero;
|
||||
Offset _dragStartPosition = Offset.zero;
|
||||
bool _swipeActionArmed = false;
|
||||
@@ -185,12 +192,34 @@ class _ChatBubbleState extends State<ChatBubble>
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
void _updateMessage(BuildContext context) {
|
||||
final style = _messageTextStyle(context);
|
||||
final renderMarkdown =
|
||||
widget.bubbleData.markdown &&
|
||||
widget.bubbleData.messageType ==
|
||||
GetRoomResponseObjectMessageType.comment;
|
||||
final key = (
|
||||
widget.bubbleData,
|
||||
widget.highlightQuery,
|
||||
style,
|
||||
renderMarkdown,
|
||||
);
|
||||
if (key == _messageKey) return;
|
||||
_messageKey = key;
|
||||
message = ChatMessage(
|
||||
originalMessage: widget.bubbleData.message,
|
||||
originalData: widget.bubbleData.messageParameters,
|
||||
);
|
||||
_messageWidget = message.getWidget(
|
||||
highlightQuery: widget.highlightQuery,
|
||||
style: style,
|
||||
renderMarkdown: renderMarkdown,
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
_updateMessage(context);
|
||||
final showActorDisplayName =
|
||||
_rendersAsCommentBubble &&
|
||||
widget.chatData.type != GetRoomResponseObjectConversationType.oneToOne;
|
||||
@@ -277,14 +306,7 @@ class _ChatBubbleState extends State<ChatBubble>
|
||||
actorText: actorText,
|
||||
actorWidget: actorWidget,
|
||||
timeText: timeText,
|
||||
messageWidget: message.getWidget(
|
||||
highlightQuery: widget.highlightQuery,
|
||||
style: _messageTextStyle(context),
|
||||
renderMarkdown:
|
||||
widget.bubbleData.markdown &&
|
||||
widget.bubbleData.messageType ==
|
||||
GetRoomResponseObjectMessageType.comment,
|
||||
),
|
||||
messageWidget: _messageWidget,
|
||||
parent: parent,
|
||||
bubbleData: widget.bubbleData,
|
||||
isSender: widget.isSender,
|
||||
@@ -350,10 +372,12 @@ class _BubbleContent extends StatelessWidget {
|
||||
Widget build(BuildContext context) => MergeSemantics(
|
||||
child: Container(
|
||||
constraints: BoxConstraints(
|
||||
maxWidth: MediaQuery.of(context).size.width * 0.9,
|
||||
maxWidth: MediaQuery.sizeOf(context).width * 0.9,
|
||||
minWidth: showActorDisplayName
|
||||
? actorText.size.width
|
||||
: timeText.size.width + (isSender ? spacing + timeIconSize : 0) + 3,
|
||||
? actorText.measuredWidth(context)
|
||||
: timeText.measuredWidth(context) +
|
||||
(isSender ? spacing + timeIconSize : 0) +
|
||||
3,
|
||||
),
|
||||
child: Stack(
|
||||
children: [
|
||||
|
||||
Reference in New Issue
Block a user