uses hook instead of stateful widget to be more consistent

This commit is contained in:
Marty Fuhry 2024-02-21 20:07:34 -05:00
parent c0ef300040
commit 4d60133504
No known key found for this signature in database
GPG Key ID: E2AB6392D894D900

View File

@ -2,6 +2,7 @@ import 'dart:convert';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:immich_mobile/modules/asset_viewer/image_providers/immich_local_thumbnail_provider.dart'; import 'package:immich_mobile/modules/asset_viewer/image_providers/immich_local_thumbnail_provider.dart';
import 'package:immich_mobile/modules/asset_viewer/image_providers/immich_remote_image_provider.dart'; import 'package:immich_mobile/modules/asset_viewer/image_providers/immich_remote_image_provider.dart';
import 'package:immich_mobile/shared/models/asset.dart'; import 'package:immich_mobile/shared/models/asset.dart';
@ -9,7 +10,7 @@ import 'package:immich_mobile/shared/ui/thumbhash_placeholder.dart';
import 'package:octo_image/octo_image.dart'; import 'package:octo_image/octo_image.dart';
import 'package:thumbhash/thumbhash.dart' as thumbhash; import 'package:thumbhash/thumbhash.dart' as thumbhash;
class ImmichThumbnail extends StatefulWidget { class ImmichThumbnail extends HookWidget {
const ImmichThumbnail({ const ImmichThumbnail({
this.asset, this.asset,
this.width = 250, this.width = 250,
@ -62,30 +63,22 @@ class ImmichThumbnail extends StatefulWidget {
static bool useLocal(Asset asset) => !asset.isRemote || asset.isLocal; static bool useLocal(Asset asset) => !asset.isRemote || asset.isLocal;
@override Uint8List? get _blurHash => asset?.thumbhash == null
State<ImmichThumbnail> createState() => _ImmichThumbnailState(); ? null
} : thumbhash.rgbaToBmp(
thumbhash.thumbHashToRGBA(
class _ImmichThumbnailState extends State<ImmichThumbnail> { base64Decode(asset!.thumbhash!),
Uint8List? _decodedBlurHash; ),
);
@override
void initState() {
if (widget.asset?.thumbhash != null) {
final rgbaImage =
thumbhash.thumbHashToRGBA(base64Decode(widget.asset!.thumbhash!));
_decodedBlurHash = thumbhash.rgbaToBmp(rgbaImage);
}
super.initState();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (widget.asset == null) { Uint8List? blurhash = useState(_blurHash).value;
if (asset == null) {
return Container( return Container(
color: Colors.grey, color: Colors.grey,
width: widget.width, width: width,
height: widget.height, height: height,
child: const Center( child: const Center(
child: Icon(Icons.no_photography), child: Icon(Icons.no_photography),
), ),
@ -96,13 +89,13 @@ class _ImmichThumbnailState extends State<ImmichThumbnail> {
placeholderFadeInDuration: Duration.zero, placeholderFadeInDuration: Duration.zero,
fadeInDuration: Duration.zero, fadeInDuration: Duration.zero,
fadeOutDuration: const Duration(milliseconds: 100), fadeOutDuration: const Duration(milliseconds: 100),
octoSet: blurHashOrPlaceholder(_decodedBlurHash), octoSet: blurHashOrPlaceholder(blurhash),
image: ImmichThumbnail.imageProvider( image: ImmichThumbnail.imageProvider(
asset: widget.asset, asset: asset,
), ),
width: widget.width, width: width,
height: widget.height, height: height,
fit: widget.fit, fit: fit,
); );
} }
} }