在flutter中如何使用图片/网络图片和ICON

本文介绍了在Flutter中如何加载和显示图片,包括从资产文件和网络加载图片的方法,并详细讲解了Image widget的各种参数及其作用。此外,还介绍了如何使用字体图标,并提供了MaterialDesign字体图标的使用示例。

原文查看

图片及ICON

图片

Flutter中,我们可以通过Image来加载并显示图片,Image的数据源可以是asset、文件、内存以及网络。

ImageProvider

ImageProvider 是一个抽象类,主要定义了图片数据获取的接口load(),从不同的数据源获取图片需要实现不同的ImageProvider ,如AssetImage是实现了从Asset中加载图片的ImageProvider,而NetworkImage实现了从网络加载图片的ImageProvider。

Image

Image widget有一个必选的image参数,它对应一个ImageProvider。下面我们分别演示一下如何从asset和网络加载图片。

从asset中加载图片

  1. 在工程根目录下创建一个images目录,并将图片avatar.png拷贝到该目录。

  2. pubspec.yml中的flutter部分添加如下内容:

    assets: - images/avatar.png

     

  3.  

  4.  

  5.  

  6.  

    加载该图片

    Image( image: AssetImage("images/avatar.png"), width: 100.0 ); 

    Image也提供了一个快捷的构造函数Image.asset用于从asset中加载、显示图片:

    Image.asset("images/avatar.png", width: 100.0, )

    从网络加载图片

    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-20180829163427556

    参数

    Image在显示图片时定义了一系列参数,通过这些参数我们可以控制图片的显示外观、大小、混合效果等。我们看一下Image的主要参数:

     

    const Image({
      ...
      this.width, //图片的宽
      this.height, //图片高度
      this.color, //图片的混合色值
      this.colorBlendMode, //混合模式
      this.fit,//缩放模式
      this.alignment = Alignment.center, //对齐方式
      this.repeat = ImageRepeat.noRepeat, //重复方式
      ...
    })
    • widthheight:用于设置图片的宽、高,当不指定宽高时,图片会根据当前父容器的限制,尽可能的显示其原始大小,如果只设置widthheight的其中一个,那么另一个属性默认会按比例缩放,但可以通过下面介绍的fit属性来指定适应规则。

    • fit:该属性用于在图片的显示空间和图片本身大小不同时指定图片的适应模式。适应模式是在BoxFit中定义,它是一个枚举类型,有如下值:

      • fill:会拉伸填充满显示空间,图片本身长宽比会发生变化,图片会变形。
      • cover:会按图片的长宽比放大后居中填满显示空间,图片不会变形,超出显示空间部分会被剪裁。
      • contain:这是图片的默认适应规则,图片会在保证图片本身长宽比不变的情况下缩放以适应当前显示空间,图片不会变形。
      • fitWidth:图片的宽度会缩放到显示空间的宽度,高度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。
      • fitHeight:图片的高度会缩放到显示空间的高度,宽度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。
      • none:图片没有适应策略,会在显示空间内显示图片,如果图片比显示空间大,则显示空间只会显示图片中间部分。

      一图胜万言:

      image-20180829162853209

    • color和 colorBlendMode:在图片绘制时可以对每一个像素进行颜色混合处理,color指定混合色,而colorBlendMode指定混合模式,下面是一个简单的示例:

     

    Image(
      image: AssetImage("images/avatar.png"),
      width: 100.0,
      color: Colors.blue,
      colorBlendMode: BlendMode.difference,
    );

    运行效果如下(彩色):

    image-20180829164208961

    • repeat:当图片本身大小小于显示空间时,指定图片的重复规则。简单示例如下:

    Image(
      image: AssetImage("images/avatar.png"),
      width: 100.0,
      height: 200.0,
      repeat: ImageRepeat.repeatY ,
    )
    • 运行后效果如下:

      image-20180829165404877

    ICON

    Flutter中,可以像web开发一样使用iconfont,iconfont即“字体图标”,它是将图标做成字体文件,然后通过指定不同的字符而显示不同的图片。

    在字体文件中,每一个字符都对应一个位码,而每一个位码对应一个显示字形,不同的字体就是指字形不同,即字符对应的字形是不同的。而在iconfont中,只是将位码对应的字形做成了图标,所以不同的字符最终就会渲染成不同的图标。

    在Flutter开发中,iconfont和图片相比有如下优势:

    1. 体积小:可以减小安装包大小。
    2. 矢量的:iconfont都是矢量图标,放大不会影响其清晰度。
    3. 可以应用文本样式:可以像文本一样改变字体图标的颜色、大小对齐等。
    4. 可以通过TextSpan和文本混用。

    使用Material Design字体图标

    Flutter默认包含了一套Material Design的字体图标,在pubspec.yaml文件中的配置如下

    flutter: uses-material-design: true 

    Material Design所有图标可以在其官网查看:https://material.io/tools/icons/

    我们看一个简单的例子:

     

    String icons = "";
    // accessible:  or 0xE914 or E914
    icons += "\uE914";
    // error:  or 0xE000 or E000
    icons += " \uE000";
    // fingerprint:  or 0xE90D or E90D
    icons += " \uE90D";
    
    Text(icons,
      style: TextStyle(
          fontFamily: "MaterialIcons",
          fontSize: 24.0,
          color: Colors.green
      ),
    );

    运行效果如下:

    image-20180829174100598

    通过这个示例可以看到,使用图标就像使用文本一样,但是这种方式需要我们提供每个图标的码点,这并对开发者不友好,所以,Flutter封装了一个IconDataIcon来专门显示字体图标,上面的例子也可以用如下方式实现:

    Row(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Icon(Icons.accessible,color: Colors.green,),
        Icon(Icons.error,color: Colors.green,),
        Icon(Icons.fingerprint,color: Colors.green,),
      ],
    )

     

     

     

     

    

Icons类中包含了所有Material Design图标的IconData静态变量定义。

使用自定义字体图标

<think>好的,我现在要处理用户关于Flutter网络图片缓存实现的问题。用户之前可能已经问过相关问题,或者系统有相关的引用资料,但根据提供的引用内容,用户引用了两篇关于Flutter网络图片缓存清除缓存的文章。用户现在想了解具体的实现方法。 首先,我需要回忆Flutter中默认的图片缓存机制。默认情况下,使用Image.network加载图片时,Flutter使用内存缓存,但不会进行磁盘缓存。这意味着应用重启后需要重新下载图片,影响用户体验流量消耗。用户希望实现更持久的缓存,可能需要同时利用内存磁盘缓存。 接下来,我需要考虑如何扩展默认的缓存机制。根据引用[1]提到的,用户可以通过改造Image.network来增加磁盘缓存。这可能需要自定义ImageProvider或者使用现有的第三方库,比如cached_network_image。需要分析这两种方法的优缺点。 然后,查看用户提供的引用,引用[1]提到可以通过自己设计框架,基于Image.network进行改造,增加磁盘缓存。而引用[2]提到了使用cached_network_image插件flutter_cache_manager插件,这可能是更成熟的解决方案。用户可能希望知道这两种方法的实现步骤。 对于自定义实现,可能需要利用flutter_cache_manager来管理磁盘缓存,结合Image.network的内存缓存。或者直接使用cached_network_image插件,它已经集成了内存磁盘缓存。需要详细说明这两种方法的步骤,包括依赖添加、代码示例以及配置选项。 还需要考虑缓存的清除,如引用[2]中提到的如何清除指定缓存,这可能涉及到调用CacheManager的方法。在回答中是否需要提及缓存管理,比如设置缓存大小、清除策略等。 另外,要确保回答结构清晰,分步骤说明,并提供代码示例。同时,需要遵循用户的格式要求,使用正确的LaTeX语法,但根据用户的问题,这里可能不需要数学公式,但需要确保代码块正确。 可能还需要比较自定义实现使用第三方库的优劣。例如,自定义更灵活但需要更多工作,而第三方库更便捷但可能有依赖风险。用户可能需要根据项目需求选择适合的方法。 最后,生成相关问题,例如性能优化、缓存策略配置、清除缓存的方法等,帮助用户进一步了解相关主题。</think>在Flutter中实现网络图片缓存可通过原生机制改造或第三方库实现,具体方法如下: ### 一、原生机制扩展实现 Flutter默认的`Image.network`仅支持内存缓存,需结合`flutter_cache_manager`增加磁盘缓存: ```yaml dependencies: flutter_cache_manager: ^3.4.1 ``` ```dart import 'package:flutter_cache_manager/flutter_cache_manager.dart'; class CachedNetworkImage extends StatelessWidget { final String url; Widget build(BuildContext context) { return FutureBuilder<File>( future: DefaultCacheManager().getSingleFile(url), builder: (context, snapshot) { if (snapshot.hasData) { return Image.file(snapshot.data!); } return Image.network(url); // 内存缓存自动生效 } ); } } ``` 此方案通过双重缓存机制实现: 1. 内存缓存:由`Image`组件自动管理,基于LRU策略保留最近使用图片[^1] 2. 磁盘缓存:`flutter_cache_manager`默认缓存7天,最大数量200个文件[^2] ### 二、第三方库成熟方案 推荐使用`cached_network_image`插件: ```yaml dependencies: cached_network_image: ^3.4.1 ``` 基础使用: ```dart CachedNetworkImage( imageUrl: 'http://example.com/image.jpg', placeholder: (context, url) => CircularProgressIndicator(), errorWidget: (context, url, error) => Icon(Icons.error), ) ``` 高级配置: ```dart CacheManager customManager = CacheManager( Config( 'custom_cache_key', maxNrOfCacheObjects: 100, // 最大缓存数量 stalePeriod: Duration(days: 3), // 过期时间 ) ); CachedNetworkImage( cacheManager: customManager, imageUrl: 'http://example.com/image.jpg' ) ``` ### 三、性能优化建议 1. 预加载机制: ```dart precacheImage( CachedNetworkImageProvider(url), context ); ``` 2. 缓存命中率监控: ```dart final info = await DefaultCacheManager().getFileFromCache(url); print('缓存状态:${info?.origin}'); // 输出origin判断是否命中缓存 ``` ### 四、缓存清除策略 ```dart // 清除单张 await DefaultCacheManager().removeFile(url); // 清除全部 await DefaultCacheManager().emptyCache(); // 设置自动清理 Config( maxAgeCacheObject: Duration(days: 7) // 自动清理7天前文件 ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值