[Flutter 基础] - Flutter基础组件 - Image

Image组件是Flutter中的基础组件之一,也是我们常用来展示图片的核心组件。它既可以展示本地图片,也可以展示网络图片。 这篇文章主要是通过一些简单的demo来了解一下这个组件基本用法。


一、基本用法

首先得确保在 pubspec.yaml 中配置有配置过图片的基础路径,否则项目可能识别不到图片的本地路径:

yaml 复制代码
flutter:
  assets:
    - assets/images/  # 指定图片目录

我们常用的图片加载方式一般都分为三种:

1. 加载本地图片
  • 使用 Image.asset 加载:
dart 复制代码
 Image.asset('assets/images/girl.jpeg',  // 图片的本地地址
   width: 100,
   height: 100,
   fit: BoxFit.cover, // 图片填充方式
 );
2. 加载网络图片
  • 使用 Image.network :

    dart 复制代码
    Image.network(
      'https://picsum.photos/200', // 图片的url地址
      fit: BoxFit.cover,
      width: 200,
      height: 200,
    );
3. 从二进制数据加载

网络图片除了直接url的方式,还有一种是通过接口返回二进制数据或者base64位的数据。image组件也是支持的。

  • 使用 Image.memory (适用于从数据库或加密存储读取的二进制数据):

    dart 复制代码
    Image.memory(
      Uint8List.fromList(bytes), // bytes 是二进制数据
      scale: 2.0, // 缩放系数(适配高分辨率设备)
    );

二、关键属性详解

1. 尺寸控制

  • width 和 height :
    • 直接设置图片宽高,但可能因比例导致变形。
    • 最佳实践 :优先使用 fit 属性控制填充方式,而非强制设置尺寸。

2. fit 属性(填充模式)

控制图片如何适应容器,共有 7 种模式:

模式 行为描述 典型场景
BoxFit.fill 拉伸填满容器,忽略宽高比(可能导致变形) 背景图(需完全覆盖)
BoxFit.contain 保持比例缩放,完整显示内容,可能留白 产品详情图、需完整展示的图标
BoxFit.cover 保持比例缩放,完全覆盖容器并裁剪超出部分 用户头像、封面图
BoxFit.fitWidth 按宽度填满容器,高度按比例缩放,可能超出或留白 横向轮播图(固定宽度)
BoxFit.fitHeight 按高度填满容器,宽度按比例缩放,可能超出或留白 纵向海报(固定高度)
BoxFit.scaleDown 缩小图片以适应容器,但不会放大(原图比容器小则保持原尺寸) 动态内容(避免小图被放大)
BoxFit.none 以原始尺寸显示,可能溢出或被裁剪(需配合 clipBehavior) 像素级精确显示(游戏贴图)

3. 其他常用属性

  • alignment :调整图片在容器中的对齐方式(默认 Alignment.center)。
  • color 和 colorBlendMode:为图片添加混合颜色(如半透明背景色)。
  • repeat :设置图片重复方式(noRepeat、repeat、repeatX、repeatY),适用于背景图。
  • gaplessPlayback:避免图片加载时的闪烁(适用于动画)。

三、特殊效果实现

项目开发过程中,很少直接使用长方形,或者正方形的图片,大多数都是需要经过一些特殊处理,比如圆形的头像,圆角的长方形或者正方形等。那这种场景就可以借助ClipOval和ClipRect来实现这个效果。

1. 圆形/圆角图片

  • 使用 ClipOval 或 ClipRRect:
less 复制代码
```dart
ClipOval(
  child: Image.network(
    'https://example.com/avatar.jpg',
    fit: BoxFit.cover,
    width: 100,
    height: 100,
  ),
);
```
dart 复制代码
ClipRRect(
  borderRadius: BorderRadius.circular(30),
  child: Image.network(
    'https://picsum.photos/300',
    fit: BoxFit.cover,
    width: 200,
    height: 200,
  ),
);

2. 背景色混合

  • 通过 color 和 colorBlendMode 添加滤镜:
dart 复制代码
ClipRRect(
  borderRadius: BorderRadius.circular(30),
  child: Image.network(
    'https://picsum.photos/300',
    width: 200,
    height: 200,
   color: Colors.red.withOpacity(0.5),
   colorBlendMode: BlendMode.srcOver,
  ),
);

七、总结

Flutter 的 Image 组件功能强大,通过灵活使用 fit、width/height、ClipOval等特性,可以高效实现复杂图片展示需求。尤其是特殊效果(如圆形、滤镜)可借助 Clip 和 BlendMode 实现。

相关推荐
千里马学框架3 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone3 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc3 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen3 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone3 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui