diff --git a/lib/pages/chat/events/image_bubble.dart b/lib/pages/chat/events/image_bubble.dart index 217ff4807..924e458fe 100644 --- a/lib/pages/chat/events/image_bubble.dart +++ b/lib/pages/chat/events/image_bubble.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:flutter_blurhash/flutter_blurhash.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/pages/image_viewer/image_viewer.dart'; import 'package:fluffychat/widgets/mxc_image.dart'; +import '../../../widgets/blur_hash.dart'; class ImageBubble extends StatelessWidget { final Event event; @@ -40,15 +40,11 @@ class ImageBubble extends StatelessWidget { event.infoMap['xyz.amorgan.blurhash'] is String ? event.infoMap['xyz.amorgan.blurhash'] : 'LEHV6nWB2yk8pyo0adR*.7kCMdnj'; - return SizedBox( + return BlurHash( + blurhash: blurHashString, width: width, height: height, - child: BlurHash( - hash: blurHashString, - decodingWidth: width.round(), - decodingHeight: height.round(), - imageFit: fit, - ), + fit: fit, ); } diff --git a/lib/pages/chat/events/video_player.dart b/lib/pages/chat/events/video_player.dart index 573e1eb14..66e50b783 100644 --- a/lib/pages/chat/events/video_player.dart +++ b/lib/pages/chat/events/video_player.dart @@ -4,7 +4,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:chewie/chewie.dart'; -import 'package:flutter_blurhash/flutter_blurhash.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:matrix/matrix.dart'; import 'package:path_provider/path_provider.dart'; @@ -14,6 +13,7 @@ import 'package:video_player/video_player.dart'; import 'package:fluffychat/pages/chat/events/image_bubble.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/event_extension.dart'; +import 'package:fluffychat/widgets/blur_hash.dart'; import '../../../utils/error_reporter.dart'; class EventVideoPlayer extends StatefulWidget { @@ -112,7 +112,7 @@ class EventVideoPlayerState extends State { ), ) else - BlurHash(hash: blurHash), + BlurHash(blurhash: blurHash, width: 300, height: 300), Center( child: OutlinedButton.icon( style: OutlinedButton.styleFrom( diff --git a/lib/widgets/blur_hash.dart b/lib/widgets/blur_hash.dart new file mode 100644 index 000000000..d0298a4e1 --- /dev/null +++ b/lib/widgets/blur_hash.dart @@ -0,0 +1,57 @@ +import 'dart:typed_data'; + +import 'package:flutter/material.dart'; + +import 'package:blurhash_dart/blurhash_dart.dart' as b; +import 'package:image/image.dart' as image; + +class BlurHash extends StatefulWidget { + final double width; + final double height; + final String blurhash; + final BoxFit fit; + + const BlurHash({ + super.key, + String? blurhash, + required this.width, + required this.height, + this.fit = BoxFit.cover, + }) : blurhash = blurhash ?? 'LEHV6nWB2yk8pyo0adR*.7kCMdnj'; + + @override + State createState() => _BlurHashState(); +} + +class _BlurHashState extends State { + Uint8List? _data; + + Future getBlurhashData() async { + final blurhash = b.BlurHash.decode(widget.blurhash); + final img = blurhash.toImage(widget.width.round(), widget.height.round()); + return _data ??= Uint8List.fromList(image.encodePng(img)); + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: getBlurhashData(), + builder: (context, snapshot) { + final data = snapshot.data; + if (data == null) { + return Container( + width: widget.width, + height: widget.height, + color: Theme.of(context).colorScheme.surface, + ); + } + return Image.memory( + data, + fit: widget.fit, + width: widget.width, + height: widget.height, + ); + }, + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index add5603f4..6af85d5bb 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -438,14 +438,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.5.0" - flutter_blurhash: - dependency: "direct main" - description: - name: flutter_blurhash - sha256: "5e67678e479ac639069d7af1e133f4a4702311491188ff3e0227486430db0c06" - url: "https://pub.dev" - source: hosted - version: "0.8.2" flutter_cache_manager: dependency: "direct main" description: @@ -905,13 +897,13 @@ packages: source: hosted version: "4.0.2" image: - dependency: transitive + dependency: "direct main" description: name: image - sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" + sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" url: "https://pub.dev" source: hosted - version: "4.1.3" + version: "4.1.7" image_picker: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index b7d2590ab..3dc5cc9fe 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -30,7 +30,6 @@ dependencies: flutter: sdk: flutter flutter_app_badger: ^1.5.0 - flutter_blurhash: ^0.8.2 flutter_cache_manager: ^3.3.0 flutter_file_dialog: ^3.0.2 flutter_foreground_task: ^6.0.0+1 @@ -59,6 +58,7 @@ dependencies: hive_flutter: ^1.1.0 html: ^0.15.4 http: ^0.13.6 + image: ^4.1.7 image_picker: ^1.0.0 intl: any just_audio: ^0.9.30