Flutter中如何使用photo_manager: ^3.6.4库管理相册
在Flutter项目中使用photo_manager: ^3.6.4库时遇到几个问题:
- 如何获取设备上的所有相册列表?
- 如何读取指定相册中的照片和视频?
- 处理权限请求的正确方式是什么?调用requestPermission()后还需要手动检查吗?
- 加载大量图片时如何优化性能?看到有originFile和thumbnail方法,具体怎么选择?
- 从相册选择多张图片并上传时,如何获取文件的真实路径?
- 在Android和iOS上这个库的行为有什么主要差异需要注意?
2 回复
在Flutter中使用photo_manager: ^3.6.4管理相册:
- 添加依赖到pubspec.yaml
- 请求相册权限
- 获取相册列表:
List<AssetPathEntity> albums = await PhotoManager.getAssetPathList();
- 获取相册内图片:
List<AssetEntity> assets = await album.getAssetListPaged(page, size);
- 显示图片使用
AssetEntityImage组件
记得处理权限和错误情况。
更多关于Flutter中如何使用photo_manager: ^3.6.4库管理相册的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中使用photo_manager: ^3.6.4库管理相册的步骤如下:
1. 添加依赖
在pubspec.yaml中添加:
dependencies:
photo_manager: ^3.6.4
# 可选:用于图片加载
cached_network_image: ^3.3.0
2. 配置权限
Android
在android/app/src/main/AndroidManifest.xml中添加:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- Android 13+ 需要 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
iOS
在ios/Runner/Info.plist中添加:
<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册以显示照片</string>
3. 基本使用
import 'package:photo_manager/photo_manager.dart';
class PhotoGalleryPage extends StatefulWidget {
@override
_PhotoGalleryPageState createState() => _PhotoGalleryPageState();
}
class _PhotoGalleryPageState extends State<PhotoGalleryPage> {
List<AssetEntity> assets = [];
@override
void initState() {
super.initState();
_requestPermission();
}
// 请求权限
Future<void> _requestPermission() async {
final PermissionState state = await PhotoManager.requestPermissionExtend();
if (state.isAuth) {
_loadAssets();
} else {
PhotoManager.openSetting();
}
}
// 加载相册资源
Future<void> _loadAssets() async {
final List<AssetPathEntity> albums = await PhotoManager.getAssetPathList();
final AssetPathEntity recentAlbum = albums.first;
final List<AssetEntity> recentAssets = await recentAlbum.getAssetListPaged(
page: 0,
size: 100,
);
setState(() {
assets = recentAssets;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('相册')),
body: GridView.builder(
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3,
),
itemCount: assets.length,
itemBuilder: (_, index) {
return AssetEntityImage(assets[index]);
},
),
);
}
}
// 图片显示组件
class AssetEntityImage extends StatelessWidget {
final AssetEntity asset;
const AssetEntityImage(this.asset);
@override
Widget build(BuildContext context) {
return FutureBuilder<Uint8List?>(
future: asset.thumbnailDataWithSize(ThumbnailSize(200, 200)),
builder: (_, snapshot) {
if (snapshot.hasData) {
return Image.memory(snapshot.data!);
}
return Container(color: Colors.grey);
},
);
}
}
4. 主要功能说明
- 获取相册列表:
PhotoManager.getAssetPathList() - 获取相册内资源:
assetPathEntity.getAssetListPaged() - 获取缩略图:
asset.thumbnailDataWithSize() - 权限管理:
PhotoManager.requestPermissionExtend()
5. 注意事项
- 需要处理权限被拒绝的情况
- 加载大量图片时建议使用分页
- 可以使用
cached_network_image优化图片加载性能
这样就完成了基本的相册管理功能,可以显示设备中的图片并支持权限管理。

