اللغة: الإنجليزية | 中文
منتقي الصور (أيضًا مع مقاطع فيديو و Audios) لمشاريع Flutter على أساس واجهة المستخدم في WeChat.
إصدار WeChat الحالي الذي سيتم تحديثه لتصميمات واجهة المستخدم على: 8.0.51 تصميمات واجهة المستخدم بعد تحديث 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+ | ✅ | ✅ |
إذا حصلت على خطأ resolve conflict عند تشغيل flutter pub get ، فيرجى استخدام dependency_overrides لإصلاحه.
تم تصميم الحزمة من هذه الحزم الرائعة.
| اسم | سمات |
|---|---|
| phot_manager | التجريدات الأساسية والإدارة للأصول. |
| extender_image | معاينة الأصول مع السلوكيات المتوقعة. |
| مزود | يساعد على إدارة حالة التفاعل للمنتقي. |
| video_player | يلعب مقاطع الفيديو و Audios في المقابل. |
يجب أن يكون تنفيذها مستقرًا نسبيًا في الحزمة. إذا وجدت أي مشكلات تتعلق بها عند استخدام المنتقي ، فأرسل مشكلات إلى متتبع القضية أولاً.
AssetEntity ببيانات النموذجhttpdioRecent للآخرين)AssetEntity من File أو Uint8List (RawData)ThemeDataentity.file AssetEntityImage| اسم | حانة | جيثب |
|---|---|---|
| insta_assets_picker |
![]() | ![]() | ![]() |
|---|---|---|
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
كن على علم بالإشعارات أدناه قبل أن تبدأ أي شيء:
AssetEntityAssetPathEntityعندما يكون لديك أسئلة حول واجهات برمجة التطبيقات والسلوكيات ذات الصلة ، تحقق من مستندات واجهة برمجة تطبيقات Photo_manager لمزيد من التفاصيل.
يتم تفصيل معظم الاستخدامات من قبل المثال. يرجى المشي من خلال المثال بعناية قبل أن يكون لديك أي أسئلة.
قم بتشغيل 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 | نعم* | لا | ن/أ | مطلوب عند قراءة EXIF |
READ_MEDIA_IMAGES | نعم* | نعم | ن/أ | مطلوب عند قراءة الصور |
READ_MEDIA_VIDEO | نعم* | نعم | ن/أ | مطلوب عند قراءة مقاطع الفيديو |
READ_MEDIA_AUDIO | نعم* | نعم | ن/أ | مطلوب عند قراءة Audios |
إذا كنت تستهدف 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 الخاص بك ، وإرجاع مندوب النص المقابل للغة الحالية. تأكد من أن لديك Locale صالحة في شجرة القطعة الخاصة بك يمكن الوصول إليها من BuildContext . خلاف ذلك ، سيتم استخدام المندوب الصيني الافتراضي.
لغات المندوبين النصوص المدمجة هي:
إذا كنت ترغب في استخدام مندوب نص مخصص/ثابت ، فقم بتمريره عبر AssetPickerConfig.textDelegate .
final List < AssetEntity > ? result = await AssetPicker . pickAssets (context); استخدم AssetPickerConfig لمزيد من سلوكيات الاختيار.
final List < AssetEntity > ? result = await AssetPicker . pickAssets (
context,
pickerConfig : const AssetPickerConfig (),
); الحقول في AssetPickerConfig :
| اسم | يكتب | وصف | تقصير |
|---|---|---|---|
| المختارة | List<AssetEntity>? | الأصول المختارة. منع الاختيار المكررة. | null |
| Maxassets | int | الحد الأقصى للأصول التي يمكن للمنتقة اختيارها. | 9 |
| pagesize | int? | عدد الأصول لكل صفحة. يجب أن يكون مضاعف gridCount . | 80 |
| Gridthumbnailsize | ThumbnailSize | حجم الصورة المصغرة لعنصر الشبكة. | ThumbnailSize.square(200) |
| paththumbnailsize | ThumbnailSize | حجم الصورة المصغرة لمحدد المسار. | ThumbnailSize.square(80) |
| المعاينة | ThumbnailSize? | معاينة حجم الصورة المصغرة في المشاهد. | null |
| requesttype | RequestType | نوع طلب للمنتقي. | RequestType.common |
| SpecialPickerType | SpecialPickerType? | يوفر خيار دمج نوع منتقي مخصص. | null |
| keepscrolloffset | bool | ما إذا كان ينبغي على المنتقي حفظ إزاحة التمرير بين الدفعات والملوثات العضوية الثابتة. | null |
| sortpathdelegate | SortPathDelegate<AssetPathEntity>? | كيانات المسار فرز مندوب للمنتقي ، وفرز المسارات كما تريد. | CommonSortPathDelegate |
| sortpathsbymodifiedDate | bool | سواء للسماح للمندوبين الفرز بفرز المسارات باستخدام FilterOptionGroup.containsPathModified . | false |
| مرشحات | PMFilter? | السماح للمستخدمين بتخصيص خيارات تصفية الأصول. | null |
| GridCount | int | عدد الشبكة في منتقي. | 4 |
| ثيميكولور | Color? | لون الموضوع الرئيسي للمنتقي. | Color(0xff00bc56) |
| PickerTheme | ThemeData? | مزود بيانات الموضوع للمنتقي والمشاهد. | null |
| TextDelegate | AssetPickerTextDelegate? | مندوب نص للمنتقي ، لتخصيص النصوص. | AssetPickerTextDelegate() |
| التخصص | SpecialItemPosition | السماح للمستخدمين بتعيين عنصر خاص في منتقي مع عدة مواقف. | SpecialItemPosition.none |
| SpecialItemBuilder | SpecialItemBuilder? | منشئ القطعة للعنصر الخاص. | null |
| loadingIndicatorBuilder | IndicatorBuilder? | يشير إلى حالة التحميل للبناء. | null |
| Selectpredicate | AssetSelectPredicate | مسند ما إذا كان يمكن اختيار الأصل أو غير محدد. | null |
| يجب أن تكونريفرغريد | bool? | ما إذا كانت شبكة الأصول يجب أن تعود. | null |
| LimitedPermissionoverlaypredicate | LimitedPermissionOverlayPredicate? | مسند ما إذا كان ينبغي عرض تراكب الإذن المحدود. | null |
| PathNameBuilder | PathNameBuilder<AssetPathEntity>? | بناء اسم مسار مخصص (ألبوم) مع كيان المسار المحدد. | null |
| AssetSchangeCallback | AssetsChangeCallback<AssetPathEntity>? | رد الاتصال الذي سيتم استدعاؤه عندما يخطر النظام تغييرات الأصول. | null |
| AssetSchangerefreshpredicate | AssetsChangeRefreshPredicate<AssetPathEntity>? | ما إذا كان يجب تغيير الأصول على التحديث باستخدام المكالمة المحددة والمسار المحدد الحالي. | null |
| لا | bool | ما إذا كانت المعاينة يجب أن تلعب تلقائيًا. | false |
maxAssets 1 (AKA One Picking Mode) ، فإن استخدام SpecialPickerType.noPreview سيختار على الفور النقر فوق الأصول (الضغط) من قبل المستخدم وبرزت.limitedPermissionOverlayPredicate Lives دون ثبات ، إذا كنت ترغب في تجاهل المعاينة المحدودة بعد إعادة التشغيل ، فستحتاج إلى الاندماج مع أساليب الادخار الخاصة بك. لقد وضعنا استخدامًا شائعًا متعددة مع الحزم في المثال. يمكنك العثور على 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 ببيانات النموذج هناك طرق متعددة لتحميل AssetEntity مع الأساليب المتعلقة بالإدخال/الإخراج. كن على دراية ، سوف تستهلك الطرق المتعلقة بالإدخال/الإخراج الأداء (عادةً الوقت والذاكرة) ، لا ينبغي استدعاؤها بشكل متكرر.
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 للآخرين) Recent هو اسم الألبوم Fix لجميع الأصول على Android نظرًا لأن ألبوم 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 لمزيد من التفاصيل.
AssetEntity من File أو Uint8List (RawData) من أجل الجمع بين هذه الحزمة مع تصوير الكاميرا أو شيء مرتبط ، هناك حل حول كيفية إنشاء AssetEntity مع File أو كائن Uint8List .
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#من Raw-Data و Photo_manager#Delete-Enterities لمزيد من التفاصيل.
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 إلى التعليق التوضيحي للحفاظ على Singleton ، ومنع الصراع بين الحالات والإصدارات ، لذلك بينما يستخدم Manager Photo Glide لتنفيذ ميزات الصور ، فإن المشروع الذي يجب أن يحدد هذا AppGlideModule . انظر Glide التي تم إنشاؤها مستندات API للتنفيذ.
شكرا جزيلا لهؤلاء الأشخاص الرائعين (مفتاح الرموز التعبيرية):
أليكس لي ؟ ؟ ؟ ؟ ️؟ | Caijinglong ؟ | مارسيل شنايدر ؟ ؟ | Ganlanshu0211 ؟ ؟ | جيسونهز ؟ | يانيف هز ؟ ؟ ؟ | أفي ياداف |
ليتيالوس ؟ ؟ | Greymag ؟ | نيكولاي سافشينكو ؟ | Kosuke Saigusa ؟ | 三闻书店 | ديديوسفوست ؟ | xiejie ؟ |
أحمد مسعود ؟ | لومو برو ️؟ | بيجوباي ؟ | محمد عبد العزيز | 何锦余 ؟ | ليون دودليك ؟ | مايل ؟ |
DDDROP | نغوين فوك لوي ؟ | Cevheri ؟ | مريمهي ؟ | عاموس ؟ | سقوط كالاثيا | جاسول وو ؟ |
يتبع هذا المشروع مواصفات جميع المساهمين. مساهمات من أي نوع رحبت !!
تم تصميم كل جانب من جوانب Intellij Idea لزيادة إنتاجية المطورين إلى الحد الأقصى. معا ، فإن مساعدة الترميز الذكية والتصميم المريح تجعل التنمية غير منتجة فحسب ، بل ممتعة أيضًا.
بفضل JetBrains لتخصيص تراخيص مجانية مفتوحة المصدر للمعاصفات مثل IDENTER IDEA.
