-
-
Notifications
You must be signed in to change notification settings - Fork 280
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: Fix performances on the photos gallery #5447
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,7 +11,7 @@ import 'package:smooth_app/resources/app_icons.dart'; | |
import 'package:smooth_app/themes/smooth_theme_colors.dart'; | ||
|
||
/// Displays a product image thumbnail with the upload date on top. | ||
class ProductImageWidget extends StatefulWidget { | ||
class ProductImageWidget extends StatelessWidget { | ||
const ProductImageWidget({ | ||
required this.productImage, | ||
required this.barcode, | ||
|
@@ -22,33 +22,6 @@ class ProductImageWidget extends StatefulWidget { | |
final String barcode; | ||
final double squareSize; | ||
|
||
@override | ||
State<ProductImageWidget> createState() => _ProductImageWidgetState(); | ||
} | ||
|
||
class _ProductImageWidgetState extends State<ProductImageWidget> { | ||
@override | ||
void initState() { | ||
super.initState(); | ||
_loadImagePalette(); | ||
} | ||
|
||
Future<void> _loadImagePalette() async { | ||
final ColorScheme palette = await ColorScheme.fromImageProvider( | ||
provider: NetworkImage(widget.productImage.getUrl( | ||
widget.barcode, | ||
uriHelper: ProductQuery.uriProductHelper, | ||
))); | ||
|
||
setState(() { | ||
backgroundColor = palette.primaryContainer; | ||
darkBackground = backgroundColor!.computeLuminance() < 0.5; | ||
}); | ||
} | ||
|
||
Color? backgroundColor; | ||
bool? darkBackground; | ||
|
||
@override | ||
Widget build(BuildContext context) { | ||
final SmoothColorsThemeExtension colors = | ||
|
@@ -57,20 +30,20 @@ class _ProductImageWidgetState extends State<ProductImageWidget> { | |
final DateFormat dateFormat = | ||
DateFormat.yMd(ProductQuery.getLanguage().offTag); | ||
|
||
darkBackground = darkBackground ?? true; | ||
|
||
final Widget image = SmoothImage( | ||
width: widget.squareSize, | ||
height: widget.squareSize, | ||
cacheHeight: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. No It's a bit strange to say "you can force There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here we have a square, but the server's photo may have a different ratio. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I understand the square effect. I don't know how relevant this cache option would be, performance-wise. I also fear that this cache option entail side-effects: what if I download a full image with that cache option for a thumbnail, and then display the full image on a full screen after a tap? From the docs, I assume that the cached image will be stored as resized, and then reused, which would render a pixelized image. At least, you could add a comment about why cacheHeight but not cacheWidth. |
||
(squareSize * MediaQuery.devicePixelRatioOf(context)).toInt(), | ||
width: squareSize, | ||
height: squareSize, | ||
imageProvider: NetworkImage( | ||
widget.productImage.getUrl( | ||
widget.barcode, | ||
productImage.getUrl( | ||
barcode, | ||
uriHelper: ProductQuery.uriProductHelper, | ||
), | ||
), | ||
rounded: false, | ||
); | ||
final DateTime? uploaded = widget.productImage.uploaded; | ||
final DateTime? uploaded = productImage.uploaded; | ||
if (uploaded == null) { | ||
return image; | ||
} | ||
|
@@ -85,7 +58,7 @@ class _ProductImageWidgetState extends State<ProductImageWidget> { | |
button: true, | ||
child: SmoothCard( | ||
padding: EdgeInsets.zero, | ||
color: backgroundColor ?? colors.primaryBlack, | ||
color: colors.primaryBlack, | ||
borderRadius: ANGULAR_BORDER_RADIUS, | ||
margin: EdgeInsets.zero, | ||
child: ClipRRect( | ||
|
@@ -108,11 +81,7 @@ class _ProductImageWidgetState extends State<ProductImageWidget> { | |
child: AutoSizeText( | ||
date, | ||
maxLines: 1, | ||
style: TextStyle( | ||
color: darkBackground! | ||
? Colors.white | ||
: colors.primaryDark, | ||
), | ||
style: const TextStyle(color: Colors.white), | ||
), | ||
), | ||
if (expired) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Those
cache
parameters may be helpful regarding memory, but not network latency.Please consider implementing my suggestion about
ImageSize.DISPLAY
. That will dramatically help for memory too!There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, I will.
I think, I will also add all variants of
ImageSize
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good. Btw I don't think all variants are always implemented; I would focus on 400 and FULL only.