fix(perf): memory optimization, prevent OOM on mobile, and completely disable mouse wheel zoom
This commit is contained in:
@@ -1474,6 +1474,8 @@ class _FavoriteArtistsSection extends ConsumerWidget {
|
||||
fav.avatarUrl!.isNotEmpty
|
||||
? CachedNetworkImage(
|
||||
imageUrl: fav.avatarUrl!,
|
||||
memCacheWidth: 120,
|
||||
memCacheHeight: 120,
|
||||
fit: BoxFit.cover,
|
||||
placeholder: (_, __) => const Icon(
|
||||
Icons.person_rounded,
|
||||
@@ -1599,6 +1601,8 @@ class _FavoriteArtistMediaStrip extends ConsumerWidget {
|
||||
imageUrl: post.previewUrl.isNotEmpty
|
||||
? post.previewUrl
|
||||
: post.sampleUrl,
|
||||
memCacheWidth: 200,
|
||||
memCacheHeight: 200,
|
||||
fit: BoxFit.cover,
|
||||
placeholder: (_, __) => ColoredBox(
|
||||
color: Theme.of(context)
|
||||
@@ -1706,6 +1710,8 @@ class _ArtistAvatar extends StatelessWidget {
|
||||
? fallback
|
||||
: CachedNetworkImage(
|
||||
imageUrl: artist.avatarUrl!,
|
||||
memCacheWidth: 140,
|
||||
memCacheHeight: 140,
|
||||
fit: BoxFit.cover,
|
||||
placeholder: (_, __) => fallback,
|
||||
errorWidget: (_, __, ___) => fallback,
|
||||
|
||||
@@ -314,6 +314,8 @@ class _CollectionCard extends ConsumerWidget {
|
||||
if (urls.length == 1) {
|
||||
return CachedNetworkImage(
|
||||
imageUrl: urls[0],
|
||||
memCacheWidth: 260,
|
||||
memCacheHeight: 260,
|
||||
fit: BoxFit.cover,
|
||||
placeholder: (_, __) => Container(color: scheme.surfaceContainerHighest),
|
||||
errorWidget: (_, __, ___) => Container(
|
||||
@@ -333,6 +335,8 @@ class _CollectionCard extends ConsumerWidget {
|
||||
if (i < urls.length)
|
||||
CachedNetworkImage(
|
||||
imageUrl: urls[i],
|
||||
memCacheWidth: 200,
|
||||
memCacheHeight: 200,
|
||||
fit: BoxFit.cover,
|
||||
placeholder: (_, __) =>
|
||||
Container(color: scheme.surfaceContainerHighest),
|
||||
|
||||
@@ -1225,6 +1225,8 @@ class _ArtistCard extends StatelessWidget {
|
||||
),
|
||||
child: CachedNetworkImage(
|
||||
imageUrl: url,
|
||||
memCacheWidth: 128,
|
||||
memCacheHeight: 128,
|
||||
fit: BoxFit.cover,
|
||||
placeholder: (_, __) => Container(
|
||||
color: scheme.surfaceContainerHighest,
|
||||
|
||||
@@ -1155,6 +1155,8 @@ class _NeighborStrip extends StatelessWidget {
|
||||
imageUrl: post.previewUrl.isNotEmpty
|
||||
? post.previewUrl
|
||||
: post.sampleUrl,
|
||||
memCacheWidth: 160,
|
||||
memCacheHeight: 160,
|
||||
fit: BoxFit.cover,
|
||||
errorWidget: (_, __, ___) =>
|
||||
const Center(child: Icon(Icons.broken_image_rounded)),
|
||||
|
||||
@@ -4,6 +4,7 @@ import 'dart:io';
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:media_kit/media_kit.dart';
|
||||
@@ -316,10 +317,16 @@ class _PostMediaViewerState extends State<PostMediaViewer>
|
||||
),
|
||||
);
|
||||
} else {
|
||||
final mq = MediaQuery.maybeOf(context);
|
||||
final dpr = mq?.devicePixelRatio ?? 1.5;
|
||||
final screenWidth = mq?.size.width ?? 1280;
|
||||
final maxCacheWidth =
|
||||
(screenWidth * dpr * 1.5).round().clamp(1080, 2560);
|
||||
image = CachedNetworkImage(
|
||||
key: ValueKey(url),
|
||||
imageUrl: url,
|
||||
httpHeaders: headers,
|
||||
memCacheWidth: maxCacheWidth,
|
||||
fit: BoxFit.contain,
|
||||
placeholder: (context, url) =>
|
||||
const Center(child: CircularProgressIndicator()),
|
||||
@@ -2205,6 +2212,7 @@ class _ZoomableImageState extends State<_ZoomableImage> {
|
||||
transformationController: _controller,
|
||||
minScale: 1,
|
||||
maxScale: 6,
|
||||
scaleFactor: 1000000.0,
|
||||
boundaryMargin: const EdgeInsets.all(160),
|
||||
panEnabled: _zoomed,
|
||||
scaleEnabled: true,
|
||||
@@ -2221,7 +2229,15 @@ class _ZoomableImageState extends State<_ZoomableImage> {
|
||||
if (mounted) setState(() => _zoomed = nextZoomed);
|
||||
_setLocked(nextZoomed || _pointerCount >= 2);
|
||||
},
|
||||
child: child,
|
||||
child: Listener(
|
||||
onPointerSignal: (event) {
|
||||
if (event is PointerScrollEvent) {
|
||||
GestureBinding.instance.pointerSignalResolver
|
||||
.register(event, (_) {});
|
||||
}
|
||||
},
|
||||
child: child,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -427,6 +427,8 @@ class _ViewedPostTile extends StatelessWidget {
|
||||
)
|
||||
: CachedNetworkImage(
|
||||
imageUrl: image,
|
||||
memCacheWidth: 320,
|
||||
memCacheHeight: 320,
|
||||
fit: BoxFit.cover,
|
||||
placeholder: (_, __) => Container(
|
||||
color: scheme.surfaceContainerHighest,
|
||||
|
||||
Reference in New Issue
Block a user