flutter如何保存图片到相册

在Flutter开发中,我想把网络图片或应用内生成的图片保存到手机相册,但不知道具体该怎么实现。请问应该使用哪个插件?代码该怎么写?需要哪些权限?在iOS和Android上有什么区别吗?求一个完整的实现示例。

2 回复

使用image_gallery_saver插件。

  1. 添加依赖:image_gallery_saver: ^2.1.1
  2. 保存图片:
await ImageGallerySaver.saveImage(bytes);

需申请存储权限。

更多关于flutter如何保存图片到相册的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中保存图片到相册,可以使用 image_gallery_saverphoto_manager 插件。以下是使用 image_gallery_saver 的步骤:

步骤 1:添加依赖

pubspec.yaml 中添加:

dependencies:
  image_gallery_saver: ^2.1.1

运行 flutter pub get 安装。

步骤 2:配置权限(仅 Android 和 iOS)

  • Android:在 android/app/src/main/AndroidManifest.xml 中添加:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
  • iOS:在 ios/Runner/Info.plist 中添加:
    <key>NSPhotoLibraryAddUsageDescription</key>
    <string>需要保存图片到相册</string>
    

步骤 3:编写保存代码

import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'package:flutter/services.dart';

// 保存网络图片
Future<void> saveNetworkImage(String imageUrl) async {
  try {
    // 获取图片数据
    var response = await Dio().get(imageUrl, options: Options(responseType: ResponseType.bytes));
    final result = await ImageGallerySaver.saveImage(
      Uint8List.fromList(response.data),
      quality: 100,
      name: "my_image"
    );
    print(result); // 输出保存结果
  } catch (e) {
    print("保存失败: $e");
  }
}

// 保存本地图片文件
Future<void> saveLocalImage(File imageFile) async {
  try {
    final result = await ImageGallerySaver.saveFile(imageFile.path);
    print(result);
  } catch (e) {
    print("保存失败: $e");
  }
}

完整示例

import 'package:flutter/material.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'package:http/http.dart' as http;

class SaveImageDemo extends StatelessWidget {
  Future<void> _saveImage() async {
    String url = "https://example.com/image.jpg";
    var response = await http.get(Uri.parse(url));
    await ImageGallerySaver.saveImage(
        Uint8List.fromList(response.bodyBytes),
        name: "saved_image"
    );
    ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text("图片已保存到相册")));
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: ElevatedButton(
          onPressed: _saveImage,
          child: Text('保存图片到相册'),
        ),
      ),
    );
  }
}

注意事项:

  1. 需要处理存储权限(Android 6.0+ 和 iOS 需要动态申请)
  2. 建议使用 permission_handler 插件处理权限申请
  3. 网络图片需要互联网权限(Android 添加 <uses-permission android:name="android.permission.INTERNET"/>

这是最常用的图片保存方案,适用于大多数场景。

回到顶部