Skip to content

Commit 34f133f

Browse files
authored
♻️ Improve architecture for better customizations (#241)
1 parent 3a18429 commit 34f133f

30 files changed

+1387
-757
lines changed

README-ZH.md

Lines changed: 49 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ Language: [English](README.md) | 中文
1919
需要拍照及录制视频,请查看示例的详细用法,
2020
并前往 [wechat_camera_picker](https://pub.flutter-io.cn/packages/wechat_camera_picker)
2121

22-
所有的界面细节基于 **微信 8.x 版本**,将在微信版本更新后随时进行跟进。
22+
当前的界面设计基于的微信版本:**8.x**
23+
界面更新将在微信版本更新后随时进行跟进。
2324

2425
**注意:** 如果你觉得你的自定义实现会在某些程度上帮助其他人实现他们的需求,你可以通过 PR 提交你的自定义实现。
2526
更多信息请参考 [贡献自定义实现](example/lib/customs/CONTRIBUTING.md)
@@ -60,7 +61,7 @@ Language: [English](README.md) | 中文
6061
- 💚 99% 的微信风格
6162
- ⚡️ 根据参数可调的性能优化
6263
- 📷 图片资源支持
63-
- 🔬 HEIC/HEIF 格式图片支持
64+
- 🔬 HEIF 格式图片支持
6465
- 🎥 视频资源支持
6566
- 🎶 音频资源支持
6667
- 1️⃣ 单资源模式
@@ -76,7 +77,7 @@ Language: [English](README.md) | 中文
7677
## 截图 📸
7778

7879
| ![1](https://pic.alexv525.com/2021-07-05-picker_1.jpg) | ![2](https://pic.alexv525.com/2021-07-05-picker_2.jpg) | ![3](https://pic.alexv525.com/2021-07-05-picker_3.jpg) |
79-
| -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- |
80+
|----------------------------------------------------------|----------------------------------------------------------|----------------------------------------------------------|
8081
| ![4](https://pic.alexv525.com/2021-07-05-picker_4.jpg) | ![5](https://pic.alexv525.com/2021-07-05-picker_5.jpg) | ![6](https://pic.alexv525.com/2021-07-05-picker_6.jpg) |
8182
| ![7](https://pic.alexv525.com/2021-07-06-picker_7.jpg) | ![8](https://pic.alexv525.com/2021-07-05-picker_8.jpg) | ![9](https://pic.alexv525.com/2021-07-05-picker_9-1.jpg) |
8283
| ![10](https://pic.alexv525.com/2021-07-05-picker_10.png) | ![10](https://pic.alexv525.com/2021-07-05-picker_11.png) | ![12](https://pic.alexv525.com/2021-07-05-picker_12.png) |
@@ -97,8 +98,8 @@ Language: [English](README.md) | 中文
9798
| 6.2.0 ||||
9899
| 5.0.0+ || N/A | N/A |
99100

100-
如果在 `flutter pub get` 时遇到了失败问题,请使用 `dependency_overrides` 解决。
101-
参考 [版本获取冲突](#xxx-版本获取冲突-例如-dartx)
101+
如果在 `flutter pub get` 时遇到了 `resolve conflict` 失败问题,
102+
请使用 `dependency_overrides` 解决
102103

103104
### Flutter
104105

@@ -167,30 +168,30 @@ platform :ios, '9.0'
167168

168169
## 使用方法 📖
169170

170-
| 参数名 | 类型 | 描述 | 默认值 |
171-
| ------------------------- | ---------------------- | ------------------------------------------------ | ------------------- |
172-
| selectedAssets | `List<AssetEntity>?` | 已选的资源。确保不重复选择。如果你允许重复选择,请将其置空。 | `null` |
173-
| maxAssets | `int` | 最多选择的图片数量 | 9 |
174-
| pageSize | `int` | 分页加载时每页加载的资源数量。**必须为网格数的倍数。** 设置为`null`可以取消分页。 | 320 (80 * 4) |
175-
| gridThumbSize | `int` | 预览网格的缩略图大小 | 200 |
176-
| pathThumbSize | `int` | 路径选择器的缩略图大小 | 80 |
177-
| previewThumbSize | `List<int>?` | 预览时图片的缩略图大小 | `null` |
178-
| gridCount | `int` | 选择器网格数量 | 4 |
179-
| requestType | `RequestType` | 选择器选择资源的类型 | `RequestType.image` |
180-
| specialPickerType | `SpecialPickerType?` | 提供一些特殊的选择器类型以整合非常规的选择行为 | `null` |
181-
| themeColor | `Color?` | 选择器的主题色 | `Color(0xff00bc56)` |
182-
| pickerTheme | `ThemeData?` | 选择器的主题提供,包括查看器 | `null` |
183-
| sortPathDelegate | `SortPathDeleage?` | 资源路径的排序实现,可自定义路径排序方法 | `CommonSortPathDelegate` |
184-
| textDelegate | `DefaultAssetsPickerTextDelegate?` | 选择器的文本代理构建,用于自定义文本 | `DefaultAssetsPickerTextDelegate()` |
185-
| filterOptions | `FilterOptionGroup?` | 允许用户自定义资源过滤条件 | `null` |
186-
| specialItemBuilder | `WidgetBuilder?` | 自定义item的构造方法 | `null` |
187-
| specialItemPosition | `SpecialItemPosition` | 允许用户在选择器中添加一个自定义item,并指定位置。 | `SpecialPosition.none` |
188-
| loadingIndicatorBuilder | `IndicatorBuilder?` | 加载器的实现 | `null` |
189-
| allowSpecialItemWhenEmpty | `bool` | 在资源为空时是否允许显示自定义item | `false` |
190-
| selectPredicate | `AssetSelectPredicate` | 判断资源可否被选择 | `null` |
191-
| shouldRevertGrid | `bool?` | 判断资源网格是否需要倒序排列 | `null` |
192-
| routeCurve | `Curve` | 选择构造路由动画的曲线 | `Curves.easeIn` |
193-
| routeDuration | `Duration` | 选择构造路由动画的时间 | `const Duration(milliseconds: 500)` |
171+
| 参数名 | 类型 | 描述 | 默认值 |
172+
|---------------------------|------------------------------------|------------------------------------------------|-------------------------------------|
173+
| selectedAssets | `List<AssetEntity>?` | 已选的资源。确保不重复选择。如果你允许重复选择,请将其置空。 | `null` |
174+
| maxAssets | `int` | 最多选择的图片数量 | 9 |
175+
| pageSize | `int` | 分页加载时每页加载的资源数量。**必须为网格数的倍数。** 设置为`null`可以取消分页。 | 320 (80 * 4) |
176+
| gridThumbSize | `int` | 预览网格的缩略图大小 | 200 |
177+
| pathThumbSize | `int` | 路径选择器的缩略图大小 | 80 |
178+
| previewThumbSize | `List<int>?` | 预览时图片的缩略图大小 | `null` |
179+
| gridCount | `int` | 选择器网格数量 | 4 |
180+
| requestType | `RequestType` | 选择器选择资源的类型 | `RequestType.image` |
181+
| specialPickerType | `SpecialPickerType?` | 提供一些特殊的选择器类型以整合非常规的选择行为 | `null` |
182+
| themeColor | `Color?` | 选择器的主题色 | `Color(0xff00bc56)` |
183+
| pickerTheme | `ThemeData?` | 选择器的主题提供,包括查看器 | `null` |
184+
| sortPathDelegate | `SortPathDeleage?` | 资源路径的排序实现,可自定义路径排序方法 | `CommonSortPathDelegate` |
185+
| textDelegate | `DefaultAssetsPickerTextDelegate?` | 选择器的文本代理构建,用于自定义文本 | `DefaultAssetsPickerTextDelegate()` |
186+
| filterOptions | `FilterOptionGroup?` | 允许用户自定义资源过滤条件 | `null` |
187+
| specialItemBuilder | `WidgetBuilder?` | 自定义item的构造方法 | `null` |
188+
| specialItemPosition | `SpecialItemPosition` | 允许用户在选择器中添加一个自定义item,并指定位置。 | `SpecialPosition.none` |
189+
| loadingIndicatorBuilder | `IndicatorBuilder?` | 加载器的实现 | `null` |
190+
| allowSpecialItemWhenEmpty | `bool` | 在资源为空时是否允许显示自定义item | `false` |
191+
| selectPredicate | `AssetSelectPredicate` | 判断资源可否被选择 | `null` |
192+
| shouldRevertGrid | `bool?` | 判断资源网格是否需要倒序排列 | `null` |
193+
| routeCurve | `Curve` | 选择构造路由动画的曲线 | `Curves.easeIn` |
194+
| routeDuration | `Duration` | 选择构造路由动画的时间 | `const Duration(milliseconds: 500)` |
194195

195196
### 简单的使用方法
196197

@@ -200,19 +201,12 @@ final List<AssetEntity> assets = await AssetPicker.pickAssets(context);
200201

201202
### 使用自定义代理
202203

203-
```dart
204-
final YourAssetPickerProvider provider = yourProvider;
205-
final CustomAssetPickerBuilderDelegate builder = yourBuilder(provider);
206-
final List<YourAssetEntity>? result = await AssetPicker.pickAssetsWithDelegate(
207-
context,
208-
provider: provider,
209-
delegate: builder,
210-
);
211-
```
212-
213204
你只能在使用 `pickAssetsWithDelegate` 方法时使用 `keepScrollOffset` 的功能。
214205
更多细节请查看示例内的 `Keep scroll offset` 方法。
215206

207+
想要了解更多关于自定义代理实现的内容,
208+
查阅 [`example/lib/customs`](example/lib/customs)
209+
216210
### 更详细的使用方法
217211

218212
我们已将常用的调用方法封装在 [example](example) 中。
@@ -237,8 +231,9 @@ final List<YourAssetEntity>? result = await AssetPicker.pickAssetsWithDelegate(
237231
#### 自定义选择器
238232

239233
你可以在「Custom」页面尝试自定义的选择器。
240-
目前我们只提供了一个基于 `Directory``File`
241-
(与 `photo_manager` 完全无关)实现的选择器。
234+
目前我们提供了一个基于 `Directory``File`
235+
(与 `photo_manager` 完全无关)实现的选择器,
236+
以及一个多 Tab 页切换的选择器。
242237
如果你觉得你的实现有价值或能帮助到其他人,欢迎以 PR 的形式进行提交。
243238
更多细节请阅读 [贡献自定义实现][example/lib/customs/CONTRIBUTING.md]
244239

@@ -336,11 +331,21 @@ class CustomSortPathDelegate extends CommonSortPathDelegate {
336331

337332
```dart
338333
final File file = your_file; // 你的 File 对象
339-
final Uint8List byteData = await file.readAsBytes(); // 转为 Uint8List
340-
final AssetEntity imageEntity = await PhotoManager.editor.saveImage(byteData); // 存入手机并生成 AssetEntity
334+
final String path = file.path;
335+
final AssetEntity fileEntity = await PhotoManager.editor.saveImageWithPath(
336+
path,
337+
title: basename(path),
338+
); // 存入手机并生成 AssetEntity
339+
340+
final Uint8List data = your_data; // 你的 Uint8List 对象
341+
final AssetEntity imageEntity = await PhotoManager.editor.saveImage(
342+
file.path,
343+
title: '带有后缀的名称.jpg',
344+
); // 存入手机并生成 AssetEntity
341345
```
342346

343-
如果不想保留文件,可以在操作完成(上传完或业务处理完)后进行删除:
347+
**注意:如果不想保留文件,请尽量用 `File` 承载中间操作,**
348+
否则在调用 `AssetEntity` 的删除时,某些系统下会触发系统弹窗事件:
344349

345350
```dart
346351
final List<String> result = await PhotoManager.editor.deleteWithIds([entity.id]);

0 commit comments

Comments
 (0)