Bahasa: Bahasa Inggris | 中文
Pemilih gambar (juga dengan video dan audio) untuk proyek -proyek flutter berdasarkan UI WeChat.
Versi WeChat saat ini yang didasarkan UI: 8.0.51 Desain UI akan diperbarui setelah pembaruan WeChat kapan saja.
Untuk mengambil foto atau video untuk aset, silakan periksa penggunaan terperinci dalam contoh, dan kunjungi wechat_camera_picker. Paket ini adalah ekstensi mandiri yang dapat digunakan dengan kombinasi.
Lihat Panduan Migrasi untuk mempelajari cara bermigrasi di antara perubahan yang melanggar.
Paket hanya menjamin untuk mengerjakan versi stabil dari Flutter . Kami tidak akan memperbaruinya secara real-time untuk menyelaraskan dengan saluran flutter lainnya.
| 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+ | ✅ | ✅ |
Jika Anda mendapat kesalahan resolve conflict saat menjalankan flutter pub get , silakan gunakan dependency_overrides untuk memperbaikinya.
Paket ini dibangun dari paket -paket indah ini.
| Nama | Fitur |
|---|---|
| photo_manager | Abstraksi dasar dan manajemen untuk aset. |
| Extended_image | Pratinjau aset dengan perilaku yang diharapkan. |
| penyedia | Membantu mengelola keadaan interaksi pemetik. |
| Video_Player | Putar video dan audio secara bersamaan. |
Implementasinya harus relatif stabil dalam paket. Jika Anda telah menemukan masalah yang terkait dengan mereka saat menggunakan pemilih, kirimkan masalah ke pelacak masalah kami terlebih dahulu.
AssetEntity dengan data formulirhttpdioRecent Menjadi Orang Lain)AssetEntity dari File atau Uint8List (RawData)ThemeDataAssetEntityImage entity.file .| nama | pub | GitHub |
|---|---|---|
| insta_assets_picker |
![]() | ![]() | ![]() |
|---|---|---|
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
Waspadai pemberitahuan di bawah ini sebelum Anda memulai sesuatu:
AssetEntityAssetPathEntityKetika Anda memiliki pertanyaan tentang API dan perilaku terkait, periksa dokumen API Photo_Manager untuk lebih jelasnya.
Sebagian besar penggunaan dirinci dicakup oleh contoh. Silakan berjalan melalui contoh dengan cermat sebelum Anda memiliki pertanyaan.
Jalankan flutter pub add wechat_assets_picker , atau tambahkan wechat_assets_picker ke pubspec.yaml dependensi secara manual.
dependencies :
wechat_assets_picker : ^latest_versionVersi stabil terbaru adalah:
Versi dev terbaru adalah:
Kemudian impor paket dalam kode Anda:
import 'package:wechat_assets_picker/wechat_assets_picker.dart' ; Saat menggunakan paket, silakan tingkatkan targetSdkVersion dan compileSdkVersion ke 33 . Kalau tidak, tidak ada aset yang dapat diambil di Android 13.
| Nama | Diperlukan | Dinyatakan | Level API Max | Yang lain |
|---|---|---|---|---|
READ_EXTERNAL_STORAGE | YA | YA | 32 | |
WRITE_EXTERNAL_STORAGE | TIDAK | TIDAK | 29 | |
ACCESS_MEDIA_LOCATION | YA* | TIDAK | N/a | Diperlukan saat membaca exif |
READ_MEDIA_IMAGES | YA* | YA | N/a | Diperlukan saat membaca gambar |
READ_MEDIA_VIDEO | YA* | YA | N/a | Diperlukan saat membaca video |
READ_MEDIA_AUDIO | YA* | YA | N/a | Diperlukan saat membaca audios |
Jika Anda menargetkan Android SDK 33+, dan Anda tidak perlu memuat foto, video, atau audio, pertimbangkan hanya menyatakan izin yang relevan di aplikasi Anda, lebih khusus:
< 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 dan perbarui yang sesuai. platform :ios, '11.0'
# jika garis dimulai dengan itu.Info.plist . <key>NSPhotoLibraryUsageDescription</key>
<string>Replace with your permission description.</string>
macos/Podfile dan perbarui yang sesuai. platform :osx , '10.15'# jika garis dimulai dengan itu.macos/Runner.xcworkspace .Info.plist sesuai. Saat Anda memilih aset, paket akan mendapatkan Locale? Dari BuildContext Anda, dan kembalikan delegasi teks yang sesuai dari bahasa saat ini. Pastikan Anda memiliki Locale yang valid di pohon widget Anda yang dapat diakses dari BuildContext . Jika tidak, delegasi Cina default akan digunakan.
Bahasa Delegasi Teks Tertanam adalah:
Jika Anda ingin menggunakan delegasi teks khusus/tetap, berikan melalui AssetPickerConfig.textDelegate .
final List < AssetEntity > ? result = await AssetPicker . pickAssets (context); Gunakan AssetPickerConfig untuk lebih banyak perilaku memetik.
final List < AssetEntity > ? result = await AssetPicker . pickAssets (
context,
pickerConfig : const AssetPickerConfig (),
); Bidang di AssetPickerConfig :
| Nama | Jenis | Keterangan | Bawaan |
|---|---|---|---|
| SelectectedAssets | List<AssetEntity>? | Aset terpilih. Cegah seleksi duplikat. | null |
| Maxassets | int | Aset maksimum yang dapat dipilih pemilih. | 9 |
| Halaman | int? | Jumlah aset per halaman. Harus kelipatan gridCount . | 80 |
| gridthumbnailsize | ThumbnailSize | Ukuran thumbnail untuk barang grid. | ThumbnailSize.square(200) |
| PaththumbnailSize | ThumbnailSize | Ukuran thumbnail untuk pemilih jalur. | ThumbnailSize.square(80) |
| PreviewThumbnailSize | ThumbnailSize? | Pratinjau ukuran thumbnail di penampil. | null |
| requestType | RequestType | Jenis permintaan untuk pemetik. | RequestType.common |
| SpecialPickerType | SpecialPickerType? | Memberikan opsi untuk mengintegrasikan tipe pemetik khusus. | null |
| KeepsCrolloffset | bool | Apakah pemilih harus menyimpan gulungan gulir antara dorongan dan muncul. | null |
| sortpathdelegate | SortPathDelegate<AssetPathEntity>? | Path Entities mengurutkan delegasi untuk pemetik, mengurutkan jalur seperti yang Anda inginkan. | CommonSortPathDelegate |
| sortpathsbymodifiedDate | bool | Apakah akan mengizinkan delegasi sortir untuk mengurutkan jalur dengan FilterOptionGroup.containsPathModified . | false |
| filteropsi | PMFilter? | Izinkan pengguna untuk menyesuaikan opsi filter aset. | null |
| gridcount | int | Jumlah kisi di Picker. | 4 |
| THEMECOLOR | Color? | Warna tema utama untuk pemetik. | Color(0xff00bc56) |
| Pickertheme | ThemeData? | Penyedia data tema untuk pemilih dan penampil. | null |
| TextDelegate | AssetPickerTextDelegate? | Delegasi teks untuk pemetik, untuk menyesuaikan teks. | AssetPickerTextDelegate() |
| Posisi Khusus | SpecialItemPosition | Izinkan pengguna menetapkan item khusus di pemetik dengan beberapa posisi. | SpecialItemPosition.none |
| SpecialItembuilder | SpecialItemBuilder? | Pembuat widget untuk item khusus. | null |
| LoadingIndicatorBuilder | IndicatorBuilder? | Menunjukkan status pemuatan untuk pembangun. | null |
| SelectPredicate | AssetSelectPredicate | Predikat apakah suatu aset dapat dipilih atau tidak dipilih. | null |
| Haruskahrevertgrid | bool? | Apakah jaringan aset harus kembali. | null |
| LimitedPermisionoverLayPredicate | LimitedPermissionOverlayPredicate? | Predikat apakah overlay izin terbatas harus ditampilkan. | null |
| PathnameBuilder | PathNameBuilder<AssetPathEntity>? | Bangun nama (album) yang disesuaikan dengan entitas jalur yang diberikan. | null |
| AssetSchangeCallback | AssetsChangeCallback<AssetPathEntity>? | Panggilan balik yang akan dipanggil ketika sistem memberi tahu aset berubah. | null |
| AssetSchangerFreshPredicate | AssetsChangeRefreshPredicate<AssetPathEntity>? | Apakah perubahan aset harus memanggil refresh dengan panggilan yang diberikan dan jalur yang dipilih saat ini. | null |
| harus autoplaypreview | bool | Apakah pratinjau harus diputar secara otomatis. | false |
maxAssets sama dengan 1 (alias mode pengambilan tunggal), gunakan SpecialPickerType.noPreview akan segera memilih aset yang diklik (ditekan) oleh pengguna dan muncul.limitedPermissionOverlayPredicate Lives Tanpa Kegigihan, jika Anda ingin mengabaikan pratinjau terbatas setelah restart, Anda harus berintegrasi dengan metode penghematan Anda sendiri. Kami telah menempatkan beberapa penggunaan umum dengan paket dalam contoh. Anda berdua dapat menemukan List<PickMethod> pickMethods di sini dan di sini, yang menyediakan metode dalam beberapa mode pengambilan dan pengambilan tunggal. Aset akan disimpan sementara dan ditampilkan di bawah halaman.
AssetEntityImage dan AssetEntityImageProvider dapat menampilkan gambar ibu jari gambar & video , dan data asli gambar . Gunakan seperti Image umum dan ImageProvider .
AssetEntityImage (asset, isOriginal : false );Atau:
Image (image : AssetEntityImageProvider (asset, isOriginal : false )); // Register callback.
AssetPicker . registerObserve ();
// Unregister callback.
AssetPicker . unregisterObserve ();AssetEntity dengan data formulir Ada beberapa cara untuk mengunggah AssetEntity dengan metode terkait I/O. Perlu diketahui, metode terkait I/O akan mengkonsumsi kinerja (biasanya waktu dan memori), mereka tidak boleh sering dipanggil.
http Paket http : https://pub.dev/packages/http
Paket http menggunakan MultipartFile untuk menangani file dalam permintaan.
Kode Pseudo:
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 Paket dio : https://pub.dev/packages/dio
Paket dio juga menggunakan MultipartFile untuk menangani file dalam permintaan.
Kode Pseudo:
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 dan AssetPickerViewerProvider semuanya diekspos dan diterbangkan. Anda dapat memperpanjangnya dan menggunakan tipe Anda sendiri dengan tipe generik <A: Asset, P: Path> , lalu menerapkan metode abstrak.
Untuk mengetahui tentang cara menyesuaikan tema, widget, atau tata letak sepenuhnya. Lihat cara menyesuaikan delegasi di halaman Pickers Kustom dalam contoh.
Anda dapat mengirimkan PR untuk membuat implementasi Anda sendiri jika Anda menemukan implementasi Anda mungkin berguna bagi orang lain. Lihat Kontribusikan Implementasi Kustom Untuk detail lebih lanjut.
Recent Menjadi Orang Lain) Recent adalah nama album Fix untuk All Assets on Android karena album All Assets bukanlah album yang sebenarnya, itu hanya mewakili semua rekaman data media.
Untuk menyelesaikannya di Android, gunakan pathNameBuilder , misalnya:
AssetPickerConfig (
pathNameBuilder : ( AssetPathEntity path) => switch (path) {
final p when p.isAll => '最近' ,
// You can apply similar conditions to other common paths.
_ => path.name,
},
) Album atau album lain di platform lain (iOS/macOS) akan mengikuti lokalisasi sistem yang dikonfigurasi dan lokalisasi yang didukung. pathNameBuilder tersedia untuk semua album.
Lihat Photo_Manager#561 untuk lebih jelasnya.
AssetEntity dari File atau Uint8List (RawData) Untuk menggabungkan paket ini dengan pemotretan kamera atau sesuatu yang terkait, ada solusi tentang cara membuat AssetEntity dengan File atau objek 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 Perhatikan: Jika Anda tidak ingin menyimpan file di perangkat Anda, gunakan File untuk operasi sebanyak mungkin. Menghapus AssetEntity dapat menyebabkan popup sistem menunjukkan:
final List < String > result = await PhotoManager .editor. deleteWithIds (
< String > [entity.id],
);Lihat Photo_Manager#From-Raw-Data dan Photo_Manager#Delete-Entities untuk lebih detailnya.
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 membutuhkan anotasi untuk menjaga singleton, mencegah konflik antara instance dan versi, jadi sementara manajer foto menggunakan Glide untuk mengimplementasikan fitur gambar, proyek yang mengimpor ini harus menentukan AppGlideModule sendiri. Lihat Dokumen API yang dihasilkan Glide untuk implementasi.
Terima kasih banyak kepada orang -orang luar biasa ini (Kunci Emoji):
Alex li ? ? ? ? ️️ert♿️? | Caijinglong ? | Marcel Schneider ? ? | Ganlanshu0211 ? ? | Jasonhezz ? | Yaniv dikocok ? ? ? | Avi-yadav |
Letalus ? ? | Greymag ? | Nickolay Savchenko ? | Kosuke Saigusa ? | 三闻书店 | Didiosfaust ? | xiejie ? |
Ahmed Masoud ? | Luomo-Pro ️️ert♿️? | Paigupai ? | Muhammad Taqi Abdul Aziz | 何锦余 ? | Leon Dudlik ? | Maël ? |
dddrop | Nguyen Phuc Loi ? | Cevheri ? | Mirimhee ? | Amos ? | Dimil Kalathiya | Gasol Wu ? |
Proyek ini mengikuti spesifikasi semua-kontributor. Kontribusi apa pun disambut !!
Setiap aspek ide IntelliJ telah dirancang untuk memaksimalkan produktivitas pengembang. Bersama -sama, bantuan pengkodean cerdas dan desain ergonomis membuat pengembangan tidak hanya produktif tetapi juga menyenangkan.
Terima kasih kepada JetBrains untuk mengalokasikan lisensi sumber terbuka gratis untuk IDE seperti Intellij Idea.
