fix: устранить фриз при переключении вкладок в ChatListScreen

This commit is contained in:
klockky
2026-05-13 08:26:46 -07:00
parent acb7b69b26
commit f77f5793b5
7 changed files with 133 additions and 69 deletions
+31 -24
View File
@@ -1,3 +1,4 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:komet/backend/modules/chats.dart';
import 'package:komet/backend/modules/contacts.dart';
@@ -310,7 +311,7 @@ class MessageBubble extends StatelessWidget {
&& nextMessage?.senderId != message.senderId && prevMessage?.senderId == message.senderId)
CircleAvatar(
radius: 15,
backgroundImage: NetworkImage(senderAvatar),
backgroundImage: CachedNetworkImageProvider(senderAvatar),
backgroundColor: cs.primaryContainer,
)
else if (displaySender != null && !isMe && chatType != "DIALOG"
@@ -454,7 +455,7 @@ class MessageBubble extends StatelessWidget {
if (senderAvatar != null && senderAvatar.isNotEmpty)
CircleAvatar(
radius: 10,
backgroundImage: NetworkImage(senderAvatar),
backgroundImage: CachedNetworkImageProvider(senderAvatar),
backgroundColor: cs.primaryContainer,
)
else
@@ -706,7 +707,7 @@ class MessageBubble extends StatelessWidget {
if (senderAvatar != null && senderAvatar.isNotEmpty)
CircleAvatar(
radius: 10,
backgroundImage: NetworkImage(senderAvatar),
backgroundImage: CachedNetworkImageProvider(senderAvatar),
backgroundColor: cs.primaryContainer,
)
else
@@ -779,7 +780,7 @@ class MessageBubble extends StatelessWidget {
if (senderAvatar != null && senderAvatar.isNotEmpty)
CircleAvatar(
radius: 10,
backgroundImage: NetworkImage(senderAvatar),
backgroundImage: CachedNetworkImageProvider(senderAvatar),
backgroundColor: cs.primaryContainer,
)
else
@@ -845,7 +846,7 @@ class MessageBubble extends StatelessWidget {
if (senderAvatar != null && senderAvatar.isNotEmpty)
CircleAvatar(
radius: 10,
backgroundImage: NetworkImage(senderAvatar),
backgroundImage: CachedNetworkImageProvider(senderAvatar),
backgroundColor: cs.primaryContainer,
)
else
@@ -911,12 +912,13 @@ class MessageBubble extends StatelessWidget {
child: Stack(
children: [
if (imageUrl.isNotEmpty)
Image.network(
imageUrl,
CachedNetworkImage(
imageUrl: imageUrl,
width: constrainedWidth,
height: constrainedHeight,
fit: BoxFit.cover,
errorBuilder: (_, __, ___) => _buildPhotoPlaceholder(
fadeInDuration: const Duration(milliseconds: 120),
errorWidget: (_, __, ___) => _buildPhotoPlaceholder(
ctx,
constrainedWidth,
constrainedHeight,
@@ -1015,12 +1017,13 @@ class MessageBubble extends StatelessWidget {
child: Stack(
children: [
if (imageUrl.isNotEmpty)
Image.network(
imageUrl,
CachedNetworkImage(
imageUrl: imageUrl,
fit: BoxFit.cover,
width: double.infinity,
height: double.infinity,
errorBuilder: (_, __, ___) =>
fadeInDuration: const Duration(milliseconds: 120),
errorWidget: (_, __, ___) =>
_buildPhotoPlaceholder(ctx, 100, 100),
)
else
@@ -1049,12 +1052,13 @@ class MessageBubble extends StatelessWidget {
child: Stack(
children: [
if (imageUrl.isNotEmpty)
Image.network(
imageUrl,
CachedNetworkImage(
imageUrl: imageUrl,
fit: BoxFit.cover,
width: double.infinity,
height: double.infinity,
errorBuilder: (_, __, ___) =>
fadeInDuration: const Duration(milliseconds: 120),
errorWidget: (_, __, ___) =>
_buildPhotoPlaceholder(ctx, 100, 100),
)
else
@@ -1276,12 +1280,13 @@ class MessageBubble extends StatelessWidget {
child: Stack(
children: [
if (preview.isNotEmpty)
Image.network(
preview,
CachedNetworkImage(
imageUrl: preview,
width: 150,
height: 150,
fit: BoxFit.contain,
errorBuilder: (_, __, ___) =>
fadeInDuration: const Duration(milliseconds: 120),
errorWidget: (_, __, ___) =>
_buildPhotoPlaceholder(ctx, 150, 150),
)
else
@@ -1333,10 +1338,11 @@ class MessageBubble extends StatelessWidget {
child: photoUrl != null && photoUrl.isNotEmpty
? ClipRRect(
borderRadius: BorderRadius.circular(24),
child: Image.network(
photoUrl,
child: CachedNetworkImage(
imageUrl: photoUrl,
fit: BoxFit.cover,
errorBuilder: (_, __, ___) => Icon(
fadeInDuration: const Duration(milliseconds: 120),
errorWidget: (_, __, ___) => Icon(
Symbols.person,
color: isMe ? Colors.white : cs.primary,
size: 24,
@@ -1435,7 +1441,7 @@ class MessageBubble extends StatelessWidget {
if (senderAvatar != null && senderAvatar.isNotEmpty)
CircleAvatar(
radius: 10,
backgroundImage: NetworkImage(senderAvatar),
backgroundImage: CachedNetworkImageProvider(senderAvatar),
backgroundColor: cs.primaryContainer,
)
else
@@ -1478,10 +1484,11 @@ class MessageBubble extends StatelessWidget {
child: photoUrl != null && photoUrl.isNotEmpty
? ClipRRect(
borderRadius: BorderRadius.circular(24),
child: Image.network(
photoUrl,
child: CachedNetworkImage(
imageUrl: photoUrl,
fit: BoxFit.cover,
errorBuilder: (_, __, ___) => Icon(
fadeInDuration: const Duration(milliseconds: 120),
errorWidget: (_, __, ___) => Icon(
Symbols.person,
color: isMe ? Colors.white : cs.primary,
size: 24,