Fladder/lib/util/fladder_image.dart
2025-07-31 16:56:35 +02:00

67 lines
2.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_blurhash/flutter_blurhash.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:transparent_image/transparent_image.dart';
import 'package:fladder/models/items/images_models.dart';
import 'package:fladder/providers/settings/client_settings_provider.dart';
class FladderImage extends ConsumerWidget {
final ImageData? image;
final Widget Function(BuildContext context, Widget child, int? frame, bool wasSynchronouslyLoaded)? frameBuilder;
final Widget Function(BuildContext context, Object object, StackTrace? stack)? imageErrorBuilder;
final Widget? placeHolder;
final StackFit stackFit;
final BoxFit fit;
final BoxFit? blurFit;
final AlignmentGeometry? alignment;
final bool disableBlur;
final bool blurOnly;
const FladderImage({
required this.image,
this.frameBuilder,
this.imageErrorBuilder,
this.placeHolder,
this.stackFit = StackFit.expand,
this.fit = BoxFit.cover,
this.blurFit,
this.alignment,
this.disableBlur = false,
this.blurOnly = false,
super.key,
});
@override
Widget build(BuildContext context, WidgetRef ref) {
final useBluredPlaceHolder = ref.watch(clientSettingsProvider.select((value) => value.blurPlaceHolders));
final newImage = image;
if (newImage == null) {
return placeHolder ?? Container();
} else {
return Stack(
key: Key(newImage.key),
fit: stackFit,
children: [
if (!disableBlur && useBluredPlaceHolder && newImage.hash.isNotEmpty || blurOnly)
BlurHash(
hash: newImage.hash,
optimizationMode: BlurHashOptimizationMode.approximation,
color: Colors.transparent,
imageFit: blurFit ?? fit,
),
if (!blurOnly)
FadeInImage(
placeholder: Image.memory(kTransparentImage).image,
fit: fit,
placeholderFit: fit,
excludeFromSemantics: true,
alignment: alignment ?? Alignment.center,
imageErrorBuilder: imageErrorBuilder,
image: newImage.imageProvider,
)
],
);
}
}
}