{"id":13551233,"url":"https://github.com/fluttercandies/flutter_wechat_camera_picker","last_synced_at":"2025-05-15T06:02:20.492Z","repository":{"id":37412236,"uuid":"279655281","full_name":"fluttercandies/flutter_wechat_camera_picker","owner":"fluttercandies","description":"A camera picker (take photos and videos) for Flutter projects based on WeChat's UI. It's a standalone module of wechat_assets_picker yet it can be run separately.","archived":false,"fork":false,"pushed_at":"2025-04-23T09:07:44.000Z","size":2944,"stargazers_count":394,"open_issues_count":12,"forks_count":156,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-05-08T16:02:07.760Z","etag":null,"topics":["camera","flutter","picker","wechat"],"latest_commit_sha":null,"homepage":"https://pub.dev/packages/wechat_camera_picker","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fluttercandies.png","metadata":{"files":{"readme":"README-ZH.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"AlexV525","custom":["https://www.alexv525.com/wechat.png","https://www.alexv525.com/alipay.jpg"]}},"created_at":"2020-07-14T17:50:27.000Z","updated_at":"2025-04-28T08:44:29.000Z","dependencies_parsed_at":"2024-01-16T18:59:50.228Z","dependency_job_id":"248e82ad-c7f8-4c32-97b4-06cded871e10","html_url":"https://github.com/fluttercandies/flutter_wechat_camera_picker","commit_stats":{"total_commits":325,"total_committers":13,"mean_commits":25.0,"dds":0.09846153846153849,"last_synced_commit":"6c8235c45f931b55de29976dcc630c9fb8fe4e0d"},"previous_names":[],"tags_count":83,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluttercandies%2Fflutter_wechat_camera_picker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluttercandies%2Fflutter_wechat_camera_picker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluttercandies%2Fflutter_wechat_camera_picker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fluttercandies%2Fflutter_wechat_camera_picker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fluttercandies","download_url":"https://codeload.github.com/fluttercandies/flutter_wechat_camera_picker/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254283336,"owners_count":22045140,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["camera","flutter","picker","wechat"],"created_at":"2024-08-01T12:01:44.536Z","updated_at":"2025-05-15T06:02:20.483Z","avatar_url":"https://github.com/fluttercandies.png","language":"Dart","funding_links":["https://github.com/sponsors/AlexV525","https://www.alexv525.com/wechat.png","https://www.alexv525.com/alipay.jpg"],"categories":["Dart"],"sub_categories":[],"readme":"\u003c!-- Copyright 2019 The FlutterCandies author. All rights reserved.\nUse of this source code is governed by an Apache license\nthat can be found in the LICENSE file. --\u003e\n\n# Flutter WeChat Camera Picker\n\n[![pub package](https://img.shields.io/pub/v/wechat_camera_picker?logo=dart\u0026label=%E7%A8%B3%E5%AE%9A%E7%89%88\u0026style=flat-square)](https://pub.flutter-io.cn/packages/wechat_camera_picker)\n[![pub package](https://img.shields.io/pub/v/wechat_camera_picker?color=42a012\u0026include_prereleases\u0026label=%E5%BC%80%E5%8F%91%E7%89%88\u0026logo=dart\u0026style=flat-square)](https://pub.flutter-io.cn/packages/wechat_camera_picker)\n[![CodeFactor](https://img.shields.io/codefactor/grade/github/fluttercandies/flutter_wechat_camera_picker?logo=codefactor\u0026label=%E4%BB%A3%E7%A0%81%E8%B4%A8%E9%87%8F\u0026logoColor=%23ffffff\u0026style=flat-square)](https://www.codefactor.io/repository/github/fluttercandies/flutter_wechat_camera_picker)\n\n[![Build status](https://img.shields.io/github/actions/workflow/status/fluttercandies/flutter_wechat_camera_picker/runnable.yml?branch=main\u0026label=CI\u0026logo=github\u0026style=flat-square)](https://github.com/fluttercandies/flutter_wechat_camera_picker/actions/workflows/runnable.yml)\n[![GitHub license](https://img.shields.io/github/license/fluttercandies/flutter_wechat_camera_picker?style=flat-square\u0026label=%E5%8D%8F%E8%AE%AE)](https://github.com/fluttercandies/flutter_wechat_camera_picker/blob/master/LICENSE)\n[![GitHub stars](https://img.shields.io/github/stars/fluttercandies/flutter_wechat_camera_picker?logo=github\u0026style=flat-square)](https://github.com/fluttercandies/flutter_wechat_camera_picker/stargazers)\n[![GitHub forks](https://img.shields.io/github/forks/fluttercandies/flutter_wechat_camera_picker?logo=github\u0026style=flat-square)](https://github.com/fluttercandies/flutter_wechat_camera_picker/network)\n\n\u003ca href=\"https://qm.qq.com/q/ZyJbSVjfSU\"\u003e\u003cimg src=\"https://img.shields.io/badge/dynamic/yaml?url=https%3A%2F%2Fraw.githubusercontent.com%2Ffluttercandies%2F.github%2Frefs%2Fheads%2Fmain%2Fdata.yml\u0026query=%24.qq_group_number\u0026label=QQ%E7%BE%A4\u0026logo=qq\u0026style=flat\u0026color=1DACE8\" /\u003e\u003c/a\u003e\n\nLanguage: [English](README.md) | 中文\n\n基于 **微信 UI** 的 Flutter 相机选择器，可以单独运行，\n同时是 [wechat_assets_picker][wechat_assets_picker pub] 的扩展。\n\n当前的界面设计基于的微信版本：**8.0.49**\n界面更新将在微信版本更新后随时进行跟进。\n\n查看 [迁移指南][] 了解如何从破坏性改动中迁移为可用代码。\n\n## 版本兼容\n\n该插件仅保证能与 **stable 渠道的 Flutter SDK** 配合使用。\n我们不会为其他渠道的 Flutter SDK 做实时支持。\n\n|        | 2.8.0 | 3.3.0 | 3.16.0 |\n|--------|:-----:|:-----:|:------:|\n| 4.2.0+ |   ❌   |   ❌   |   ✅    |\n| 4.0.0+ |   ❌   |   ✅   |   ❌    |\n| 3.0.0+ |   ✅   |   ❌   |   ❌    |\n\n## 主要使用的 package\n\n该插件基于这些优秀的 package 构建：\n\n| Name                               | Features    |\n|:-----------------------------------|:------------|\n| [photo_manager][photo_manager pub] | 资源的基础抽象和管理。 |\n| [camera][camera pub]               | 拍摄图片和视频。    |\n| [video_player][video_player pub]   | 播放对应的视频和音频。 |\n\n这些 package 在该插件中的实现已相对稳定。\n如果你在使用中发现于它们相关的问题，\n请先在本插件的问题跟踪中报告相关问题。\n\n\u003cdetails\u003e\n  \u003csummary\u003e目录列表\u003c/summary\u003e\n\n\u003c!-- TOC --\u003e\n* [Flutter WeChat Camera Picker](#flutter-wechat-camera-picker)\n  * [版本兼容](#版本兼容)\n  * [主要使用的 package](#主要使用的-package)\n  * [特性 ✨](#特性-)\n  * [截图 📸](#截图-)\n  * [开始前的注意事项 ‼️](#开始前的注意事项-)\n  * [准备工作 🍭](#准备工作-)\n    * [配置](#配置)\n    * [特别提醒 📝](#特别提醒-)\n  * [使用方法 📖](#使用方法-)\n    * [国际化](#国际化)\n    * [简单的使用方法](#简单的使用方法)\n    * [使用配置](#使用配置)\n    * [使用自定义的 `State`](#使用自定义的-state)\n  * [常见问题 💭](#常见问题-)\n    * [iOS 上的预览在旋转时行为诡异](#ios-上的预览在旋转时行为诡异)\n\u003c!-- TOC --\u003e\n\u003c/details\u003e\n\n## 特性 ✨\n\n- ♿ 完整的无障碍支持，包括 **TalkBack** 和 **VoiceOver**\n- ♻️ 支持基于 `State` 重载的全量自定义\n- 🎏 完全可自定义的基于 `ThemeData` 的主题\n- 💚 复刻微信风格（甚至优化了更多的细节）\n- ⚡️ 根据配置调节的性能优化\n- 📷 支持拍照\n- 🎥 支持录像\n  - ⏱ 支持限制录像时间\n  - 🔍 支持录像时缩放\n- ☀️ 支持设置曝光参数\n- 🔍️ 支持捏合缩放\n- 💱 国际化支持\n  - ⏪ RTL 语言支持\n- 🖾 支持自定义前景 widget 构建\n- 🕹️ 保存时拦截自定义操作\n\n## 截图 📸\n\n| ![](https://pic.alexv525.com/202310181547760.jpg) | ![](https://pic.alexv525.com/202310181547670.jpg) | ![](https://pic.alexv525.com/202310181547132.jpg) | ![](https://pic.alexv525.com/202310181547726.jpg) | ![](https://pic.alexv525.com/202310181548711.jpg) |\n|---------------------------------------------------|---------------------------------------------------|---------------------------------------------------|---------------------------------------------------|---------------------------------------------------|\n\n## 开始前的注意事项 ‼️\n\n在开始一切之前，请明确以下两点：\n- 由于理解差异和篇幅限制，并不是所有的内容都会明确地在文档中指出。\n  当你遇到没有找到需求和无法理解的概念时，请先运行项目的示例 example，\n  它可以解决 90% 的常见需求。\n- 该库与 [photo_manager][photo_manager pub] 有强关联性，\n  大部分方法的行为是由 photo_manager 进行控制的，\n  所以请尽可能地确保你了解以下两个类的概念：\n  - 资源（图片/视频/音频） [`AssetEntity`](https://pub.flutter-io.cn/documentation/photo_manager/latest/photo_manager/AssetEntity-class.html)\n  - 资源合集（相册或集合概念） [`AssetPathEntity`](https://pub.flutter-io.cn/documentation/photo_manager/latest/photo_manager/AssetPathEntity-class.html)\n\n当你有与相关的 API 和行为的疑问时，你可以查看\n[photo_manager API 文档][] 了解更多细节。\n\n众多使用场景都已包含在示例中。\n在你提出任何问题之前，请仔细并完整地查看和使用示例。\n\n## 准备工作 🍭\n\n如果在 `flutter pub get` 时遇到了 `resolve conflict` 失败问题，\n请使用 `dependency_overrides` 解决。\n\n### 配置\n\n执行 `flutter pub add wechat_camera_picker`，\n或者将 `wechat_camera_picker` 手动添加至 `pubspec.yaml` 引用。\n```yaml\ndependencies:\n  wechat_camera_picker: ^latest_version\n```\n\n最新的 **稳定** 版本是:\n[![pub package](https://img.shields.io/pub/v/wechat_camera_picker?logo=dart\u0026label=stable\u0026style=flat-square)](https://pub.flutter-io.cn/packages/wechat_camera_picker)\n\n最新的 **开发** 版本是:\n[![pub package](https://img.shields.io/pub/v/wechat_camera_picker?color=9d00ff\u0026include_prereleases\u0026label=dev\u0026logo=dart\u0026style=flat-square)](https://pub.flutter-io.cn/packages/wechat_camera_picker)\n\n运行前，按照这些步骤逐一配置：\n- [wechat_assets_picker#准备工作](https://github.com/fluttercandies/flutter_wechat_assets_picker/blob/master/README-ZH.md#preparing-for-use-)\n- [camera#installation](https://pub.flutter-io.cn/packages/camera#installation)\n\n在你的代码中导入：\n\n```dart\nimport 'package:wechat_camera_picker/wechat_camera_picker.dart';\n```\n\n### 特别提醒 📝\n\n1. 在 iOS 上使用 `NSPhotoLibraryAddUsageDescription` 时，\n   需要使用 `onEntitySaving` 或 `onXFileCaptured` 来处理捕获的文件，\n   在这种情况下 `AssetEntity` 不可用，使用其 ID 获取该资源将导致崩溃。\n\n## 使用方法 📖\n\n### 国际化\n\n当你在选择资源的时候，package 会通过你的 `BuildContext`\n读取 `Locale?`，返回对应语言的文字代理实现。\n请确保你可以通过 `BuildContext` 获取到 `Locale`，否则将会 **默认展示中文文字**。\n\n内置的语言文字实现有：\n* 简体中文 (默认)\n* English\n* Tiếng Việt\n\n如果你想使用自定义或固定的文字实现，请通过\n`CameraPickerConfig.textDelegate` 传递调用。\n\n### 简单的使用方法\n\n```dart\nfinal AssetEntity? entity = await CameraPicker.pickFromCamera(context);\n```\n\n### 使用配置\n\n你可以使用 `CameraPickerConfig` 来调整选择时的行为。\n\n```dart\nfinal AssetEntity? entity = await CameraPicker.pickFromCamera(\n  context,\n  pickerConfig: const CameraPickerConfig(),\n);\n```\n\n`CameraPickerConfig` 的成员说明：\n\n| 参数名                           | 类型                            | 描述                                                 | 默认值                                        |\n|-------------------------------|-------------------------------|----------------------------------------------------|--------------------------------------------|\n| enableRecording               | `bool`                        | 选择器是否可以录像                                          | `false`                                    |\n| onlyEnableRecording           | `bool`                        | 选择器是否仅可以录像。只在 `enableRecording` 为 `true` 时有效。      | `false`                                    |\n| enableTapRecording            | `bool`                        | 选择器是否可以单击录像。只在 `onlyEnableRecording` 为 `true` 时生效。 | `false`                                    |\n| enableAudio                   | `bool`                        | 选择器是否需要录制音频。只在 `enableRecording` 为 `true` 时有效。     | `true`                                     |\n| enableSetExposure             | `bool`                        | 用户是否可以在界面上通过点击设定曝光点                                | `true`                                     |\n| enableExposureControlOnPoint  | `bool`                        | 用户是否可以根据已经设置的曝光点调节曝光度                              | `true`                                     |\n| enablePinchToZoom             | `bool`                        | 用户是否可以在界面上双指缩放相机对焦                                 | `true`                                     |\n| enablePullToZoomInRecord      | `bool`                        | 用户是否可以在录制视频时上拉缩放                                   | `true`                                     |\n| enableScaledPreview           | `bool`                        | 拍摄过程中相机预览是否需要缩放                                    | `false`                                    |\n| shouldDeletePreviewFile       | `bool`                        | 返回页面时是否删除预览文件                                      | `false`                                    |\n| shouldAutoPreviewVideo        | `bool`                        | 在预览时是否直接播放视频                                       | `true`                                     |\n| maximumRecordingDuration      | `Duration?`                   | 录制视频最长时长                                           | `const Duration(seconds: 15)`              |\n| minimumRecordingDuration      | `Duration`                    | 录制视频最短时长                                           | `const Duration(seconds: 1)`               |\n| theme                         | `ThemeData?`                  | 选择器的主题                                             | `CameraPicker.themeData(wechatThemeColor)` |\n| textDelegate                  | `CameraPickerTextDelegate?`   | 控制部件中的文字实现                                         | `CameraPickerTextDelegate`                 |\n| resolutionPreset              | `ResolutionPreset`            | 相机的分辨率预设                                           | `ResolutionPreset.ultraHigh`               |\n| cameraQuarterTurns            | `int`                         | 摄像机视图顺时针旋转次数，每次 90 度                               | `0`                                        |\n| imageFormatGroup              | `ImageFormatGroup`            | 输出图像的格式描述                                          | `ImageFormatGroup.unknown`                 |\n| preferredLensDirection        | `CameraLensDirection`         | 首次使用相机时首选的镜头方向                                     | `CameraLensDirection.back`                 |\n| lockCaptureOrientation        | `DeviceOrientation?`          | 摄像机在拍摄时锁定的旋转角度                                     | null                                       |\n| foregroundBuilder             | `ForegroundBuilder?`          | 覆盖在相机预览上方的前景构建                                     | null                                       |\n| previewTransformBuilder       | `PreviewTransformBuilder?`    | 对相机预览做变换的构建                                        | null                                       |\n| onEntitySaving                | `EntitySaveCallback?`         | 在查看器中保存图片时的回调                                      | null                                       |\n| onError                       | `CameraErrorHandler?`         | 拍摄照片过程中的自定义错误处理                                    | null                                       |\n| onXFileCaptured               | `XFileCapturedCallback?`      | 拍摄文件生成后的回调                                         | null                                       |\n| onMinimumRecordDurationNotMet | `VoidCallback?`               | 录制时长未达到最小时长时的回调方法                                  | null                                       |\n| onPickConfirmed               | `void Function(AssetEntity)?` | 拍照或录像确认时的回调方法。                                     | null                                       |\n| permissionRequestOption       | `PermissionRequestOption?`    | 使用 `photo_manager` 保存拍摄的文件的权限请求配置                  | null                                       |\n\n### 使用自定义的 `State`\n\n所有的用户界面都可以通过自定义 `State` 实现，包括：\n- `CameraPickerState`\n- `CameraPickerViewerState`\n\n在完成 `State` 的重载后，可以在调用时进行构建，具体来说：\n- `CameraPicker.pickFromCamera(createPickerState: () =\u003e CustomCameraPickerState());`\n- `CameraPickerViewer.pushToViewer(..., createViewerState: () =\u003e CustomCameraPickerViewerState());`\n\n## 常见问题 💭\n\n### iOS 上的预览在旋转时行为诡异\n\n目前，iOS 上的预览画面在旋转时并未正确地同步，\n你可以在这个 issue 里了解更多相关的信息：\nhttps://github.com/flutter/flutter/issues/89216 。\n除此之外的问题，你可以提交 issue 进行提问。\n\n[wechat_assets_picker pub]: https://pub.flutter-io.cn/packages/wechat_assets_picker\n[photo_manager pub]: https://pub.flutter-io.cn/packages/photo_manager\n[camera pub]: https://pub.flutter-io.cn/packages/camera\n[video_player pub]: https://pub.flutter-io.cn/packages/video_player\n[迁移指南]: https://github.com/fluttercandies/flutter_wechat_camera_picker/blob/main/guides/migration_guide.md\n[photo_manager API 文档]: https://pub.flutter-io.cn/documentation/photo_manager/latest/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffluttercandies%2Fflutter_wechat_camera_picker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffluttercandies%2Fflutter_wechat_camera_picker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffluttercandies%2Fflutter_wechat_camera_picker/lists"}