언어 : 영어 | 中文
WeChat의 UI를 기반으로 한 플러터 프로젝트를위한 이미지 선택기 (비디오 및 오디오 포함) .
8.0.51 UI 디자인을 기반으로 한 UI의 현재 WeChat 버전은 언제든지 WeChat 업데이트에 따라 업데이트됩니다.
자산에 대한 사진이나 비디오를 찍으려면 예제의 자세한 사용법을 확인하고 wechat_camera_picker로 이동하십시오. 패키지는 조합으로 사용할 수있는 독립형 확장자입니다.
중단 변경 사이의 마이그레이션 방법을 배우려면 마이그레이션 가이드를 참조하십시오.
패키지는 안정적인 버전의 Flutter 에서만 작동하는 것을 보장합니다. 플러터의 다른 채널과 일치하기 위해 실시간으로 업데이트하지 않을 것입니다.
| 3.0 | 3.3 | 3.7 | 3.10 | 3.13 | 3.16 | |
|---|---|---|---|---|---|---|
| 8.9.0+ | ✅ | |||||
| 8.7.0+ | ✅ | |||||
| 8.5.0+ | ✅ | |||||
| 8.4.0+ | ✅ | |||||
| 8.0.0+ | ✅ | ✅ | ||||
| 7.3.0+ | ✅ | ✅ |
flutter pub get 실행할 때 resolve conflict 오류가 발생하면 dependency_overrides 사용하여 수정하십시오.
패키지는이 멋진 패키지로 제작되었습니다.
| 이름 | 특징 |
|---|---|
| photo_manager | 자산의 기본 추상화 및 관리. |
| extended_image | 예상되는 행동을 가진 자산을 미리 봅니다. |
| 공급자 | 피커의 상호 작용 상태를 관리하는 데 도움이됩니다. |
| video_player | 동영상과 오디오를 연주합니다. |
그들의 구현은 패키지에서 비교적 안정적이어야합니다. 피커를 사용할 때 관련 문제를 발견 한 경우 먼저 문제 추적기에 문제를 제출하십시오.
AssetEntity 업로드하십시오http 와 함께dio 와 함께Recent 다른 사람에게 최근)File 또는 Uint8List (rawData)에서 AssetEntity 생성ThemeData 기반으로 완전히 사용자 정의 할 수있는 테마entity.file 또는 AssetEntityImage 사용하십시오.| 이름 | 선술집 | github |
|---|---|---|
| insta_assets_picker |
![]() | ![]() | ![]() |
|---|---|---|
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
무엇이든 시작하기 전에 아래 통지를주의하십시오.
AssetEntityAssetPathEntity관련 API 및 동작에 대한 질문이 있으면 자세한 내용은 Photo_Manager의 API 문서를 확인하십시오.
대부분의 사용법은이 예제에 의해 상세하게 다루어집니다. 궁금한 점이 있으시기 전에 신중하게 예제를 살펴보십시오.
flutter pub add wechat_assets_picker 하거나 wechat_assets_picker pubspec.yaml 종속성에 수동으로 추가하십시오.
dependencies :
wechat_assets_picker : ^latest_version최신 안정 버전은 다음과 같습니다.
최신 DEV 버전은 다음과 같습니다.
그런 다음 코드에서 패키지를 가져옵니다.
import 'package:wechat_assets_picker/wechat_assets_picker.dart' ; 패키지를 사용하는 경우 targetSdkVersion 및 compileSdkVersion 33 으로 업그레이드하십시오. 그렇지 않으면 Android 13에서 자산을 가져올 수 없습니다.
| 이름 | 필수의 | 선언 | 최대 API 레벨 | 기타 |
|---|---|---|---|---|
READ_EXTERNAL_STORAGE | 예 | 예 | 32 | |
WRITE_EXTERNAL_STORAGE | 아니요 | 아니요 | 29 | |
ACCESS_MEDIA_LOCATION | 예* | 아니요 | N/A | exif를 읽을 때 필요합니다 |
READ_MEDIA_IMAGES | 예* | 예 | N/A | 이미지를 읽을 때 필요합니다 |
READ_MEDIA_VIDEO | 예* | 예 | N/A | 비디오를 읽을 때 필요합니다 |
READ_MEDIA_AUDIO | 예* | 예 | N/A | 오디오를 읽을 때 필요합니다 |
Android SDK 33+를 대상으로하고 사진, 비디오 또는 오디오를로드 할 필요가없는 경우 앱에서 관련 권한 만 선언하는 것을 고려하십시오.
< 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 >ios/Podfile 수정하고 그에 따라 업데이트하십시오. platform :ios, '11.0'
# 제목을 제거하십시오.Info.plist 에 다음 내용을 추가하십시오. <key>NSPhotoLibraryUsageDescription</key>
<string>Replace with your permission description.</string>
macos/Podfile 수정하고 그에 따라 업데이트하십시오. platform :osx , '10.15'# 제목을 제거하십시오.macos/Runner.xcworkspace 열십시오.Info.plist 수정하십시오. 자산을 선택할 때 패키지가 Locale? BuildContext 에서 현재 언어의 해당 텍스트 대의원을 반환하십시오. 위젯 트리에 BuildContext 에서 액세스 할 수있는 유효한 Locale 있는지 확인하십시오. 그렇지 않으면 기본 중국 대표가 사용됩니다.
임베디드 텍스트 대의원 언어는 다음과 같습니다.
사용자 정의/고정 텍스트 대의원을 사용하려면 AssetPickerConfig.textDelegate 를 통과하십시오.
final List < AssetEntity > ? result = await AssetPicker . pickAssets (context); 더 많은 선택 행동을 위해 AssetPickerConfig 사용하십시오.
final List < AssetEntity > ? result = await AssetPicker . pickAssets (
context,
pickerConfig : const AssetPickerConfig (),
); AssetPickerConfig 의 필드 :
| 이름 | 유형 | 설명 | 기본 |
|---|---|---|---|
| SELECTEDASSETS | List<AssetEntity>? | 선택된 자산. 중복 선택을 방지하십시오. | null |
| 최대체 세트 | int | 피커가 선택할 수있는 최대 자산. | 9 |
| Pagesize | int? | 페이지 당 자산 수. gridCount 의 배수 여야합니다 . | 80 |
| GridThumbnailsize | ThumbnailSize | 그리드 항목의 썸네일 크기. | ThumbnailSize.square(200) |
| PathThumbnailsize | ThumbnailSize | 경로 선택기의 썸네일 크기. | ThumbnailSize.square(80) |
| 미리보기 숫자 크기 | ThumbnailSize? | 시청자의 미리보기 네일 크기. | null |
| 요청 유형 | RequestType | 픽커의 요청 유형. | RequestType.common |
| SpecialPickerType | SpecialPickerType? | 사용자 정의 선택자 유형을 통합하는 옵션을 제공합니다. | null |
| KeepScrolloffset | bool | 피커가 푸시와 팝 사이에 스크롤 오프셋을 저장 해야하는지 여부. | null |
| SortPathDelegate | SortPathDelegate<AssetPathEntity>? | Path Entities는 피커의 대의원을 정렬하고 원하는대로 경로를 정렬하십시오. | CommonSortPathDelegate |
| SortPathsBymodifiedDate | bool | 정렬 대표자가 FilterOptionGroup.containsPathModified 사용하여 경로를 정렬 할 수 있는지 여부. | false |
| 여과 | PMFilter? | 사용자가 자산 필터 옵션을 사용자 정의 할 수 있습니다. | null |
| 그리드 카운트 | int | 피커의 그리드 수. | 4 |
| Themecolor | Color? | 피커의 주요 테마 색상. | Color(0xff00bc56) |
| 피커 테마 | ThemeData? | 피커 및 뷰어의 테마 데이터 제공자. | null |
| TextDelegate | AssetPickerTextDelegate? | 텍스트를 사용자 정의하려면 피커에 대한 텍스트 대의원입니다. | AssetPickerTextDelegate() |
| 특수 위치 | SpecialItemPosition | 사용자는 여러 위치로 선택한 피커에 특수 항목을 설정할 수 있습니다. | SpecialItemPosition.none |
| SpecialitemBuilder | SpecialItemBuilder? | 특수 항목의 위젯 빌더. | null |
| 로드 인디케이터 빌더 | IndicatorBuilder? | 빌더의 로딩 상태를 나타냅니다. | null |
| SelectPredicate | AssetSelectPredicate | 자산을 선택할 수 있는지 또는 선택하지 않은지 여부. | null |
| whistRevertgrid | bool? | 자산 그리드가 되돌아야하는지 여부. | null |
| LimitedPermissionOverLayPredicate | LimitedPermissionOverlayPredicate? | 제한된 권한 오버레이가 표시되어야하는지 여부를 아끼지 않습니다. | null |
| PathNameBuilder | PathNameBuilder<AssetPathEntity>? | 주어진 경로 엔티티와 함께 사용자 정의 경로 (앨범) 이름을 작성하십시오. | null |
| assetschangecallback | AssetsChangeCallback<AssetPathEntity>? | 시스템이 자산 변경을 알릴 때 호출되는 콜백. | null |
| assetschangerefreshpredicate | AssetsChangeRefreshPredicate<AssetPathEntity>? | 자산 변경이 주어진 통화 및 현재 선택된 경로로 새로 고침을 호출 해야하는지 여부. | null |
| whistAutoPlaypreview | bool | 미리보기가 자동 재생되어야하는지 여부. | false |
maxAssets 1 (일명 단일 피킹 모드)과 같으면 SpecialPickerType.noPreview 사용합니다 .NopReview는 즉시 사용자가 클릭 한 자산을 선택하고 팝업됩니다.limitedPermissionOverlayPredicate 지속성없이 생명을 유지합니다. 다시 시작한 후 제한된 미리보기를 무시하려면 자신의 저장 방법과 통합해야합니다. 우리는 예제에 패키지와 함께 여러 가지 일반적인 사용법을 넣었습니다. 여기와 여기에서 List<PickMethod> pickMethods 찾을 수 있습니다. 자산은 임시로 저장되어 페이지 아래에 표시됩니다.
AssetEntityImage 및 AssetEntityImageProvider 이미지 및 비디오 의 엄지 손가락 이미지와 이미지 의 원래 데이터를 표시 할 수 있습니다. 일반적인 Image 와 ImageProvider 처럼 사용하십시오.
AssetEntityImage (asset, isOriginal : false );또는:
Image (image : AssetEntityImageProvider (asset, isOriginal : false )); // Register callback.
AssetPicker . registerObserve ();
// Unregister callback.
AssetPicker . unregisterObserve ();AssetEntity 업로드하십시오 I/O 관련 방법으로 AssetEntity 업로드하는 방법에는 여러 가지가 있습니다. I/O 관련 방법은 성능 (일반적으로 시간과 기억)을 소비하며 자주 호출해서는 안됩니다.
http 와 함께 http 패키지 : https://pub.dev/packages/http
http 패키지는 MultipartFile 사용하여 요청시 파일을 처리합니다.
의사 코드 :
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;
}dio 와 함께 dio 패키지 : https://pub.dev/packages/dio
dio 패키지는 또한 MultipartFile 사용하여 요청시 파일을 처리합니다.
의사 코드 :
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;
} AssetPickerBuilderDelegate , AssetPickerViewerBuilderDelegate , AssetPickerProvider 및 AssetPickerViewerProvider 는 모두 노출되고 대체 가능합니다. 일반 유형 <A: Asset, P: Path> 로 자신의 유형을 확장하고 자신의 유형을 사용할 수 있습니다. 그런 다음 추상 메소드를 구현할 수 있습니다.
테마, 위젯 또는 레이아웃을 완전히 사용자 정의하는 방법에 대해 알 수 있습니다. 예제의 사용자 정의 선택자 페이지에서 대표를 사용자 정의하는 방법을 참조하십시오.
구현이 다른 구현에 유용하다고 생각되면 PR을 제출하여 자신의 구현을 만들 수 있습니다. 자세한 내용은 사용자 정의 구현을 참조하십시오.
Recent 다른 사람에게 최근) Recent All Assets의 앨범은 실제 앨범이 아니기 때문에 All Assets on Android의 수정 앨범 이름입니다. 모든 미디어 데이터 레코드 만 나타냅니다.
Android에서이를 해결하려면 pathNameBuilder 사용하십시오.
AssetPickerConfig (
pathNameBuilder : ( AssetPathEntity path) => switch (path) {
final p when p.isAll => '最近' ,
// You can apply similar conditions to other common paths.
_ => path.name,
},
) 다른 플랫폼 (iOS/MacOS)의 다른 앨범 또는 앨범은 구성된 시스템 현지화 및 지원되는 지역화를 따릅니다. pathNameBuilder 모든 앨범에 사용할 수 있습니다.
자세한 내용은 Photo_Manager#561을 참조하십시오.
File 또는 Uint8List (rawData)에서 AssetEntity 생성 이 패키지를 카메라 촬영 또는 관련 내용과 결합하려면 File 또는 Uint8List 객체로 AssetEntity 만드는 방법에 대한 솔루션이 있습니다.
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 주목 : 파일을 장치에 보관하지 않으려면 최대한 작업 File 사용하십시오. AssetEntity 삭제하면 시스템 팝업이 표시 될 수 있습니다.
final List < String > result = await PhotoManager .editor. deleteWithIds (
< String > [entity.id],
);자세한 내용은 raw-data 및 photo_manager#from-Raw-Data 및 Photo_Manager#를 참조하십시오.
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.
Glide 싱글 톤을 유지하고 인스턴스와 버전 간의 충돌을 방지하기 위해 주석이 필요하므로 사진 관리자는 Glide 사용하여 이미지 기능을 구현하지만 가져 오는 프로젝트는 자체 AppGlideModule 정의해야합니다. 구현은 Glide 생성 API 문서를 참조하십시오.
이 멋진 사람들 (이모티콘 키)에게 감사드립니다.
알렉스 리 ? ? ? ? Ø️킬킬킬 ?날? | Caijinglong ? | Marcel Schneider ? ? | ganlanshu0211 ? ? | Jasonhezz ? | Yaniv는 흔들 렸습니다 ? ? ? | avi-yadav |
레탈 루스 ? ? | Greymag ? | Nickolay Savchenko ? | Kosuke Saigusa ? | 三闻书店 | didiosfaust ? | Xiejie ? |
Ahmed Masoud ? | 루오모 프로 Ø️킬킬킬 ?날? | Paigupai ? | 무하마드 타키 압둘 아지즈 | 何锦余 ? | 레온 Dudlik ? | Maël ? |
dddrop | Nguyen Phuc Loi ? | Cevheri ? | 미림 ? | 아모스 ? | Dimil Kalathiya | 가스톨 우 ? |
이 프로젝트는 All-Contritors 사양을 따릅니다. 모든 종류의 기여를 환영합니다 !!
Intellij 아이디어의 모든 측면은 개발자 생산성을 극대화하도록 설계되었습니다. 지능형 코딩 지원과 인체 공학적 설계는 함께 생산적 일뿐 만 아니라 즐거운 개발을 만듭니다.
Intellij Idea와 같은 IDE에 대한 무료 오픈 소스 라이센스를 할당 한 JetBrains에게 감사드립니다.
