From 8565aa24d455860b80360761dfddd07807964e26 Mon Sep 17 00:00:00 2001 From: Samuel Mezger <8278293-SamuelMezger@users.noreply.gitlab.com> Date: Sun, 3 Apr 2022 07:32:12 +0000 Subject: [PATCH] fix: Don't request new thumbnail resolution on every window resize --- lib/widgets/content_banner.dart | 41 ++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/lib/widgets/content_banner.dart b/lib/widgets/content_banner.dart index 46ea7465..1ceabbc5 100644 --- a/lib/widgets/content_banner.dart +++ b/lib/widgets/content_banner.dart @@ -1,3 +1,5 @@ +import 'dart:ui'; + import 'package:flutter/material.dart'; import 'package:cached_network_image/cached_network_image.dart'; @@ -27,17 +29,7 @@ class ContentBanner extends StatelessWidget { @override Widget build(BuildContext context) { - final mediaQuery = MediaQuery.of(context); - final bannerSize = - (mediaQuery.size.width * mediaQuery.devicePixelRatio).toInt(); final onEdit = this.onEdit; - final src = mxContent?.getThumbnail( - client ?? Matrix.of(context).client, - width: bannerSize, - height: bannerSize, - method: ThumbnailMethod.scale, - animated: true, - ); return Container( height: height, alignment: Alignment.center, @@ -53,12 +45,29 @@ class ContentBanner extends StatelessWidget { bottom: 0, child: Opacity( opacity: opacity, - child: (!loading && src != null) - ? CachedNetworkImage( - imageUrl: src.toString(), - height: 300, - fit: BoxFit.cover, - ) + child: (!loading) + ? LayoutBuilder(builder: + (BuildContext context, BoxConstraints constraints) { + // #775 don't request new image resolution on every resize + // by rounding up to the next multiple of stepSize + const stepSize = 300; + final bannerSize = + constraints.maxWidth * window.devicePixelRatio; + final steppedBannerSize = + (bannerSize / stepSize).ceil() * stepSize; + final src = mxContent?.getThumbnail( + client ?? Matrix.of(context).client, + width: steppedBannerSize, + height: steppedBannerSize, + method: ThumbnailMethod.scale, + animated: true, + ); + return CachedNetworkImage( + imageUrl: src.toString(), + height: 300, + fit: BoxFit.cover, + ); + }) : Icon(defaultIcon, size: 200), ), ),