Flutter图片与图标 #

一、Image Widget #

1.1 加载方式 #

方式 说明
Image.asset 加载项目资源图片
Image.network 加载网络图片
Image.file 加载本地文件图片
Image.memory 加载内存图片

1.2 Image.asset #

dart
Image.asset(
  'assets/images/logo.png',
  width: 100,
  height: 100,
  fit: BoxFit.cover,
)

配置pubspec.yaml:

yaml
flutter:
  assets:
    - assets/images/

1.3 Image.network #

dart
Image.network(
  'https://example.com/image.jpg',
  width: 200,
  height: 200,
  fit: BoxFit.cover,
  loadingBuilder: (context, child, loadingProgress) {
    if (loadingProgress == null) return child;
    return Center(
      child: CircularProgressIndicator(
        value: loadingProgress.expectedTotalBytes != null
            ? loadingProgress.cumulativeBytesLoaded /
                loadingProgress.expectedTotalBytes!
            : null,
      ),
    );
  },
  errorBuilder: (context, error, stackTrace) {
    return Icon(Icons.error);
  },
)

1.4 Image.file #

dart
import 'dart:io';

Image.file(
  File('/path/to/image.jpg'),
  width: 200,
  height: 200,
  fit: BoxFit.cover,
)

1.5 Image.memory #

dart
import 'dart:typed_data';

Image.memory(
  imageBytes,
  width: 200,
  height: 200,
  fit: BoxFit.cover,
)

1.6 BoxFit属性 #

dart
BoxFit.fill
BoxFit.contain
BoxFit.cover
BoxFit.fitWidth
BoxFit.fitHeight
BoxFit.none
BoxFit.scaleDown
dart
Column(
  children: [
    Text('fill'),
    Image.asset('image.jpg', width: 100, height: 100, fit: BoxFit.fill),
    Text('contain'),
    Image.asset('image.jpg', width: 100, height: 100, fit: BoxFit.contain),
    Text('cover'),
    Image.asset('image.jpg', width: 100, height: 100, fit: BoxFit.cover),
  ],
)

1.7 图片缓存 #

dart
Image.network(
  'https://example.com/image.jpg',
  cacheWidth: 200,
  cacheHeight: 200,
)

PaintingBinding.instance.imageCache.maximumSize = 100;
PaintingBinding.instance.imageCache.maximumSizeBytes = 50 * 1024 * 1024;

二、cached_network_image #

2.1 安装 #

yaml
dependencies:
  cached_network_image: ^3.3.0

2.2 使用 #

dart
CachedNetworkImage(
  imageUrl: 'https://example.com/image.jpg',
  placeholder: (context, url) => CircularProgressIndicator(),
  errorWidget: (context, url, error) => Icon(Icons.error),
  fadeInDuration: Duration(milliseconds: 300),
  fadeOutDuration: Duration(milliseconds: 300),
  memCacheWidth: 200,
  memCacheHeight: 200,
  maxWidthDiskCache: 500,
  maxHeightDiskCache: 500,
)

2.3 高级用法 #

dart
CachedNetworkImage(
  imageUrl: 'https://example.com/image.jpg',
  imageBuilder: (context, imageProvider) {
    return Container(
      decoration: BoxDecoration(
        image: DecorationImage(
          image: imageProvider,
          fit: BoxFit.cover,
        ),
        borderRadius: BorderRadius.circular(16),
      ),
    );
  },
  placeholder: (context, url) => Shimmer.fromColors(
    baseColor: Colors.grey.shade300,
    highlightColor: Colors.grey.shade100,
    child: Container(color: Colors.white),
  ),
  errorWidget: (context, url, error) => Container(
    color: Colors.grey.shade200,
    child: Icon(Icons.broken_image, color: Colors.grey),
  ),
)

三、Icon Widget #

3.1 基本用法 #

dart
Icon(
  Icons.home,
  size: 32,
  color: Colors.blue,
)

3.2 Material Icons #

dart
Icon(Icons.home)
Icon(Icons.favorite)
Icon(Icons.settings)
Icon(Icons.person)
Icon(Icons.search)
Icon(Icons.add)
Icon(Icons.edit)
Icon(Icons.delete)
Icon(Icons.share)
Icon(Icons.more_vert)

3.3 Cupertino Icons #

dart
Icon(CupertinoIcons.home)
Icon(CupertinoIcons.heart)
Icon(CupertinoIcons.settings)
Icon(CupertinoIcons.person)
Icon(CupertinoIcons.search)
Icon(CupertinoIcons.add)
Icon(CupertinoIcons.pencil)
Icon(CupertinoIcons.trash)
Icon(CupertinoIcons.share)
Icon(CupertinoIcons.ellipsis_vertical)

3.4 IconButton #

dart
IconButton(
  icon: Icon(Icons.favorite),
  onPressed: () {
    print('Favorite pressed');
  },
  iconSize: 32,
  color: Colors.red,
  splashRadius: 24,
  tooltip: 'Add to favorites',
)

3.5 IconTheme #

dart
IconTheme(
  data: IconThemeData(
    color: Colors.blue,
    size: 24,
    opacity: 0.8,
  ),
  child: Row(
    children: [
      Icon(Icons.home),
      Icon(Icons.favorite),
      Icon(Icons.settings),
    ],
  ),
)

四、自定义图标 #

4.1 使用字体图标 #

yaml
flutter:
  fonts:
    - family: MyIcons
      fonts:
        - asset: assets/fonts/MyIcons.ttf
dart
Icon(
  IconData(0xe900, fontFamily: 'MyIcons'),
  size: 32,
  color: Colors.blue,
)

4.2 创建图标类 #

dart
class MyIcons {
  static const IconData home = IconData(0xe900, fontFamily: 'MyIcons');
  static const IconData search = IconData(0xe901, fontFamily: 'MyIcons');
  static const IconData settings = IconData(0xe902, fontFamily: 'MyIcons');
}

Icon(MyIcons.home)
Icon(MyIcons.search)
Icon(MyIcons.settings)

五、SVG图片 #

5.1 安装 #

yaml
dependencies:
  flutter_svg: ^2.0.9

5.2 基本用法 #

dart
SvgPicture.asset(
  'assets/icons/logo.svg',
  width: 100,
  height: 100,
  colorFilter: ColorFilter.mode(Colors.blue, BlendMode.srcIn),
)
dart
SvgPicture.network(
  'https://example.com/image.svg',
  width: 100,
  height: 100,
  placeholderBuilder: (context) => CircularProgressIndicator(),
)

5.3 SVG属性 #

dart
SvgPicture.asset(
  'assets/icons/logo.svg',
  width: 100,
  height: 100,
  fit: BoxFit.contain,
  alignment: Alignment.center,
  allowDrawingOutsideViewBox: false,
  semanticsLabel: 'Logo',
  excludeFromSemantics: false,
  clipBehavior: Clip.hardEdge,
  colorFilter: ColorFilter.mode(Colors.red, BlendMode.srcIn),
  cacheColorFilter: true,
)

六、圆形图片 #

6.1 CircleAvatar #

dart
CircleAvatar(
  radius: 50,
  backgroundImage: NetworkImage('https://example.com/avatar.jpg'),
  backgroundColor: Colors.grey.shade200,
  child: Text('A'),
)

CircleAvatar(
  radius: 50,
  child: Icon(Icons.person, size: 50),
)

6.2 ClipOval #

dart
ClipOval(
  child: Image.network(
    'https://example.com/avatar.jpg',
    width: 100,
    height: 100,
    fit: BoxFit.cover,
  ),
)

6.3 Container装饰 #

dart
Container(
  width: 100,
  height: 100,
  decoration: BoxDecoration(
    shape: BoxShape.circle,
    image: DecorationImage(
      image: NetworkImage('https://example.com/avatar.jpg'),
      fit: BoxFit.cover,
    ),
    border: Border.all(
      color: Colors.blue,
      width: 3,
    ),
  ),
)

七、图片选择器 #

7.1 安装 #

yaml
dependencies:
  image_picker: ^1.0.4

7.2 使用 #

dart
import 'package:image_picker/image_picker.dart';

final ImagePicker _picker = ImagePicker();

Future<void> pickImage() async {
  final XFile? image = await _picker.pickImage(
    source: ImageSource.gallery,
    maxWidth: 1024,
    maxHeight: 1024,
    imageQuality: 85,
  );
  
  if (image != null) {
    File imageFile = File(image.path);
  }
}

Future<void> takePhoto() async {
  final XFile? photo = await _picker.pickImage(
    source: ImageSource.camera,
    maxWidth: 1024,
    maxHeight: 1024,
    imageQuality: 85,
  );
}

Future<void> pickMultipleImages() async {
  final List<XFile> images = await _picker.pickMultiImage(
    maxWidth: 1024,
    maxHeight: 1024,
    imageQuality: 85,
  );
}

7.3 完整示例 #

dart
class ImagePickerDemo extends StatefulWidget {
  @override
  State<ImagePickerDemo> createState() => _ImagePickerDemoState();
}

class _ImagePickerDemoState extends State<ImagePickerDemo> {
  final ImagePicker _picker = ImagePicker();
  XFile? _image;
  
  Future<void> _pickImage() async {
    final XFile? image = await _picker.pickImage(
      source: ImageSource.gallery,
    );
    setState(() {
      _image = image;
    });
  }
  
  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        if (_image != null)
          Image.file(
            File(_image!.path),
            width: 200,
            height: 200,
            fit: BoxFit.cover,
          )
        else
          Container(
            width: 200,
            height: 200,
            color: Colors.grey.shade200,
            child: Icon(Icons.image, size: 50, color: Colors.grey),
          ),
        SizedBox(height: 16),
        ElevatedButton(
          onPressed: _pickImage,
          child: Text('选择图片'),
        ),
      ],
    );
  }
}

八、总结 #

8.1 核心Widget #

Widget 说明
Image.asset 加载资源图片
Image.network 加载网络图片
CachedNetworkImage 缓存网络图片
Icon 图标
IconButton 图标按钮
SvgPicture SVG图片

8.2 下一步 #

掌握了图片与图标后,让我们学习 按钮与交互

最后更新:2026-03-28