上一节介绍了按钮组件的使用,这一节将介绍图片部件。
Flutter的图片部件支持JPEG、PNG、GIF、动画GIF、WebP、动画WebP、BMP、WBMP等图像格式。底层平台可能支持其他格式。Flutter将尝试调用平台API来解码无法识别的格式,如果平台API支持解码图像,Flutter将能够渲染图像。
构造方法
Image({ Key? key, required ImageProvider image, double? width, double? height, BoxFit? fit, AlignmentGeometry alignment = Alignment.center, ImageRepeat repeat = ImageRepeat.noRepeat, Rect? centerSlice, bool matchTextDirection = false, bool gaplessPlayback = false, bool isAntiAlias = false, FilterQuality filterQuality = FilterQuality.low, Color? color, BlendMode? colorBlendMode, BoxFit? errorBuilder(BuildContext context, Object error, StackTrace? stackTrace), bool excludeFromSemantics = false, int? semanticLabel, bool loadingBuilder(BuildContext? context, Widget child, ImageChunkEvent? loadingProgress),})
常用参数说明:
内置构造函数
assets: - images/avatar.png
注意: 由于 yaml 文件对缩进严格,所以必须严格按照每一层两个空格的方式进行缩进,此处 assets 前面应有两个空格。
Image( image: AssetImage("images/avatar.png"), width: 100.0);
Image.asset("images/avatar.png", width: 100.0,)
NetworkImage 可以加载网络图片,例如:
Image( image: NetworkImage( "https://avatars2.githubusercontent.com/u/20411648?s=460&v=4"), width: 100.0,)
Image也提供了一个快捷的构造函数Image.network用于从网络加载、显示图片:
Image.network( "https://avatars2.githubusercontent.com/u/20411648?s=460&v=4", width: 100.0,)
运行上面两个示例,效果如下:
从本地文件下加载图片,代码如下:
Image.file(File('file://test.png'))
有时我们图片已经加载过了,并且我们已经拿到数据信息,就没必要再加载一次了,直接加载现有的数据即可。或者是我们生成的一张图片,这时也直接加载即可。
// 内存中加载Image.memory(memoryData)// 定义图片数据late Uint8List memoryData;// 加载图片到内存中loadAssetImage('img_02.jpeg'.img);// 加载资源图片Future<void> loadAssetImage(String path) async { var data = await rootBundle.load(path); memoryData = data.buffer.asUint8List(); setState(() {});}
从网络加载图片,直接使用 Flutter 自带的 Image.network 下载图片只会缓存在内存中,如果app退出之后,下次再加载该网络图片又需要重新下载,体验和性能都不太好。
cached_network_image 是一个 Flutter 插件,提供了一个带有缓存功能的网络图像加载器,可以有效地加载和缓存网络图像,提高应用程序的性能并节省带宽消耗。
主要特点:
构造方法
CachedNetworkImage({ Key? key, required String imageUrl, double? width, double? height, BoxFit? fit, AlignmentGeometry alignment = Alignment.center, Widget? placeholder, LoadingErrorWidgetBuilder? errorWidget, Duration? fadeInDuration, Curve fadeInCurve = Curves.easeIn, Duration fadeOutDuration = const Duration(milliseconds: 1000), Curve fadeOutCurve = Curves.easeOut, Widget? progressIndicator, ProgressIndicatorBuilder? progressIndicatorBuilder, double? progressIndicatorHeight, double? progressIndicatorWidth, bool useOldImageOnUrlChange = false, ImageRenderMethodForWeb? imageRenderMethodForWeb, int? memCacheWidth, int? memCacheHeight, FilterQuality? filterQuality, int? fadeOutDurationMs, int? fadeInDurationMs, int? maxHeightDiskCache, int? maxWidthDiskCache, bool cacheKeyIncludeUrl = true, BaseCacheManager? cacheManager, bool? ignoreMemoryCache, bool? ignoreDiskCache, ImageCacheManager? imageCacheManager, Duration? cacheValidTtl, Duration? cacheInvalidTtl, bool disableMemoryCache = false, bool disableDiskCache = false, Stream<FileInfo>? fileInfoStream, bool cacheManagerVerification,})
主要参数:
具体使用
dependencies: flutter: sdk: flutter cached_network_image: ^3.3.1
CachedNetworkImage( imageUrl: "http://via.placeholder.com/350x150", placeholder: (context, url) => CircularProgressIndicator(), errorWidget: (context, url, error) => Icon(Icons.error), ),
Flutter 中的 Image 组件是用于显示图像的基础组件,具有以下特点:
cached_network_image 是一个非常有用的 Flutter 插件,可以有效地管理和加载网络图像,并提供了丰富的功能和配置选项。通过使用该插件,可以显著提高应用程序的性能和用户体验,特别是在需要频繁加载和显示网络图像的情况下。