1. 为什么选择微信风格?聊聊我的选型心路
做 Flutter 开发,特别是涉及到社交、内容发布这类功能时,图片选择几乎是绕不开的坎。我刚开始那会儿,用的是系统自带的 image_picker,功能是能用,但那个界面……怎么说呢,太“原生”了,跟 App 的整体设计风格格格不入,用户体验上总感觉差了点意思。后来也试过一些其他的第三方库,要么是 UI 不够精致,要么是功能有残缺,比如不支持多选、视频选择逻辑混乱,或者权限处理起来特别麻烦。
直到我遇到了 wechat_assets_picker 和 wechat_camera_picker 这对组合,才算真正找到了“解药”。它们最大的魅力,就是完美复刻了微信的交互体验。你想想,微信的图片选择器,从相册的网格浏览、预览大图、勾选操作,到相机界面的切换镜头、闪光灯控制,整个流程已经成了用户心智中的“标准答案”。用户用起来几乎不需要学习成本,上手就知道怎么操作。这对于提升你 App 的整体质感和用户满意度,帮助太大了。
这两个库背后是同一个作者 fluttercandies,在 Flutter 社区里口碑一直很好。它们不仅仅是 UI 像,底层对原生能力的封装也非常到位,支持最新的 Android 和 iOS 权限模型,处理起各种边界情况(比如用户拒绝权限、系统相册为空)也比自己从头造轮子要稳健得多。所以,如果你想让你的 Flutter 应用在多媒体选择这块儿既有“面子”(好看的UI)又有“里子”(稳定的功能),跟着我一起把这套方案集成进去,准没错。
2. 项目起步:依赖引入与环境配置
万事开头难,但这一步其实很简单。打开你的 pubspec.yaml 文件,在 dependencies 区域添加下面这三个核心依赖。我建议你直接复制我用的版本,这都是我经过多个项目验证,比较稳定的组合。
dependencies:
flutter:
sdk: flutter
# 权限处理必备
permission_handler: ^11.3.1
# 微信风格相册选择器
wechat_assets_picker: ^9.2.1
# 微信风格相机拍摄器
wechat_camera_picker: ^4.3.2
添加完之后,在终端里运行 flutter pub get,让 Flutter 帮你把包拉下来。这里有个小经验,有时候网络问题可能会导致某些包拉取失败,特别是涉及到原生代码的。如果遇到问题,可以尝试切换一下网络环境,或者检查一下你项目根目录的 android/build.gradle 里 buildscript 的仓库配置,确保 google() 和 mavenCentral() 都在。
依赖装好只是第一步,接下来才是重头戏:权限配置。这是让很多新手头疼的地方,但只要你按步骤来,一点不难。
2.1 Android 权限配置实战
对于 Android,我们需要修改 AndroidManifest.xml 文件。这个文件通常位于 android/app/src/main/ 目录下。用编辑器打开它,在 <manifest> 标签内,<application> 标签之前,添加以下权限声明。
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<!-- Android 10 (API 29) 及以下版本需要存储权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="29" />
这里解释一下:CAMERA 权限用于调用相机;FLASHLIGHT 权限是为了控制闪光灯(虽然很多 App 不用,但加上更规范);WRITE_EXTERNAL_STORAGE 是写存储权限,但注意我们设置了 android:maxSdkVersion="29",这意味着在 Android 10(API 29)及以下的设备上才需要申请这个权限。从 Android 11(API 30)开始,Google 引入了分区存储(Scoped Storage),应用访问自己的私有目录不需要这个权限,访问公共媒体文件则通过 MediaStore API,wechat_assets_picker 内部已经处理好了。
还有一个关键点,如果你的 targetSdkVersion 已经升级到 31(Android 12)或更高,你必须在 <application> 标签内,为所有包含 intent-filter 的 Activity(或者你项目里用到的其他组件)显式声明 android:exported 属性。通常,主 Activity 是必须设置的。同时,为了更好的兼容性,建议加上 requestLegacyExternalStorage 属性(针对 Android 10)。
<application
...>
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
...>
...
</activity>
<!-- 如果使用了 file_picker 等库,可能还需要为 FilePickerUtils 等 Activity 设置 -->
<!-- 具体可参考库的官方文档 -->
</application>
2.2 iOS 权限配置与常见坑点
iOS 的权限配置在 Info.plist 文件中进行,位置是 ios/Runner/。你需要用 Xcode 打开这个文件,或者直接用文本编辑器修改。我们需要添加四个权限描述,这些描述文字会展示在系统弹出的权限请求对话框里,所以请务必用清晰易懂的中文(或你的目标语言)写清楚用途。
<key>NSCameraUsageDescription</key>
<string>需要访问您的相机来拍摄照片和视频</string>
<key>NSPhotoLibraryAddUsageDescriptio


379

被折叠的 条评论
为什么被折叠?



