flutter_kinetra/lib/kt_widgets/kt_network_image.dart
2025-09-17 18:13:57 +08:00

97 lines
2.7 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:flutter_kinetra/kt_utils/kt_string_extend.dart';
/// 带有缓存功能的网络图片组件
class KtNetworkImage extends StatelessWidget {
final String imageUrl;
final double? width;
final double? height;
final BoxFit? fit;
final Widget? placeholder;
final Widget? errorWidget;
final BorderRadius? borderRadius;
const KtNetworkImage({
super.key,
required this.imageUrl,
this.width,
this.height,
this.fit = BoxFit.cover,
this.placeholder,
this.errorWidget,
this.borderRadius,
});
@override
Widget build(BuildContext context) {
// 如果URL为空直接显示错误组件
if (imageUrl.isEmpty) {
return errorWidget ?? _buildDefaultErrorWidget();
}
// 基础的CachedNetworkImage配置
Widget imageWidget = CachedNetworkImage(
imageUrl: imageUrl,
width: width,
height: height,
fit: fit,
filterQuality: FilterQuality.high,
placeholder: (context, url) => placeholder ?? _buildDefaultPlaceholder(),
errorWidget: (context, url, error) =>
errorWidget ?? _buildDefaultErrorWidget(),
cacheManager: CacheManager(
Config(
'customImageCache',
stalePeriod: const Duration(days: 7),
maxNrOfCacheObjects: 100,
),
),
fadeInDuration: const Duration(milliseconds: 300),
fadeOutDuration: const Duration(milliseconds: 300),
);
// 如果设置了圆角使用ClipRRect包裹
if (borderRadius != null) {
imageWidget = ClipRRect(borderRadius: borderRadius!, child: imageWidget);
}
return imageWidget;
}
// 默认占位符组件
Widget _buildDefaultPlaceholder() {
Widget imageWidget = Image.asset(
(width ?? 0) > (height ?? 0)
? 'ic_image_hor.png'.ktIcon
: 'ic_image_ver.png'.ktIcon,
width: width,
height: height,
fit: fit,
);
// 如果设置了圆角使用ClipRRect包裹
if (borderRadius != null) {
imageWidget = ClipRRect(borderRadius: borderRadius!, child: imageWidget);
}
return imageWidget;
}
// 默认错误组件
Widget _buildDefaultErrorWidget() {
Widget imageWidget = Image.asset(
(width ?? 0) > (height ?? 0)
? 'ic_image_hor.png'.ktIcon
: 'ic_image_ver.png'.ktIcon,
width: width,
height: height,
fit: fit,
);
// 如果设置了圆角使用ClipRRect包裹
if (borderRadius != null) {
imageWidget = ClipRRect(borderRadius: borderRadius!, child: imageWidget);
}
return imageWidget;
}
}