CINXE.COM
wechat_assets_picker | Flutter package
<!DOCTYPE html> <html lang="en-us"><head><script src="https://www.googletagmanager.com/gtm.js?id=GTM-MX6DBN9" async="async"></script><script src="/static/hash-o6oemknr/js/gtm.js" async="async"></script><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><meta name="viewport" content="width=device-width, initial-scale=1"/><meta name="twitter:card" content="summary"/><meta name="twitter:site" content="@dart_lang"/><meta name="twitter:description" content="An image picker (also with videos and audio) for Flutter projects based on WeChat's UI, with full support for customization. "/><meta name="twitter:image" content="https://pub.dev/static/hash-o6oemknr/img/pub-dev-icon-cover-image.png"/><meta property="og:type" content="website"/><meta property="og:site_name" content="Dart packages"/><meta property="og:title" content="wechat_assets_picker | Flutter package"/><meta property="og:description" content="An image picker (also with videos and audio) for Flutter projects based on WeChat's UI, with full support for customization. "/><meta property="og:image" content="https://pub.dev/static/hash-o6oemknr/img/pub-dev-icon-cover-image.png"/><meta property="og:url" content="https://pub.dev/packages/wechat_assets_picker"/><title>wechat_assets_picker | Flutter package</title><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Google+Sans:wght@400;500;700&family=Google+Sans+Display:wght@400&family=Google+Sans+Text:wght@400;500;700&family=Google+Sans+Mono:wght@400;700&display=swap"/><link rel="shortcut icon" href="/static/hash-o6oemknr/img/flutter-logo-32x32.png"/><link rel="stylesheet" href="https://www.gstatic.com/glue/v25_0/ccb.min.css"/><link rel="search" type="application/opensearchdescription+xml" title="Dart packages" href="/osd.xml"/><link rel="canonical" href="https://pub.dev/packages/wechat_assets_picker"/><meta name="description" content="An image picker (also with videos and audio) for Flutter projects based on WeChat's UI, with full support for customization. "/><link rel="alternate" type="application/atom+xml" title="Updated Packages Feed for Pub" href="/feed.atom"/><link rel="stylesheet" type="text/css" href="/static/hash-o6oemknr/material/bundle/styles.css"/><link rel="stylesheet" type="text/css" href="/static/hash-o6oemknr/css/style.css"/><script src="/static/hash-o6oemknr/material/bundle/script.min.js" defer="defer"></script><script src="/static/hash-o6oemknr/js/script.dart.js" defer="defer"></script><script src="https://www.gstatic.com/brandstudio/kato/cookie_choice_component/cookie_consent_bar.v3.js" defer="defer" data-autoload-cookie-consent-bar="true"></script><meta name="pub-page-data" content="eyJwa2dEYXRhIjp7InBhY2thZ2UiOiJ3ZWNoYXRfYXNzZXRzX3BpY2tlciIsInZlcnNpb24iOiI5LjQuMSIsImxpa2VzIjo3NjQsInB1Ymxpc2hlcklkIjoiZmx1dHRlcmNhbmRpZXMuY29tIiwiaXNEaXNjb250aW51ZWQiOmZhbHNlLCJpc0xhdGVzdCI6dHJ1ZX0sInNlc3Npb25Bd2FyZSI6ZmFsc2V9"/><link rel="preload" href="/static/hash-o6oemknr/highlight/highlight-with-init.js" as="script"/></head><body class="light-theme"><script src="/static/hash-o6oemknr/js/dark-init.js"></script><noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MX6DBN9" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><div class="site-header"><button class="hamburger" aria-label="menu toggle"></button><a class="logo" href="/"><img class="site-logo" src="/static/hash-o6oemknr/img/pub-dev-logo.svg" alt="" width="140" height="30" role="presentation"/></a><div class="site-header-space"></div><div class="site-header-mask"></div><div class="site-header-search"><form action="/packages" method="GET"><input class="site-header-search-input" name="q" placeholder="New search..." autocomplete="on" title="Search"/></form></div><nav class="site-header-nav scroll-container"><div class="nav-login-container"><button id="-account-login" class="nav-main-button link">Sign in</button></div><div class="nav-container nav-help-container hoverable"><button class="nav-main-button">Help</button><div class="nav-hover-popup"><div class="nav-table-columns"><div class="nav-table-column"><h3>Pub.dev</h3><a class="nav-link" href="/help/search" rel="noopener" target="_blank">Searching for packages</a><a class="nav-link" href="/help/scoring" rel="noopener" target="_blank">Package scoring and pub points</a></div><div class="nav-table-column"><h3>Flutter</h3><a class="nav-link" href="https://flutter.dev/using-packages/" rel="noopener" target="_blank">Using packages</a><a class="nav-link" href="https://flutter.dev/developing-packages/" rel="noopener" target="_blank">Developing packages and plugins</a><a class="nav-link" href="https://dart.dev/tools/pub/publishing" rel="noopener" target="_blank">Publishing a package</a></div><div class="nav-table-column"><h3>Dart</h3><a class="nav-link" href="https://dart.dev/guides/packages" rel="noopener" target="_blank">Using packages</a><a class="nav-link" href="https://dart.dev/tools/pub/publishing" rel="noopener" target="_blank">Publishing a package</a></div></div></div></div><div class="nav-container nav-help-container-mobile foldable"><h3 class="foldable-button">Pub.dev <img class="foldable-icon" src="/static/hash-o6oemknr/img/nav-mobile-foldable-icon.svg" alt="toggle folding of the section" width="13" height="6"/></h3><div class="foldable-content"><a class="nav-link" href="/help/search" rel="noopener" target="_blank">Searching for packages</a><a class="nav-link" href="/help/scoring" rel="noopener" target="_blank">Package scoring and pub points</a></div></div><div class="nav-container nav-help-container-mobile foldable"><h3 class="foldable-button">Flutter <img class="foldable-icon" src="/static/hash-o6oemknr/img/nav-mobile-foldable-icon.svg" alt="toggle folding of the section" width="13" height="6"/></h3><div class="foldable-content"><a class="nav-link" href="https://flutter.dev/using-packages/" rel="noopener" target="_blank">Using packages</a><a class="nav-link" href="https://flutter.dev/developing-packages/" rel="noopener" target="_blank">Developing packages and plugins</a><a class="nav-link" href="https://dart.dev/tools/pub/publishing" rel="noopener" target="_blank">Publishing a package</a></div></div><div class="nav-container nav-help-container-mobile foldable"><h3 class="foldable-button">Dart <img class="foldable-icon" src="/static/hash-o6oemknr/img/nav-mobile-foldable-icon.svg" alt="toggle folding of the section" width="13" height="6"/></h3><div class="foldable-content"><a class="nav-link" href="https://dart.dev/guides/packages" rel="noopener" target="_blank">Using packages</a><a class="nav-link" href="https://dart.dev/tools/pub/publishing" rel="noopener" target="_blank">Publishing a package</a></div></div></nav></div><div id="banner-container"></div><main class="container"><div class="detail-wrapper -active -has-info-box"><div class="detail-header -is-loose"><div class="detail-container"><div class="detail-header-outer-block"><div class="detail-header-content-block"><h1 class="title">wechat_assets_picker 9.4.1 <span class="pkg-page-title-copy"><img class="pkg-page-title-copy-icon filter-invert-on-dark" src="/static/hash-o6oemknr/img/content-copy-icon.svg" alt="copy "wechat_assets_picker: ^9.4.1" to clipboard" width="18" height="18" title="Copy "wechat_assets_picker: ^9.4.1" to clipboard" data-copy-content="wechat_assets_picker: ^9.4.1" data-ga-click-event="copy-package-version"/><div class="pkg-page-title-copy-feedback"><span class="code">wechat_assets_picker: ^9.4.1</span> copied to clipboard</div></span></h1><div class="metadata">Published <span><a class="-x-ago" href="" title="Nov 21, 2024" aria-label="12 days ago" aria-role="button" role="button" data-timestamp="1732202239843">12 days ago</a></span> • <a class="-pub-publisher" href="/publishers/fluttercandies.com"><img class="-pub-publisher-shield filter-invert-on-dark" src="/static/hash-o6oemknr/img/material-icon-verified.svg" alt="verified publisher" width="14" height="14" title="Published by a pub.dev verified publisher"/>fluttercandies.com</a><span class="package-badge" title="Package is compatible with Dart 3.">Dart 3 compatible</span></div><div class="detail-tags-and-like"><div class="detail-tags"><div class="-pub-tag-badge"><span class="tag-badge-main">SDK</span><a class="tag-badge-sub" href="/packages?q=sdk%3Aflutter" rel="nofollow" title="Packages compatible with Flutter SDK">Flutter</a></div><div class="-pub-tag-badge"><span class="tag-badge-main">Platform</span><a class="tag-badge-sub" href="/packages?q=platform%3Aandroid" rel="nofollow" title="Packages compatible with Android platform">Android</a><a class="tag-badge-sub" href="/packages?q=platform%3Aios" rel="nofollow" title="Packages compatible with iOS platform">iOS</a><a class="tag-badge-sub" href="/packages?q=platform%3Amacos" rel="nofollow" title="Packages compatible with macOS platform">macOS</a></div></div><div class="detail-like"><button id="-pub-like-icon-button" class="mdc-icon-button" data-ga-click-event="toggle-like" aria-pressed="false" title="Like this package"><img class="mdc-icon-button__icon" src="/static/hash-o6oemknr/img/like-inactive.svg" alt="liked status: inactive" width="18" height="18"/><img class="mdc-icon-button__icon mdc-icon-button__icon--on" src="/static/hash-o6oemknr/img/like-active.svg" alt="liked status: active" width="18" height="18"/></button><span class="likes-count"><span id="likes-count">764</span></span></div></div></div></div></div></div><div class="detail-container"><div class="detail-lead"><div class="detail-metadata-toggle"><div class="detail-metadata-toggle-icon">→</div><h3 class="detail-lead-title">Metadata</h3></div><p class="detail-lead-text">An image picker (also with videos and audio) for Flutter projects based on WeChat's UI, with full support for customization. </p><p class="detail-lead-more"><a class="detail-metadata-toggle">More...</a></p></div></div><div class="detail-body"><div class="detail-tabs"><div class="detail-tabs-wide-header"><div class="detail-container"><ul class="detail-tabs-header"><li class="detail-tab tab-button detail-tab-readme-title -active">Readme</li><li class="detail-tab tab-link detail-tab-changelog-title"><a href="/packages/wechat_assets_picker/changelog" role="button">Changelog</a></li><li class="detail-tab tab-link detail-tab-example-title"><a href="/packages/wechat_assets_picker/example" role="button">Example</a></li><li class="detail-tab tab-link detail-tab-installing-title"><a href="/packages/wechat_assets_picker/install" role="button">Installing</a></li><li class="detail-tab tab-link detail-tab-versions-title"><a href="/packages/wechat_assets_picker/versions" role="button">Versions</a></li><li class="detail-tab tab-link detail-tab-analysis-title"><a href="/packages/wechat_assets_picker/score" role="button">Scores</a></li></ul></div></div><div class="detail-container detail-body-main"><div class="detail-tabs-content"><section class="tab-content detail-tab-readme-content -active markdown-body"><!-- Copyright 2019 The FlutterCandies author. All rights reserved. Use of this source code is governed by an Apache license that can be found in the LICENSE file. --> <h1 class="hash-header" id="flutter-wechat-assets-picker">Flutter WeChat Assets Picker <a href="#flutter-wechat-assets-picker" class="hash-link">#</a></h1> <p><a href="https://pub.dev/packages/wechat_assets_picker"><img src="https://img.shields.io/pub/v/wechat_assets_picker?logo=dart&label=stable&style=flat-square" alt="pub package"></a> <a href="https://pub.dev/packages/wechat_assets_picker"><img src="https://img.shields.io/pub/v/wechat_assets_picker?color=9d00ff&include_prereleases&label=dev&logo=dart&style=flat-square" alt="pub package"></a> <a href="https://www.codefactor.io/repository/github/fluttercandies/flutter_wechat_assets_picker" rel="ugc"><img src="https://img.shields.io/codefactor/grade/github/fluttercandies/flutter_wechat_assets_picker?logo=codefactor&logoColor=#ffffff&style=flat-square" alt="CodeFactor"></a></p> <p><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/actions/workflows/runnable.yml" rel="ugc"><img src="https://img.shields.io/github/actions/workflow/status/fluttercandies/flutter_wechat_assets_picker/runnable.yml?branch=main&label=CI&logo=github&style=flat-square" alt="Build status"></a> <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/blob/main/LICENSE" rel="ugc"><img src="https://img.shields.io/github/license/fluttercandies/flutter_wechat_assets_picker?style=flat-square" alt="GitHub license"></a> <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/stargazers" rel="ugc"><img src="https://img.shields.io/github/stars/fluttercandies/flutter_wechat_assets_picker?logo=github&style=flat-square" alt="GitHub stars"></a> <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/network" rel="ugc"><img src="https://img.shields.io/github/forks/fluttercandies/flutter_wechat_assets_picker?logo=github&style=flat-square" alt="GitHub forks"></a></p> <p><a href="https://github.com/Solido/awesome-flutter" rel="ugc"><img src="https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg" alt="Awesome Flutter"></a> <a href="https://jq.qq.com/?_wv=1027&k=5bcc0gy" rel="ugc"><img src="https://pub.idqqimg.com/wpa/images/group.png" alt="Flutter Candies QQ群"></a></p> <p>Language: English | <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/blob/main/README-ZH.md" rel="ugc">中文</a></p> <p>An <strong>image picker (also with videos and audios)</strong> for Flutter projects based on the WeChat's UI.</p> <p>Current WeChat version that UI based on: <strong>8.0.51</strong> UI designs will be updated following the WeChat update in anytime.</p> <p>To take a photo or a video for assets, please check the detailed usage in the example, and head over to <a href="https://pub.dev/packages/wechat_camera_picker">wechat_camera_picker</a>. The package is a standalone extension that can to be used with combination.</p> <p>See the <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/blob/main/guides/migration_guide.md" rel="ugc">Migration Guide</a> to learn how to migrate between breaking changes.</p> <h2 class="hash-header" id="versions-compatibility">Versions compatibility <a href="#versions-compatibility" class="hash-link">#</a></h2> <p>The package only guarantees to be working on <strong>the stable version of Flutter</strong>. We won't update it in real-time to align with other channels of Flutter.</p> <table> <thead> <tr> <th></th> <th align="center">3.0</th> <th align="center">3.3</th> <th align="center">3.7</th> <th align="center">3.10</th> <th align="center">3.13</th> <th align="center">3.16</th> </tr> </thead> <tbody> <tr> <td>8.9.0+</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">✅</td> </tr> <tr> <td>8.7.0+</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">✅</td> <td align="center">❌</td> </tr> <tr> <td>8.5.0+</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">✅</td> <td align="center">❌</td> <td align="center">❌</td> </tr> <tr> <td>8.4.0+</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">✅</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">❌</td> </tr> <tr> <td>8.0.0+</td> <td align="center">✅</td> <td align="center">✅</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">❌</td> </tr> <tr> <td>7.3.0+</td> <td align="center">✅</td> <td align="center">✅</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">❌</td> <td align="center">❌</td> </tr> </tbody> </table> <p>If you got a <code>resolve conflict</code> error when running <code>flutter pub get</code>, please use <code>dependency_overrides</code> to fix it.</p> <h2 class="hash-header" id="package-credits">Package credits <a href="#package-credits" class="hash-link">#</a></h2> <p>The package is built from these wonderful packages.</p> <table> <thead> <tr> <th align="left">Name</th> <th align="left">Features</th> </tr> </thead> <tbody> <tr> <td align="left"><a href="https://pub.dev/packages/photo_manager">photo_manager</a></td> <td align="left">The basic abstractions and management for assets.</td> </tr> <tr> <td align="left"><a href="https://pub.dev/packages/extended_image">extended_image</a></td> <td align="left">Preview assets with expected behaviors.</td> </tr> <tr> <td align="left"><a href="https://pub.dev/packages/provider">provider</a></td> <td align="left">Helps to manage the interaction state of the picker.</td> </tr> <tr> <td align="left"><a href="https://pub.dev/packages/video_player">video_player</a></td> <td align="left">Plays videos and audios correspondingly.</td> </tr> </tbody> </table> <p>Their implementation should be relatively stable in the package. If you've found any issues related to them when using the picker, submit issues to our issue tracker first.</p> <details> <summary>Table of content</summary> <!-- TOC --> <ul> <li><a href="#flutter-wechat-assets-picker">Flutter WeChat Assets Picker</a> <ul> <li><a href="#versions-compatibility">Versions compatibility</a></li> <li><a href="#package-credits">Package credits</a></li> <li><a href="#features-">Features ✨</a> <ul> <li><a href="#notes-">Notes 📝</a></li> </ul> </li> <li><a href="#projects-using-this-plugin-">Projects using this plugin 🖼️</a></li> <li><a href="#screenshots-">Screenshots 📸</a></li> <li><a href="#read-this-first-">READ THIS FIRST ‼️</a></li> <li><a href="#preparing-for-use-">Preparing for use 🍭</a> <ul> <li><a href="#flutter">Flutter</a></li> <li><a href="#android">Android</a> <ul> <li><a href="#permissions">Permissions</a></li> </ul> </li> <li><a href="#ios">iOS</a></li> <li><a href="#macos">macOS</a></li> </ul> </li> <li><a href="#usage-">Usage 📖</a> <ul> <li><a href="#localizations">Localizations</a></li> <li><a href="#simple-usage">Simple usage</a></li> <li><a href="#detailed-usage">Detailed usage</a> <ul> <li><a href="#display-selected-assets">Display selected assets</a></li> <li><a href="#register-assets-change-observe-callback">Register assets change observe callback</a></li> <li><a href="#upload-an-assetentity-with-a-form-data">Upload an <code>AssetEntity</code> with a form data</a> <ul> <li><a href="#with-http">With <code>http</code></a></li> <li><a href="#with-dio">With <code>dio</code></a></li> </ul> </li> </ul> </li> <li><a href="#custom-pickers">Custom pickers</a></li> </ul> </li> <li><a href="#frequently-asked-question-">Frequently asked question ❔</a> <ul> <li><a href="#changing-the-default-album-name-recent-to-others">Changing the default album name (<code>Recent</code> to others)</a></li> <li><a href="#execution-failed-for-task-photo_managercompiledebugkotlin">Execution failed for task ':photo_manager:compileDebugKotlin'</a></li> <li><a href="#create-assetentity-from-file-or-uint8list-rawdata">Create <code>AssetEntity</code> from <code>File</code> or <code>Uint8List</code> (rawData)</a></li> <li><a href="#glide-warning-failed-to-find-generatedappglidemodule">Glide warning 'Failed to find GeneratedAppGlideModule'</a></li> </ul> </li> <li><a href="#contributors-">Contributors ✨</a></li> <li><a href="#credits">Credits</a></li> </ul> </li> </ul> <!-- TOC --> </details> <h2 class="hash-header" id="features-">Features ✨ <a href="#features-" class="hash-link">#</a></h2> <ul> <li>♿ Complete a11y support with <em>TalkBack</em> and <em>VoiceOver</em></li> <li>♻️ Fully customizable with delegates override</li> <li>🎏 Fully customizable theme based on <code>ThemeData</code></li> <li>💚 Completely WeChat style (even more)</li> <li>⚡️ Adjustable performance with different configurations</li> <li>📷 Image support <ul> <li>🔬 HEIF Image type support <a href="#notes-"><sup>(1)</sup></a></li> </ul> </li> <li>🎥 Video support</li> <li>🎶 Audio support <a href="#notes-"><sup>(2)</sup></a></li> <li>1️⃣ Single picking mode</li> <li>💱 Internationalization (i18n) support <ul> <li>⏪ RTL language support</li> </ul> </li> <li>➕ Special item builder support</li> <li>🗂 Custom sort path delegate support</li> <li>📝 Custom text delegate support</li> <li>⏳ Custom filter options support</li> <li>💻 macOS support</li> </ul> <h3 class="hash-header" id="notes-">Notes 📝 <a href="#notes-" class="hash-link">#</a></h3> <ol> <li>HEIF (HEIC) images are support to obtain and conversion, but the display with them are based on Flutter's image decoder. See <a href="https://github.com/flutter/flutter/issues/20522" rel="ugc">flutter/flutter#20522</a>. Use <code>entity.file</code> or <code>AssetEntityImage</code> for them when displays.</li> <li>Due to limitations on iOS and macOS, audio can only be fetched within the sandbox.</li> </ol> <h2 class="hash-header" id="projects-using-this-plugin-">Projects using this plugin 🖼️ <a href="#projects-using-this-plugin-" class="hash-link">#</a></h2> <table> <thead> <tr> <th align="left">name</th> <th align="left">pub</th> <th align="left">github</th> </tr> </thead> <tbody> <tr> <td align="left">insta_assets_picker</td> <td align="left"><a href="https://pub.dev/packages/insta_assets_picker"><img src="https://img.shields.io/pub/v/insta_assets_picker" alt="pub package"></a></td> <td align="left"><a href="https://github.com/LeGoffMael/insta_assets_picker" rel="ugc"><img src="https://img.shields.io/github/stars/LeGoffMael/insta_assets_picker?style=social" alt="star"></a></td> </tr> </tbody> </table> <h2 class="hash-header" id="screenshots-">Screenshots 📸 <a href="#screenshots-" class="hash-link">#</a></h2> <table> <thead> <tr> <th><img src="https://github.com/fluttercandies/flutter_wechat_assets_picker/raw/main/screenshots/README_1.webp" alt="1"></th> <th><img src="https://github.com/fluttercandies/flutter_wechat_assets_picker/raw/main/screenshots/README_2.webp" alt="2"></th> <th><img src="https://github.com/fluttercandies/flutter_wechat_assets_picker/raw/main/screenshots/README_3.webp" alt="3"></th> </tr> </thead> <tbody> <tr> <td><img src="https://github.com/fluttercandies/flutter_wechat_assets_picker/raw/main/screenshots/README_4.webp" alt="4"></td> <td><img src="https://github.com/fluttercandies/flutter_wechat_assets_picker/raw/main/screenshots/README_5.webp" alt="5"></td> <td><img src="https://github.com/fluttercandies/flutter_wechat_assets_picker/raw/main/screenshots/README_6.webp" alt="6"></td> </tr> <tr> <td><img src="https://github.com/fluttercandies/flutter_wechat_assets_picker/raw/main/screenshots/README_7.webp" alt="7"></td> <td><img src="https://github.com/fluttercandies/flutter_wechat_assets_picker/raw/main/screenshots/README_8.webp" alt="8"></td> <td><img src="https://github.com/fluttercandies/flutter_wechat_assets_picker/raw/main/screenshots/README_9.webp" alt="9"></td> </tr> <tr> <td><img src="https://pic.alexv525.com/2021-07-05-picker_10.png" alt="10"></td> <td><img src="https://pic.alexv525.com/2021-07-05-picker_11.png" alt="10"></td> <td><img src="https://pic.alexv525.com/2021-07-05-picker_12.png" alt="12"></td> </tr> </tbody> </table> <h2 class="hash-header" id="read-this-first-">READ THIS FIRST ‼️ <a href="#read-this-first-" class="hash-link">#</a></h2> <p>Be aware of below notices before you started anything:</p> <ul> <li>Due to understanding differences and the limitation of a single document, documents will not cover all the contents. If you find nothing related to your expected features and cannot understand about concepts, run the example project and check every options first. It has covered 90% of regular requests with the package.</li> <li>The package deeply integrates with the <a href="https://pub.dev/packages/photo_manager">photo_manager</a> plugin, make sure you understand these two concepts as much as possible: <ul> <li>Asset (photos/videos/audio) - <a href="https://pub.dev/documentation/photo_manager/latest/photo_manager/AssetEntity-class.html"><code>AssetEntity</code></a></li> <li>Assets collection (albums/libraries) - <a href="https://pub.dev/documentation/photo_manager/latest/photo_manager/AssetPathEntity-class.html"><code>AssetPathEntity</code></a></li> </ul> </li> </ul> <p>When you have questions about related APIs and behaviors, check <a href="https://pub.dev/documentation/photo_manager/latest/">photo_manager's API docs</a> for more details.</p> <p>Most usages are detailed covered by the <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/blob/main/example" rel="ugc">example</a>. Please walk through the <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/blob/main/example" rel="ugc">example</a> carefully before you have any questions.</p> <h2 class="hash-header" id="preparing-for-use-">Preparing for use 🍭 <a href="#preparing-for-use-" class="hash-link">#</a></h2> <h3 class="hash-header" id="flutter">Flutter <a href="#flutter" class="hash-link">#</a></h3> <p>Run <code>flutter pub add wechat_assets_picker</code>, or add <code>wechat_assets_picker</code> to <code>pubspec.yaml</code> dependencies manually.</p> <pre><code class="language-yaml">dependencies: wechat_assets_picker: ^latest_version </code></pre> <p>The latest <strong>stable</strong> version is: <a href="https://pub.dev/packages/wechat_assets_picker"><img src="https://img.shields.io/pub/v/wechat_assets_picker?logo=dart&label=stable&style=flat-square" alt="pub package"></a></p> <p>The latest <strong>dev</strong> version is: <a href="https://pub.dev/packages/wechat_assets_picker"><img src="https://img.shields.io/pub/v/wechat_assets_picker?color=9d00ff&include_prereleases&label=dev&logo=dart&style=flat-square" alt="pub package"></a></p> <p>Then import the package in your code:</p> <pre><code class="language-dart">import 'package:wechat_assets_picker/wechat_assets_picker.dart'; </code></pre> <h3 class="hash-header" id="android">Android <a href="#android" class="hash-link">#</a></h3> <p>When using the package, please upgrade <code>targetSdkVersion</code> and <code>compileSdkVersion</code> to <code>33</code>. Otherwise, no assets can be fetched on Android 13.</p> <h4 id="permissions">Permissions</h4> <table> <thead> <tr> <th>Name</th> <th>Required</th> <th>Declared</th> <th>Max API Level</th> <th>Others</th> </tr> </thead> <tbody> <tr> <td><code>READ_EXTERNAL_STORAGE</code></td> <td>YES</td> <td>YES</td> <td>32</td> <td></td> </tr> <tr> <td><code>WRITE_EXTERNAL_STORAGE</code></td> <td>NO</td> <td>NO</td> <td>29</td> <td></td> </tr> <tr> <td><code>ACCESS_MEDIA_LOCATION</code></td> <td>YES*</td> <td>NO</td> <td>N/A</td> <td>Required when reading EXIF</td> </tr> <tr> <td><code>READ_MEDIA_IMAGES</code></td> <td>YES*</td> <td>YES</td> <td>N/A</td> <td>Required when reading images</td> </tr> <tr> <td><code>READ_MEDIA_VIDEO</code></td> <td>YES*</td> <td>YES</td> <td>N/A</td> <td>Required when reading videos</td> </tr> <tr> <td><code>READ_MEDIA_AUDIO</code></td> <td>YES*</td> <td>YES</td> <td>N/A</td> <td>Required when reading audios</td> </tr> </tbody> </table> <p>If you're targeting Android SDK 33+, and you don't need to load photos, videos or audios, consider declare only relevant permission in your apps, more specifically:</p> <pre><code class="language-xml"><manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.your.app"> <!--Requesting access to images and videos.--> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!--When your app has no need to access audio, remove it or comment it out.--> <!--<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />--> </manifest> </code></pre> <h3 class="hash-header" id="ios">iOS <a href="#ios" class="hash-link">#</a></h3> <ol> <li>Platform version has to be at least <em>11.0</em>. Modify <code>ios/Podfile</code> and update accordingly. <pre><code class="language-Podfile">platform :ios, '11.0' </code></pre> Remove the <code>#</code> heading if the line starts with it.</li> <li>Add the following content to <code>Info.plist</code>.</li> </ol> <pre><code><key>NSPhotoLibraryUsageDescription</key> <string>Replace with your permission description.</string> </code></pre> <h3 class="hash-header" id="macos">macOS <a href="#macos" class="hash-link">#</a></h3> <ol> <li>Platform version has to be at least <em>10.15</em>. Modify <code>macos/Podfile</code> and update accordingly. <pre><code class="language-ruby">platform :osx, '10.15' </code></pre> Remove the <code>#</code> heading if the line starts with it.</li> <li>Set the minimum deployment target of the macOS to <em>10.15</em>. Use XCode to open <code>macos/Runner.xcworkspace</code> .</li> <li>Follow the <a href="#iOS">iOS</a> instructions and modify <code>Info.plist</code> accordingly.</li> </ol> <h2 class="hash-header" id="usage-">Usage 📖 <a href="#usage-" class="hash-link">#</a></h2> <h3 class="hash-header" id="localizations">Localizations <a href="#localizations" class="hash-link">#</a></h3> <p>When you're picking assets, the package will obtain the <code>Locale?</code> from your <code>BuildContext</code>, and return the corresponding text delegate of the current language. Make sure you have a valid <code>Locale</code> in your widget tree that can be accessed from the <code>BuildContext</code>. <strong>Otherwise, the default Chinese delegate will be used.</strong></p> <p>Embedded text delegates languages are:</p> <ul> <li>简体中文 (default)</li> <li>English</li> <li>העברית</li> <li>Deutsche</li> <li>Локализация</li> <li>日本語</li> <li>مة العربية</li> <li>Délégué</li> <li>Tiếng Việt</li> <li>Türkçe Yerelleştirme</li> </ul> <p>If you want to use a custom/fixed text delegate, pass it through the <code>AssetPickerConfig.textDelegate</code>.</p> <h3 class="hash-header" id="simple-usage">Simple usage <a href="#simple-usage" class="hash-link">#</a></h3> <pre><code class="language-dart">final List<AssetEntity>? result = await AssetPicker.pickAssets(context); </code></pre> <p>Use <code>AssetPickerConfig</code> for more picking behaviors.</p> <pre><code class="language-dart">final List<AssetEntity>? result = await AssetPicker.pickAssets( context, pickerConfig: const AssetPickerConfig(), ); </code></pre> <p>Fields in <code>AssetPickerConfig</code>:</p> <table> <thead> <tr> <th>Name</th> <th>Type</th> <th>Description</th> <th>Default</th> </tr> </thead> <tbody> <tr> <td>selectedAssets</td> <td><code>List<AssetEntity>?</code></td> <td>Selected assets. Prevent duplicate selection.</td> <td><code>null</code></td> </tr> <tr> <td>maxAssets</td> <td><code>int</code></td> <td>Maximum asset that the picker can pick.</td> <td>9</td> </tr> <tr> <td>pageSize</td> <td><code>int?</code></td> <td>Number of assets per page. <strong>Must be a multiple of <code>gridCount</code></strong>.</td> <td>80</td> </tr> <tr> <td>gridThumbnailSize</td> <td><code>ThumbnailSize</code></td> <td>Thumbnail size for the grid's item.</td> <td><code>ThumbnailSize.square(200)</code></td> </tr> <tr> <td>pathThumbnailSize</td> <td><code>ThumbnailSize</code></td> <td>Thumbnail size for the path selector.</td> <td><code>ThumbnailSize.square(80)</code></td> </tr> <tr> <td>previewThumbnailSize</td> <td><code>ThumbnailSize?</code></td> <td>Preview thumbnail size in the viewer.</td> <td><code>null</code></td> </tr> <tr> <td>requestType</td> <td><code>RequestType</code></td> <td>Request type for picker.</td> <td><code>RequestType.common</code></td> </tr> <tr> <td>specialPickerType</td> <td><code>SpecialPickerType?</code></td> <td>Provides the option to integrate a custom picker type.</td> <td><code>null</code></td> </tr> <tr> <td>keepScrollOffset</td> <td><code>bool</code></td> <td>Whether the picker should save the scroll offset between pushes and pops.</td> <td><code>null</code></td> </tr> <tr> <td>sortPathDelegate</td> <td><code>SortPathDelegate<AssetPathEntity>?</code></td> <td>Path entities sort delegate for the picker, sort paths as you want.</td> <td><code>CommonSortPathDelegate</code></td> </tr> <tr> <td>sortPathsByModifiedDate</td> <td><code>bool</code></td> <td>Whether to allow sort delegates to sort paths with <code>FilterOptionGroup.containsPathModified</code>.</td> <td><code>false</code></td> </tr> <tr> <td>filterOptions</td> <td><code>PMFilter?</code></td> <td>Allow users to customize assets filter options.</td> <td><code>null</code></td> </tr> <tr> <td>gridCount</td> <td><code>int</code></td> <td>Grid count in picker.</td> <td>4</td> </tr> <tr> <td>themeColor</td> <td><code>Color?</code></td> <td>Main theme color for the picker.</td> <td><code>Color(0xff00bc56)</code></td> </tr> <tr> <td>pickerTheme</td> <td><code>ThemeData?</code></td> <td>Theme data provider for the picker and the viewer.</td> <td><code>null</code></td> </tr> <tr> <td>textDelegate</td> <td><code>AssetPickerTextDelegate?</code></td> <td>Text delegate for the picker, for customize the texts.</td> <td><code>AssetPickerTextDelegate()</code></td> </tr> <tr> <td>specialItemPosition</td> <td><code>SpecialItemPosition</code></td> <td>Allow users set a special item in the picker with several positions.</td> <td><code>SpecialItemPosition.none</code></td> </tr> <tr> <td>specialItemBuilder</td> <td><code>SpecialItemBuilder?</code></td> <td>The widget builder for the special item.</td> <td><code>null</code></td> </tr> <tr> <td>loadingIndicatorBuilder</td> <td><code>IndicatorBuilder?</code></td> <td>Indicates the loading status for the builder.</td> <td><code>null</code></td> </tr> <tr> <td>selectPredicate</td> <td><code>AssetSelectPredicate</code></td> <td>Predicate whether an asset can be selected or unselected.</td> <td><code>null</code></td> </tr> <tr> <td>shouldRevertGrid</td> <td><code>bool?</code></td> <td>Whether the assets grid should revert.</td> <td><code>null</code></td> </tr> <tr> <td>limitedPermissionOverlayPredicate</td> <td><code>LimitedPermissionOverlayPredicate?</code></td> <td>Predicate whether the limited permission overlay should be displayed.</td> <td><code>null</code></td> </tr> <tr> <td>pathNameBuilder</td> <td><code>PathNameBuilder<AssetPathEntity>?</code></td> <td>Build customized path (album) name with the given path entity.</td> <td><code>null</code></td> </tr> <tr> <td>assetsChangeCallback</td> <td><code>AssetsChangeCallback<AssetPathEntity>?</code></td> <td>The callback that will be called when the system notifies assets changes.</td> <td><code>null</code></td> </tr> <tr> <td>assetsChangeRefreshPredicate</td> <td><code>AssetsChangeRefreshPredicate<AssetPathEntity>?</code></td> <td>Whether assets changing should call refresh with the given call and the current selected path.</td> <td><code>null</code></td> </tr> <tr> <td>shouldAutoPlayPreview</td> <td><code>bool</code></td> <td>Whether the preview should auto play.</td> <td><code>false</code></td> </tr> </tbody> </table> <ul> <li>When <code>maxAssets</code> equals to <code>1</code> (a.k.a. single picking mode), use <code>SpecialPickerType.noPreview</code> will immediately select asset clicked (pressed) by the user and popped.</li> <li><code>limitedPermissionOverlayPredicate</code> lives without persistence, if you want to ignore the limited preview after restart, you'll need to integrate with your own saving methods.</li> </ul> <h3 class="hash-header" id="detailed-usage">Detailed usage <a href="#detailed-usage" class="hash-link">#</a></h3> <p>We've put multiple common usage with the packages in the <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/blob/main/example" rel="ugc">example</a>. You can both found <code>List<PickMethod> pickMethods</code> in <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/blob/main/example/lib/pages/multi_assets_page.dart" rel="ugc">here</a> and <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/blob/main/example/lib/pages/single_assets_page.dart" rel="ugc">here</a>, which provide methods in multiple picking and single picking mode. Assets will be stored temporary and displayed at the below of the page.</p> <h4 id="display-selected-assets">Display selected assets</h4> <p>The <code>AssetEntityImage</code> and <code>AssetEntityImageProvider</code> can display the thumb image of <em>images & videos</em>, and the original data of <em>image</em>. Use it like a common <code>Image</code> and <code>ImageProvider</code>.</p> <pre><code class="language-dart">AssetEntityImage(asset, isOriginal: false); </code></pre> <p>Or:</p> <pre><code class="language-dart">Image(image: AssetEntityImageProvider(asset, isOriginal: false)); </code></pre> <h4 id="register-assets-change-observe-callback">Register assets change observe callback</h4> <pre><code class="language-dart">// Register callback. AssetPicker.registerObserve(); // Unregister callback. AssetPicker.unregisterObserve(); </code></pre> <h4 id="upload-an-assetentity-with-a-form-data">Upload an <code>AssetEntity</code> with a form data</h4> <p>There are multiple ways to upload an <code>AssetEntity</code> with I/O related methods. <strong>Be aware, I/O related methods will consume performance (typically time and memory), they should not be called frequently.</strong></p> <h5 id="with-http">With <code>http</code></h5> <p><code>http</code> package: <a href="https://pub.dev/packages/http">https://pub.dev/packages/http</a></p> <p>The <code>http</code> package uses <a href="https://pub.dev/documentation/http/latest/http/MultipartFile-class.html"><code>MultipartFile</code></a> to handle files in requests.</p> <p>Pseudo code:</p> <pre><code class="language-dart">import 'package:http/http.dart' as http; Future<void> upload() async { final entity = await obtainYourEntity(); final uri = Uri.https('example.com', 'create'); final request = http.MultipartRequest('POST', uri) ..fields['test_field'] = 'test_value' ..files.add(await multipartFileFromAssetEntity(entity)); final response = await request.send(); if (response.statusCode == 200) { print('Uploaded!'); } } Future<http.MultipartFile> multipartFileFromAssetEntity(AssetEntity entity) async { http.MultipartFile mf; // Using the file path. final file = await entity.file; if (file == null) { throw StateError('Unable to obtain file of the entity ${entity.id}.'); } mf = await http.MultipartFile.fromPath('test_file', file.path); // Using the bytes. final bytes = await entity.originBytes; if (bytes == null) { throw StateError('Unable to obtain bytes of the entity ${entity.id}.'); } mf = http.MultipartFile.fromBytes('test_file', bytes); return mf; } </code></pre> <h5 id="with-dio">With <code>dio</code></h5> <p><code>dio</code> package: <a href="https://pub.dev/packages/dio">https://pub.dev/packages/dio</a></p> <p>The <code>dio</code> package also uses <a href="https://pub.dev/documentation/dio/latest/dio/MultipartFile-class.html"><code>MultipartFile</code></a> to handle files in requests.</p> <p>Pseudo code:</p> <pre><code class="language-dart">import 'package:dio/dio.dart' as dio; Future<void> upload() async { final entity = await obtainYourEntity(); final uri = Uri.https('example.com', 'create'); final response = dio.Dio().requestUri( uri, data: dio.FormData.fromMap({ 'test_field': 'test_value', 'test_file': await multipartFileFromAssetEntity(entity), }), ); print('Uploaded!'); } Future<dio.MultipartFile> multipartFileFromAssetEntity(AssetEntity entity) async { dio.MultipartFile mf; // Using the file path. final file = await entity.file; if (file == null) { throw StateError('Unable to obtain file of the entity ${entity.id}.'); } mf = await dio.MultipartFile.fromFile(file.path); // Using the bytes. final bytes = await entity.originBytes; if (bytes == null) { throw StateError('Unable to obtain bytes of the entity ${entity.id}.'); } mf = dio.MultipartFile.fromBytes(bytes); return mf; } </code></pre> <h3 class="hash-header" id="custom-pickers">Custom pickers <a href="#custom-pickers" class="hash-link">#</a></h3> <p><code>AssetPickerBuilderDelegate</code>, <code>AssetPickerViewerBuilderDelegate</code>, <code>AssetPickerProvider</code> and <code>AssetPickerViewerProvider</code> are all exposed and overridable. You can extend them and use your own type with generic type <code><A: Asset, P: Path></code>, then implement abstract methods.</p> <p>To know about how to fully customize themes, widgets or layouts. See how to customize delegates in the custom pickers page in the <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/blob/main/example/lib/customs/pickers" rel="ugc">example</a>.</p> <p>You can submit PRs to create your own implementation if you found your implementation might be useful for others. See <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/blob/main/example/lib/customs/CONTRIBUTING.md" rel="ugc">Contribute custom implementations</a> for more details.</p> <h2 class="hash-header" id="frequently-asked-question-">Frequently asked question ❔ <a href="#frequently-asked-question-" class="hash-link">#</a></h2> <h3 class="hash-header" id="changing-the-default-album-name-recent-to-others">Changing the default album name (<code>Recent</code> to others) <a href="#changing-the-default-album-name-recent-to-others" class="hash-link">#</a></h3> <p><code>Recent</code> is the fix album name for the ALL assets on Android since the all assets' album is not an actual album, it only represents all media data records.</p> <p>To solve that on Android, use <code>pathNameBuilder</code>, for example:</p> <pre><code class="language-dart">AssetPickerConfig( pathNameBuilder: (AssetPathEntity path) => switch (path) { final p when p.isAll => '最近', // You can apply similar conditions to other common paths. _ => path.name, }, ) </code></pre> <p>Other albums or albums on other platforms (iOS/macOS) will follow the configured system localization and supported localizations. <code>pathNameBuilder</code> is available for all albums.</p> <h3 class="hash-header" id="execution-failed-for-task-photo_managercompiledebugkotlin">Execution failed for task ':photo_manager:compileDebugKotlin' <a href="#execution-failed-for-task-photo_managercompiledebugkotlin" class="hash-link">#</a></h3> <p>See <a href="https://github.com/fluttercandies/flutter_photo_manager/issues/561" rel="ugc">photo_manager#561</a> for more details.</p> <h3 class="hash-header" id="create-assetentity-from-file-or-uint8list-rawdata">Create <code>AssetEntity</code> from <code>File</code> or <code>Uint8List</code> (rawData) <a href="#create-assetentity-from-file-or-uint8list-rawdata" class="hash-link">#</a></h3> <p>In order to combine this package with camera shooting or something related, there's a solution about how to create an <code>AssetEntity</code> with <code>File</code> or <code>Uint8List</code> object.</p> <pre><code class="language-dart">final File file = your_file; // Your `File` object final String path = file.path; final AssetEntity fileEntity = await PhotoManager.editor.saveImageWithPath( path, title: basename(path), ); // Saved in the device then create an AssetEntity final Uint8List data = your_data; // Your `Uint8List` object final AssetEntity imageEntity = await PhotoManager.editor.saveImage( file.path, title: 'title_with_extension.jpg', ); // Saved in the device then create an AssetEntity </code></pre> <p><strong>Notice: If you don't want to keep the file in your device, use <code>File</code> for operations as much as possible.</strong> Deleting an <code>AssetEntity</code> might cause system popups show:</p> <pre><code class="language-dart">final List<String> result = await PhotoManager.editor.deleteWithIds( <String>[entity.id], ); </code></pre> <p>See <a href="https://github.com/fluttercandies/flutter_photo_manager#from-raw-data" rel="ugc">photo_manager#from-raw-data</a> and <a href="https://github.com/fluttercandies/flutter_photo_manager#delete-entities" rel="ugc">photo_manager#delete-entities</a> for more details.</p> <h3 class="hash-header" id="glide-warning-failed-to-find-generatedappglidemodule">Glide warning 'Failed to find GeneratedAppGlideModule' <a href="#glide-warning-failed-to-find-generatedappglidemodule" class="hash-link">#</a></h3> <pre><code>W/Glide (21133): Failed to find GeneratedAppGlideModule. You should include an annotationProcessor compile dependency on com.github.bumptech.glide:compiler in you application ana a @GlideModule annotated AppGlideModule implementation or LibraryGlideModules will be silently ignored. </code></pre> <p><code>Glide</code> needs annotation to keep singleton, prevent conflict between instances and versions, so while the photo manager uses <code>Glide</code> to implement image features, the project which import this should define its own <code>AppGlideModule</code>. See <a href="https://sjudd.github.io/glide/doc/generatedapi.html" rel="ugc">Glide Generated API docs</a> for implementation.</p> <h2 class="hash-header" id="contributors-">Contributors ✨ <a href="#contributors-" class="hash-link">#</a></h2> <p>Many thanks to these wonderful people (<a href="https://allcontributors.org/docs/en/emoji-key" rel="ugc">emoji key</a>):</p> <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- prettier-ignore-start --> <!-- markdownlint-disable --> <table> <tbody> <tr> <td align="center" valign="top" width="14.28%"><a href="https://blog.alexv525.com" rel="ugc"><img src="https://avatars1.githubusercontent.com/u/15884415?v=4?s=50" width="50px;" alt="Alex Li"><br><sub><b>Alex Li</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/commits?author=AlexV525" title="Code" rel="ugc">💻</a> <a href="#design-AlexV525" title="Design">🎨</a> <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/commits?author=AlexV525" title="Documentation" rel="ugc">📖</a> <a href="#example-AlexV525" title="Examples">💡</a> <a href="#ideas-AlexV525" title="Ideas, Planning, & Feedback">🤔</a> <a href="#maintenance-AlexV525" title="Maintenance">🚧</a> <a href="#question-AlexV525" title="Answering Questions">💬</a> <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/pulls?q=is%3Apr+reviewed-by%3AAlexV525" title="Reviewed Pull Requests" rel="ugc">👀</a> <a href="#a11y-AlexV525" title="Accessibility">️️️️♿️</a> <a href="#translation-AlexV525" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://www.kikt.top" rel="ugc"><img src="https://avatars0.githubusercontent.com/u/14145407?v=4?s=50" width="50px;" alt="Caijinglong"><br><sub><b>Caijinglong</b></sub></a><br><a href="#example-CaiJingLong" title="Examples">💡</a> <a href="#ideas-CaiJingLong" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/SchnMar" rel="ugc"><img src="https://avatars3.githubusercontent.com/u/12902321?v=4?s=50" width="50px;" alt="Marcel Schneider"><br><sub><b>Marcel Schneider</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/issues?q=author%3ASchnMar" title="Bug reports" rel="ugc">🐛</a> <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/commits?author=SchnMar" title="Code" rel="ugc">💻</a> <a href="#ideas-SchnMar" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/ganlanshu0211" rel="ugc"><img src="https://avatars0.githubusercontent.com/u/9670379?v=4?s=50" width="50px;" alt="ganlanshu0211"><br><sub><b>ganlanshu0211</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/issues?q=author%3Aganlanshu0211" title="Bug reports" rel="ugc">🐛</a> <a href="#ideas-ganlanshu0211" title="Ideas, Planning, & Feedback">🤔</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/JasonHezz" rel="ugc"><img src="https://avatars3.githubusercontent.com/u/15358765?v=4?s=50" width="50px;" alt="JasonHezz"><br><sub><b>JasonHezz</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/issues?q=author%3AJasonHezz" title="Bug reports" rel="ugc">🐛</a> <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/commits?author=JasonHezz" title="Code" rel="ugc">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/yanivshaked" rel="ugc"><img src="https://avatars.githubusercontent.com/u/13107481?v=4?s=50" width="50px;" alt="Yaniv Shaked"><br><sub><b>Yaniv Shaked</b></sub></a><br><a href="#translation-yanivshaked" title="Translation">🌍</a> <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/commits?author=yanivshaked" title="Code" rel="ugc">💻</a> <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/issues?q=author%3Ayanivshaked" title="Bug reports" rel="ugc">🐛</a> <a href="#maintenance-yanivshaked" title="Maintenance">🚧</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/avi-yadav" rel="ugc"><img src="https://avatars.githubusercontent.com/u/7314430?v=4?s=50" width="50px;" alt="avi-yadav"><br><sub><b>avi-yadav</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/commits?author=avi-yadav" title="Code" rel="ugc">💻</a></td> </tr> <tr> <td align="center" valign="top" width="14.28%"><a href="https://github.com/Letalus" rel="ugc"><img src="https://avatars.githubusercontent.com/u/41230136?v=4?s=50" width="50px;" alt="Letalus"><br><sub><b>Letalus</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/issues?q=author%3ALetalus" title="Bug reports" rel="ugc">🐛</a> <a href="#translation-Letalus" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/greymag" rel="ugc"><img src="https://avatars.githubusercontent.com/u/1502131?v=4?s=50" width="50px;" alt="greymag"><br><sub><b>greymag</b></sub></a><br><a href="#translation-greymag" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/NaikSoftware" rel="ugc"><img src="https://avatars.githubusercontent.com/u/4218994?v=4?s=50" width="50px;" alt="Nickolay Savchenko"><br><sub><b>Nickolay Savchenko</b></sub></a><br><a href="#design-NaikSoftware" title="Design">🎨</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/KosukeSaigusa" rel="ugc"><img src="https://avatars.githubusercontent.com/u/13669049?v=4?s=50" width="50px;" alt="Kosuke Saigusa"><br><sub><b>Kosuke Saigusa</b></sub></a><br><a href="#translation-KosukeSaigusa" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/Jon-Millent" rel="ugc"><img src="https://avatars.githubusercontent.com/u/17584565?v=4?s=50" width="50px;" alt="三闻书店"><br><sub><b>三闻书店</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/commits?author=Jon-Millent" title="Documentation" rel="ugc">📖</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/didiosn" rel="ugc"><img src="https://avatars.githubusercontent.com/u/15895051?v=4?s=50" width="50px;" alt="DidiosFaust"><br><sub><b>DidiosFaust</b></sub></a><br><a href="#translation-didiosn" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/ConanXie" rel="ugc"><img src="https://avatars.githubusercontent.com/u/10040846?v=4?s=50" width="50px;" alt="xiejie"><br><sub><b>xiejie</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/issues?q=author%3AConanXie" title="Bug reports" rel="ugc">🐛</a></td> </tr> <tr> <td align="center" valign="top" width="14.28%"><a href="https://github.com/maxzod" rel="ugc"><img src="https://avatars.githubusercontent.com/u/47630729?v=4?s=50" width="50px;" alt="Ahmed Masoud "><br><sub><b>Ahmed Masoud </b></sub></a><br><a href="#translation-maxzod" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/luomo-pro" rel="ugc"><img src="https://avatars.githubusercontent.com/u/41097395?v=4?s=50" width="50px;" alt="luomo-pro"><br><sub><b>luomo-pro</b></sub></a><br><a href="#a11y-luomo-pro" title="Accessibility">️️️️♿️</a> <a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/issues?q=author%3Aluomo-pro" title="Bug reports" rel="ugc">🐛</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/paigupai" rel="ugc"><img src="https://avatars.githubusercontent.com/u/44311361?v=4?s=50" width="50px;" alt="paigupai"><br><sub><b>paigupai</b></sub></a><br><a href="#translation-paigupai" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/taqiabdulaziz" rel="ugc"><img src="https://avatars.githubusercontent.com/u/30410316?v=4?s=50" width="50px;" alt="Muhammad Taqi Abdul Aziz"><br><sub><b>Muhammad Taqi Abdul Aziz</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/commits?author=taqiabdulaziz" title="Documentation" rel="ugc">📖</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/hellohejinyu" rel="ugc"><img src="https://avatars.githubusercontent.com/u/8766034?v=4?s=50" width="50px;" alt="何锦余"><br><sub><b>何锦余</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/issues?q=author%3Ahellohejinyu" title="Bug reports" rel="ugc">🐛</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/leonpesdk" rel="ugc"><img src="https://avatars.githubusercontent.com/u/57394644?v=4?s=50" width="50px;" alt="Leon Dudlik"><br><sub><b>Leon Dudlik</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/issues?q=author%3Aleonpesdk" title="Bug reports" rel="ugc">🐛</a></td> <td align="center" valign="top" width="14.28%"><a href="https://www.legoffmael.fr" rel="ugc"><img src="https://avatars.githubusercontent.com/u/22376981?v=4?s=50" width="50px;" alt="Maël"><br><sub><b>Maël</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/commits?author=LeGoffMael" title="Code" rel="ugc">💻</a> <a href="#maintenance-LeGoffMael" title="Maintenance">🚧</a></td> </tr> <tr> <td align="center" valign="top" width="14.28%"><a href="https://github.com/dddrop" rel="ugc"><img src="https://avatars.githubusercontent.com/u/5361175?v=4?s=50" width="50px;" alt="dddrop"><br><sub><b>dddrop</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/commits?author=dddrop" title="Code" rel="ugc">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://www.linkedin.com/in/loinp" rel="ugc"><img src="https://avatars.githubusercontent.com/u/34020090?v=4?s=50" width="50px;" alt="Nguyen Phuc Loi"><br><sub><b>Nguyen Phuc Loi</b></sub></a><br><a href="#translation-nploi" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://sqlturk.wordpress.com/" rel="ugc"><img src="https://avatars.githubusercontent.com/u/12383547?v=4?s=50" width="50px;" alt="Cevheri"><br><sub><b>Cevheri</b></sub></a><br><a href="#translation-cevheri" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://velog.io/@hee_mm_" rel="ugc"><img src="https://avatars.githubusercontent.com/u/48482259?v=4?s=50" width="50px;" alt="mirimhee"><br><sub><b>mirimhee</b></sub></a><br><a href="#translation-LIMMIHEE" title="Translation">🌍</a></td> <td align="center" valign="top" width="14.28%"><a href="https://amoshk.top" rel="ugc"><img src="https://avatars.githubusercontent.com/u/32262985?v=4?s=50" width="50px;" alt="Amos"><br><sub><b>Amos</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/issues?q=author%3AAmosHuKe" title="Bug reports" rel="ugc">🐛</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/Dimilkalathiya" rel="ugc"><img src="https://avatars.githubusercontent.com/u/102401667?v=4?s=50" width="50px;" alt="Dimil Kalathiya"><br><sub><b>Dimil Kalathiya</b></sub></a><br><a href="https://github.com/fluttercandies/flutter_wechat_assets_picker/commits?author=Dimilkalathiya" title="Code" rel="ugc">💻</a></td> </tr> </tbody> </table> <!-- markdownlint-restore --> <!-- prettier-ignore-end --> <!-- ALL-CONTRIBUTORS-LIST:END --> <p>This project follows the <a href="https://github.com/all-contributors/all-contributors" rel="ugc">all-contributors</a> specification. Contributions of any kind welcomed!!</p> <h2 class="hash-header" id="credits">Credits <a href="#credits" class="hash-link">#</a></h2> <blockquote> <p>Every aspect of IntelliJ IDEA has been designed to maximize developer productivity. Together, intelligent coding assistance and ergonomic design make development not only productive but also enjoyable.</p> </blockquote> <p>Thanks to <a href="https://www.jetbrains.com/?from=fluttercandies" rel="ugc">JetBrains</a> for allocating free open-source licenses for IDEs such as <a href="https://www.jetbrains.com/idea/?from=fluttercandies" rel="ugc">IntelliJ IDEA</a>.</p> <p><a href="https://www.jetbrains.com/?from=fluttercandies" rel="ugc"><img src="https://github.com/fluttercandies/flutter_wechat_assets_picker/raw/main/.github/jetbrains-variant.png" width="200"></a></p> </section></div></div></div><aside class="detail-info-box"><a class="packages-scores" href="/packages/wechat_assets_picker/score"><div class="packages-score packages-score-like"><div class="packages-score-value -has-value"><span class="packages-score-value-number">764</span><span class="packages-score-value-sign"></span></div><div class="packages-score-label">likes</div></div><div class="packages-score packages-score-health"><div class="packages-score-value -has-value"><span class="packages-score-value-number">150</span><span class="packages-score-value-sign"></span></div><div class="packages-score-label">pub points</div></div><div class="packages-score packages-score-popularity"><div class="packages-score-value -has-value"><span class="packages-score-value-number">99</span><span class="packages-score-value-sign">%</span></div><div class="packages-score-label">popularity</div></div></a><div class="detail-screenshot-thumbnail"><div class="thumbnail-container" data-thumbnail="/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_1.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_2.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_3.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_4.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_5.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_6.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_7.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_8.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_9.webp" data-thumbnail-descriptions-json="["Screenshot 1","Screenshot 2","Screenshot 3","Screenshot 4","Screenshot 5","Screenshot 6","Screenshot 7","Screenshot 8","Screenshot 9"]" data-ga-click-event="screenshot-thumbnail-click"><img class="thumbnail-image" src="/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/190x190/README_1.webp" alt="screenshot" title="View screenshots" tabindex="0"/></div><img class="collections-icon" src="/static/hash-o6oemknr/img/collections_white_24dp.svg" alt="" width="30" height="30" role="presentation"/></div><h3 class="title">Publisher</h3><p><a href="/publishers/fluttercandies.com"><img class="-pub-publisher-shield filter-invert-on-dark" src="/static/hash-o6oemknr/img/material-icon-verified.svg" alt="verified publisher" width="14" height="14" title="Published by a pub.dev verified publisher"/>fluttercandies.com</a></p><h3 class="title pkg-infobox-metadata">Metadata</h3><p>An image picker (also with videos and audio) for Flutter projects based on WeChat's UI, with full support for customization. </p><p><a class="link" href="https://github.com/fluttercandies/flutter_wechat_assets_picker" rel="ugc">Repository (GitHub)</a><br/><a class="link" href="https://github.com/fluttercandies/flutter_wechat_assets_picker/issues" rel="ugc">View/report issues</a><br/></p><h3 class="title">Topics</h3><p><a href="/packages?q=topic%3Apicker" rel="nofollow">#picker</a> <a href="/packages?q=topic%3Aimage" rel="nofollow">#image</a> <a href="/packages?q=topic%3Aaudio" rel="nofollow">#audio</a> <a href="/packages?q=topic%3Avideo" rel="nofollow">#video</a> <a href="/packages?q=topic%3Awechat" rel="nofollow">#wechat</a></p><h3 class="title">Documentation</h3><p><a class="link" href="/documentation/wechat_assets_picker/latest/">API reference</a><br/></p><h3 class="title">License</h3><p><img class="inline-icon-img filter-invert-on-dark" src="/static/hash-o6oemknr/img/material-icon-balance.svg" alt="" width="14" height="14" role="presentation"/>Apache-2.0 (<a href="/packages/wechat_assets_picker/license">license</a>)</p><h3 class="title">Dependencies</h3><p><a href="/packages/extended_image" title=">=8.3.0 <10.0.0">extended_image</a>, <a href="https://api.flutter.dev/">flutter</a>, <a href="/packages/photo_manager" title="^3.5.0">photo_manager</a>, <a href="/packages/photo_manager_image_provider" title="^2.2.0">photo_manager_image_provider</a>, <a href="/packages/provider" title="^6.0.5">provider</a>, <a href="/packages/video_player" title="^2.7.0">video_player</a>, <a href="/packages/visibility_detector" title="^0.4.0">visibility_detector</a>, <a href="/packages/wechat_picker_library" title="^1.0.5">wechat_picker_library</a></p><h3 class="title">More</h3><p><a href="/packages?q=dependency%3Awechat_assets_picker" rel="nofollow">Packages that depend on wechat_assets_picker</a></p></aside></div><script type="application/ld+json">{"@context":"http\u003a\u002f\u002fschema.org","@type":"SoftwareSourceCode","name":"wechat\u005fassets\u005fpicker","version":"9.4.1","description":"wechat\u005fassets\u005fpicker - An image picker \u0028also with videos and audio\u0029\u000afor Flutter projects based on WeChat\u0027s UI,\u000awith full support for customization.\u000a","url":"https\u003a\u002f\u002fpub.dev\u002fpackages\u002fwechat\u005fassets\u005fpicker","dateCreated":"2020-04-03T15\u003a33\u003a58.456593Z","dateModified":"2024-11-21T15\u003a17\u003a19.843561Z","programmingLanguage":"Dart","image":"https\u003a\u002f\u002fpub.dev\u002fstatic\u002fimg\u002fpub-dev-icon-cover-image.png","license":"https\u003a\u002f\u002fpub.dev\u002fpackages\u002fwechat\u005fassets\u005fpicker\u002flicense"}</script></div><div class="detail-metadata"><h3 class="detail-metadata-title"><span class="detail-metadata-toggle">←</span> Metadata</h3><div class="detail-info-box"><a class="packages-scores" href="/packages/wechat_assets_picker/score"><div class="packages-score packages-score-like"><div class="packages-score-value -has-value"><span class="packages-score-value-number">764</span><span class="packages-score-value-sign"></span></div><div class="packages-score-label">likes</div></div><div class="packages-score packages-score-health"><div class="packages-score-value -has-value"><span class="packages-score-value-number">150</span><span class="packages-score-value-sign"></span></div><div class="packages-score-label">pub points</div></div><div class="packages-score packages-score-popularity"><div class="packages-score-value -has-value"><span class="packages-score-value-number">99</span><span class="packages-score-value-sign">%</span></div><div class="packages-score-label">popularity</div></div></a><div class="detail-screenshot-thumbnail"><div class="thumbnail-container" data-thumbnail="/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_1.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_2.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_3.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_4.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_5.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_6.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_7.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_8.webp,/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/README_9.webp" data-thumbnail-descriptions-json="["Screenshot 1","Screenshot 2","Screenshot 3","Screenshot 4","Screenshot 5","Screenshot 6","Screenshot 7","Screenshot 8","Screenshot 9"]" data-ga-click-event="screenshot-thumbnail-click"><img class="thumbnail-image" src="/packages/wechat_assets_picker/versions/9.4.1/gen-res/gen/190x190/README_1.webp" alt="screenshot" title="View screenshots" tabindex="0"/></div><img class="collections-icon" src="/static/hash-o6oemknr/img/collections_white_24dp.svg" alt="" width="30" height="30" role="presentation"/></div><h3 class="title">Publisher</h3><p><a href="/publishers/fluttercandies.com"><img class="-pub-publisher-shield filter-invert-on-dark" src="/static/hash-o6oemknr/img/material-icon-verified.svg" alt="verified publisher" width="14" height="14" title="Published by a pub.dev verified publisher"/>fluttercandies.com</a></p><h3 class="title pkg-infobox-metadata">Metadata</h3><p>An image picker (also with videos and audio) for Flutter projects based on WeChat's UI, with full support for customization. </p><p><a class="link" href="https://github.com/fluttercandies/flutter_wechat_assets_picker" rel="ugc">Repository (GitHub)</a><br/><a class="link" href="https://github.com/fluttercandies/flutter_wechat_assets_picker/issues" rel="ugc">View/report issues</a><br/></p><h3 class="title">Topics</h3><p><a href="/packages?q=topic%3Apicker" rel="nofollow">#picker</a> <a href="/packages?q=topic%3Aimage" rel="nofollow">#image</a> <a href="/packages?q=topic%3Aaudio" rel="nofollow">#audio</a> <a href="/packages?q=topic%3Avideo" rel="nofollow">#video</a> <a href="/packages?q=topic%3Awechat" rel="nofollow">#wechat</a></p><h3 class="title">Documentation</h3><p><a class="link" href="/documentation/wechat_assets_picker/latest/">API reference</a><br/></p><h3 class="title">License</h3><p><img class="inline-icon-img filter-invert-on-dark" src="/static/hash-o6oemknr/img/material-icon-balance.svg" alt="" width="14" height="14" role="presentation"/>Apache-2.0 (<a href="/packages/wechat_assets_picker/license">license</a>)</p><h3 class="title">Dependencies</h3><p><a href="/packages/extended_image" title=">=8.3.0 <10.0.0">extended_image</a>, <a href="https://api.flutter.dev/">flutter</a>, <a href="/packages/photo_manager" title="^3.5.0">photo_manager</a>, <a href="/packages/photo_manager_image_provider" title="^2.2.0">photo_manager_image_provider</a>, <a href="/packages/provider" title="^6.0.5">provider</a>, <a href="/packages/video_player" title="^2.7.0">video_player</a>, <a href="/packages/visibility_detector" title="^0.4.0">visibility_detector</a>, <a href="/packages/wechat_picker_library" title="^1.0.5">wechat_picker_library</a></p><h3 class="title">More</h3><p><a href="/packages?q=dependency%3Awechat_assets_picker" rel="nofollow">Packages that depend on wechat_assets_picker</a></p></div><p class="detail-lead-back"><a class="detail-metadata-toggle">Back</a></p></div><div id="-screenshot-carousel" class="carousel"><fab id="-carousel-prev" class="mdc-fab carousel-prev carousel-nav" data-mdc-auto-init="MDCRipple" title="Previous" data-ga-click-event="screenshot-carousel-prev-click" tabindex="0"><div class="mdc-fab__ripple"></div><img class="mdc-fab__icon" src="/static/hash-o6oemknr/img/keyboard_arrow_left.svg" alt="previous" width="24" height="24" aria-hidden="true"/></fab><div id="-image-container" class="image-container"></div><fab id="-carousel-next" class="mdc-fab carousel-next carousel-nav" data-mdc-auto-init="MDCRipple" title="Next" data-ga-click-event="screenshot-carousel-next-click" tabindex="0"><div class="mdc-fab__ripple"></div><img class="mdc-fab__icon" src="/static/hash-o6oemknr/img/keyboard_arrow_right.svg" alt="next" width="24" height="24" aria-hidden="true"/></fab><p id="-screenshot-description" class="screenshot-description"></p></div></main><footer class="site-footer"><a class="link" href="https://dart.dev/">Dart language</a><a class="link sep" href="/report?subject=package%3Awechat_assets_picker&url=https%3A%2F%2Fpub.dev%2Fpackages%2Fwechat_assets_picker">Report package</a><a class="link sep" href="/policy">Policy</a><a class="link sep" href="https://www.google.com/intl/en/policies/terms/">Terms</a><a class="link sep" href="https://developers.google.com/terms/">API Terms</a><a class="link sep" href="/security">Security</a><a class="link sep" href="https://www.google.com/intl/en/policies/privacy/">Privacy</a><a class="link sep" href="/help">Help</a><a class="link icon sep" href="/feed.atom"><img class="inline-icon" src="/static/hash-o6oemknr/img/rss-feed-icon.svg" alt="RSS" width="20" height="20" title="RSS/atom feed"/></a><a class="link icon github_issue" href="https://github.com/dart-lang/pub-dev/issues/new"><img class="inline-icon" src="/static/hash-o6oemknr/img/bug-report-white-96px.png" alt="bug report" width="20" height="20" title="Report an issue with this site"/></a></footer><script src="/static/hash-o6oemknr/highlight/highlight-with-init.js" defer="defer"></script></body></html>