言語:英語| 中文
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最新の安定したバージョンは次のとおりです。
最新の開発バージョンは次のとおりです。
次に、コードにパッケージをインポートします。
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 |
| ページサイズ | int? | ページごとの資産数。 gridCountの倍数である必要があります。 | 80 |
| gridthumbnailsize | ThumbnailSize | グリッドのアイテムのサムネイルサイズ。 | ThumbnailSize.square(200) |
| PathThumbnailsize | ThumbnailSize | パスセレクターのサムネイルサイズ。 | ThumbnailSize.square(80) |
| previewthumbnailsize | ThumbnailSize? | 視聴者のサムネイルサイズをプレビューします。 | null |
| requestType | RequestType | ピッカーのリクエストタイプ。 | RequestType.common |
| SpecialPickertype | SpecialPickerType? | カスタムピッカータイプを統合するオプションを提供します。 | null |
| KeepsCrolloffset | bool | ピッカーがプッシュとポップの間にスクロールオフセットを保存する必要があるかどうか。 | null |
| sortpathdelegate | SortPathDelegate<AssetPathEntity>? | PATHエンティティは、ピッカーの代表者をソートし、必要に応じてパスをソートします。 | CommonSortPathDelegate |
| sortpathsbyModifiedDate | bool | sort delegatesがFilterOptionGroup.containsPathModifiedを使用してパスをソートすることを許可するかどうか。 | false |
| フィルターオプション | PMFilter? | ユーザーがアセットフィルターオプションをカスタマイズできるようにします。 | null |
| GridCount | int | ピッカーのグリッドカウント。 | 4 |
| ThemeColor | Color? | ピッカーのメインテーマカラー。 | Color(0xff00bc56) |
| ピッカーテム | ThemeData? | ピッカーと視聴者のテーマデータプロバイダー。 | null |
| TextDelegate | AssetPickerTextDelegate? | テキストをカスタマイズするために、ピッカーのテキスト委任。 | AssetPickerTextDelegate() |
| 特殊なもの | SpecialItemPosition | ユーザーがピッカーに特別なアイテムをいくつかのポジションで設定できるようにします。 | SpecialItemPosition.none |
| SpecialItemBuilder | SpecialItemBuilder? | 特別なアイテムのウィジェットビルダー。 | null |
| LoadingIndicatorBuilder | IndicatorBuilder? | ビルダーの荷重ステータスを示します。 | null |
| SelectPredicate | AssetSelectPredicate | 資産を選択できるか、選択しないかを述べています。 | null |
| suldrevertgrid | bool? | アセットグリッドが戻るべきかどうか。 | null |
| LimitedPersisionSoverLayPredicate | LimitedPermissionOverlayPredicate? | 限られた許可オーバーレイを表示する必要があるかどうかを述べています。 | null |
| PathNameBuilder | PathNameBuilder<AssetPathEntity>? | 指定されたパスエンティティでカスタマイズされたパス(アルバム)名を構築します。 | null |
| AssetsChangecallback | AssetsChangeCallback<AssetPathEntity>? | システムが資産に通知したときに呼び出されるコールバック。 | null |
| AssetsChangereFreshPredicate | AssetsChangeRefreshPredicate<AssetPathEntity>? | 資産の変更は、指定された呼び出しと現在の選択されたパスでリフレッシュを呼び出す必要があります。 | null |
| suldautoplaypreview | bool | プレビューが自動再生されるべきかどうか。 | false |
maxAssets 1 (別名シングルピッキングモード)に等しい場合、 SpecialPickerType.noPreviewを使用すると、ユーザーがクリック(押した)アセットをすぐに選択してポップします。limitedPermissionOverlayPredicate live of sersipenceは、再起動後に限定的なプレビューを無視したい場合は、独自の保存方法と統合する必要があります。例にパッケージを使用して複数の一般的な使用法を掲載しました。両方とも、複数のピッキングモードとシングルピッキングモードでメソッドを提供する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>で独自のタイプを使用し、抽象的なメソッドを実装できます。
テーマ、ウィジェット、またはレイアウトを完全にカスタマイズする方法を知るため。例のカスタムピッカーページでデリゲートをカスタマイズする方法を参照してください。
PRSを送信して、実装が他の人に役立つ可能性があることがわかった場合、独自の実装を作成できます。詳細については、カスタム実装を紹介してください。
Recent他の人に) All Assetsのアルバムは実際のアルバムではなく、すべてのメディアデータレコードのみを表すため、 Recent AndroidのAll AssetsのAll Assetsの修正アルバム名です。
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],
);詳細については、photo_manager#from-raw-dataおよびphoto_manager#delete-entitiesを参照してください。
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 ? | マルセルシュナイダー ? ? | ganlanshu0211 ? ? | ジェイソンハズ ? | ヤニブは揺れた ? ? ? | avi-yadav |
レタラス ? ? | グレイマグ ? | Nickolay Savchenko ? | 聖清saigusa ? | 三闻书店 | ディディオスフースト ? | xiejie ? |
アーメド・マスウド ? | luomo-pro ピオンピア | パイグパイ ? | ムハンマド・タキ・アブドゥル・アジズ | 何锦余 ? | レオン・ダドリク ? | マエル ? |
dddrop | Nguyen Phuc Loi ? | セヴェリ ? | ミリムヒー ? | アモス ? | ディミル・カラティヤ | ガソル・ウー ? |
このプロジェクトは、全委員会の仕様に従います。あらゆる種類の貢献が歓迎されました!!
Intellijのアイデアのあらゆる側面は、開発者の生産性を最大化するように設計されています。一緒に、インテリジェントなコーディング支援と人間工学に基づいたデザインは、生産的だけでなく楽しい開発をもたらします。
Intellij IdeaなどのIDEに無料のオープンソースライセンスを割り当ててくれたJetBrainsに感謝します。
