Fladder/lib/util/fladder_image.dart
PartyDonut c299492d6d
feat: Android TV support (#503)
Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
2025-09-28 21:07:49 +02:00

75 lines
2.4 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;
final int? decodeHeight;
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,
this.decodeHeight = 400,
super.key,
});
@override
Widget build(BuildContext context, WidgetRef ref) {
final useBluredPlaceHolder = ref.watch(clientSettingsProvider.select((value) => value.blurPlaceHolders));
final newImage = image;
final imageProvider = image?.imageProvider;
if (newImage == null) {
return placeHolder ?? Container();
} else {
return Stack(
key: Key(newImage.key),
fit: stackFit,
children: [
if (!disableBlur && useBluredPlaceHolder && newImage.hash.isNotEmpty || blurOnly)
Image(
image: BlurHashImage(
newImage.hash,
decodingHeight: 16,
decodingWidth: 16,
),
fit: blurFit ?? fit,
height: 16,
),
if (!blurOnly && imageProvider != null)
FadeInImage(
placeholder: MemoryImage(kTransparentImage),
fit: fit,
placeholderFit: fit,
alignment: alignment ?? Alignment.center,
imageErrorBuilder: imageErrorBuilder,
image: ResizeImage(
imageProvider,
height: decodeHeight,
),
)
],
);
}
}
}