Sprache: Englisch | 中文
Ein Image -Picker (auch mit Videos und Audios) für Flutter -Projekte basierend auf der Benutzeroberfläche des WeChats.
Aktuelle WeChat -Version, die die Benutzeroberfläche basiert: 8.0.51 UI -Designs werden nach dem WeChat -Update jederzeit aktualisiert.
Um ein Foto oder ein Video für Vermögenswerte aufzunehmen, überprüfen Sie bitte die detaillierte Verwendung im Beispiel und besuchen Sie wechat_camera_picker. Das Paket ist eine eigenständige Erweiterung, die mit Kombination verwendet werden kann.
Weitere Informationen finden Sie im Migrationshandbuch, um zu erfahren, wie Sie zwischen den Veränderungen wandern können.
Das Paket garantiert nur an der stabilen Version von Flutter . Wir werden es nicht in Echtzeit aktualisieren, um uns mit anderen Flatternkanälen auszurichten.
| 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+ | ✅ | ✅ |
Wenn Sie beim Ausführen von flutter pub get einen resolve conflict erhalten haben, verwenden Sie bitte dependency_overrides , um diese zu beheben.
Das Paket ist aus diesen wunderbaren Paketen erstellt.
| Name | Merkmale |
|---|---|
| Photo_Manager | Die grundlegenden Abstraktionen und das Management für Vermögenswerte. |
| Extended_image | Vorschau von Vermögenswerten mit erwarteten Verhaltensweisen. |
| Anbieter | Hilft bei der Verwaltung des Interaktionszustands des Pickers. |
| Video_player | Spielt Videos und Audios entsprechend. |
Ihre Implementierung sollte im Paket relativ stabil sein. Wenn Sie bei der Verwendung des Pickers Probleme im Zusammenhang mit ihnen gefunden haben, senden Sie zuerst Probleme an unseren Ausgaberfolg.
AssetEntity mit einem Formulardaten hochhttpdioRecent auf andere)AssetEntity aus File oder Uint8List (Rawdata)ThemeDataentity.file oder AssetEntityImage für sie bei Anzeigen.| Name | Pub | Github |
|---|---|---|
| insta_assets_picker |
![]() | ![]() | ![]() |
|---|---|---|
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
Beachten Sie die folgenden Hinweise, bevor Sie etwas gestartet haben:
AssetEntityAssetPathEntityWenn Sie Fragen zu verwandten APIs und Verhaltensweisen haben, überprüfen Sie die API -Dokumente von Photo_Manager für weitere Informationen.
Die meisten Verwendungen werden vom Beispiel detailliert beschrieben. Bitte gehen Sie sorgfältig durch das Beispiel, bevor Sie Fragen haben.
Fügen Sie flutter pub add wechat_assets_picker oder fügen Sie wechat_assets_picker zu pubspec.yaml -Abhängigkeiten manuell hinzu.
dependencies :
wechat_assets_picker : ^latest_versionDie neueste stabile Version ist:
Die neueste Entwicklerversion ist:
Importieren Sie dann das Paket in Ihren Code:
import 'package:wechat_assets_picker/wechat_assets_picker.dart' ; Bei Verwendung des Pakets upgrade targetSdkVersion und compileSdkVersion auf 33 ein. Andernfalls können kein Vermögen auf Android 13 abgerufen werden.
| Name | Erforderlich | Erklärt | Max -API -Ebene | Andere |
|---|---|---|---|---|
READ_EXTERNAL_STORAGE | JA | JA | 32 | |
WRITE_EXTERNAL_STORAGE | NEIN | NEIN | 29 | |
ACCESS_MEDIA_LOCATION | JA* | NEIN | N / A | Erforderlich beim Lesen exif |
READ_MEDIA_IMAGES | JA* | JA | N / A | Erforderlich beim Lesen von Bildern |
READ_MEDIA_VIDEO | JA* | JA | N / A | Erforderlich beim Lesen von Videos |
READ_MEDIA_AUDIO | JA* | JA | N / A | Erforderlich beim Lesen von Audios |
Wenn Sie auf Android SDK 33+ abzielen und keine Fotos, Videos oder Audios laden müssen, sollten Sie sich genauer gesagt nur für die relevante Berechtigung in Ihren Apps deklarieren:
< 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 und aktualisieren Sie entsprechend. platform :ios, '11.0'
# Überschrift, wenn die Linie damit beginnt.Info.plist hinzu. <key>NSPhotoLibraryUsageDescription</key>
<string>Replace with your permission description.</string>
macos/Podfile und aktualisieren Sie entsprechend. platform :osx , '10.15'# Überschrift, wenn die Linie damit beginnt.macos/Runner.xcworkspace zu öffnen.Info.plist entsprechend. Wenn Sie Vermögenswerte auswählen, erhält das Paket das Locale? Aus Ihrem BuildContext und dem entsprechenden Textdelegierter der aktuellen Sprache zurückgeben. Stellen Sie sicher, dass Sie ein gültiges Locale in Ihrem Widget -Baum haben, auf das aus dem BuildContext zugegriffen werden kann. Andernfalls wird der standardmäßige chinesische Delegierte verwendet.
Eingebettete Textdelegierte Sprachen sind:
Wenn Sie einen benutzerdefinierten/festen Textdelegierter verwenden möchten, gehen Sie ihn durch die AssetPickerConfig.textDelegate .
final List < AssetEntity > ? result = await AssetPicker . pickAssets (context); Verwenden Sie AssetPickerConfig für mehr Auswahlverhalten.
final List < AssetEntity > ? result = await AssetPicker . pickAssets (
context,
pickerConfig : const AssetPickerConfig (),
); Felder in AssetPickerConfig :
| Name | Typ | Beschreibung | Standard |
|---|---|---|---|
| SelectedAssets | List<AssetEntity>? | Ausgewählte Vermögenswerte. Verhindern Sie die doppelte Auswahl. | null |
| Maxassets | int | Maximaler Vermögenswert, den der Picker auswählen kann. | 9 |
| pagesze | int? | Anzahl der Vermögenswerte pro Seite. Muss ein Vielfaches von gridCount sein . | 80 |
| GridThumbnailsize | ThumbnailSize | Miniaturgröße für den Raster -Artikel. | ThumbnailSize.square(200) |
| PathThumbnailsize | ThumbnailSize | Miniaturgröße für den Pfadauswahl. | ThumbnailSize.square(80) |
| PreviewThumbnailSize | ThumbnailSize? | Vorschau der Miniaturansicht im Betrachter. | null |
| RequestType | RequestType | Anforderungsart für Picker. | RequestType.common |
| SpecialPickertype | SpecialPickerType? | Bietet die Möglichkeit, einen benutzerdefinierten Picker -Typ zu integrieren. | null |
| KeepScrollOffset | bool | Ob der Auswahler den Scroll -Offset zwischen Pushes und Pops speichern sollte. | null |
| SortPathDelegate | SortPathDelegate<AssetPathEntity>? | Path -Entitäten sortieren Delegierter für den Picker und sortieren Sie die Pfade, wie Sie möchten. | CommonSortPathDelegate |
| SortPathsByModifiedDate | bool | Ob Sortierdelegierte es ermöglichen, Pfade mit FilterOptionGroup.containsPathModified zu sortieren. | false |
| Filteroptionen | PMFilter? | Ermöglichen Sie den Benutzern das Anpassen von Assets -Filteroptionen. | null |
| Gridcount | int | Gitterzahl in Picker. | 4 |
| Themecolor | Color? | Hauptthema -Farbe für den Auswahl. | Color(0xff00bc56) |
| Pickertheme | ThemeData? | Themendatenanbieter für den Picker und den Betrachter. | null |
| Textdelegate | AssetPickerTextDelegate? | Textdelegierter für den Picker, um die Texte anzupassen. | AssetPickerTextDelegate() |
| Specialitemposition | SpecialItemPosition | Ermöglichen Sie den Benutzern ein spezielles Element im Picker mit mehreren Positionen. | SpecialItemPosition.none |
| Specialitembuilder | SpecialItemBuilder? | Der Widget Builder für den speziellen Artikel. | null |
| LoadingindicatorBuilder | IndicatorBuilder? | Zeigt den Ladestatus für den Baumeister an. | null |
| selectPredicate | AssetSelectPredicate | Prädikat, ob ein Vermögenswert ausgewählt oder nicht ausgewählt werden kann. | null |
| SolltevertGrid | bool? | Ob das Vermögensraster zurückkehren sollte. | null |
| LimitedpermissionOverlayPredicate | LimitedPermissionOverlayPredicate? | Prädikat, ob die begrenzte Berechtigungsüberlagerung angezeigt werden sollte. | null |
| Pathnamebuilder | PathNameBuilder<AssetPathEntity>? | Bauen Sie den Namen Customized Path (Album) mit der angegebenen Pfadentität. | null |
| AssetSchangeCallback | AssetsChangeCallback<AssetPathEntity>? | Der Rückruf, der aufgerufen wird, wenn das System Vermögensänderungen benachrichtigt. | null |
| AssetSchangeReFreshpredicate | AssetsChangeRefreshPredicate<AssetPathEntity>? | Ob sich die Änderungen ändern sollten, sollte die Aktualisierung mit dem angegebenen Anruf und dem aktuellen ausgewählten Pfad aufrufen. | null |
| SUTAUTOPLAYPREVIEW | bool | Ob die Vorschau automatisch spielen sollte. | false |
maxAssets 1 (auch bekannt als einzelne Picking -Modus) entspricht, verwenden Sie SpecialPickerType.noPreview werden vom Benutzer sofort auf Asset -Klick (gedrückt) ausgewählt und geplagt.limitedPermissionOverlayPredicate Lives Ohne Beharrlichkeit, wenn Sie die begrenzte Vorschau nach dem Neustart ignorieren möchten, müssen Sie sich in Ihre eigenen Rettungsmethoden integrieren. Wir haben in dem Beispiel mehrere gemeinsame Verwendung mit den Paketen eingesetzt. Hier und hier können Sie beide List<PickMethod> pickMethods finden, die Methoden im mehrfachen Picking- und Single -Picking -Modus bereitstellen. Vermögenswerte werden vorübergehend gespeichert und unten auf der Seite angezeigt.
Das AssetEntityImage und AssetEntityImageProvider können das Daumenbild von Bildern und Videos und die Originaldaten des Bildes anzeigen. Verwenden Sie es wie ein gemeinsames Image und ImageProvider .
AssetEntityImage (asset, isOriginal : false );Oder:
Image (image : AssetEntityImageProvider (asset, isOriginal : false )); // Register callback.
AssetPicker . registerObserve ();
// Unregister callback.
AssetPicker . unregisterObserve ();AssetEntity mit einem Formulardaten hoch Es gibt mehrere Möglichkeiten, eine AssetEntity mit mit E/A -verwandten Methoden hochzuladen. Beachten Sie, dass mit E/A -verwandte Methoden die Leistung verbrauchen (normalerweise Zeit und Speicher), sie sollten nicht häufig aufgerufen werden.
http http -Paket: https://pub.dev/packages/http
Das http -Paket verwendet MultipartFile , um Dateien in Anforderungen zu verarbeiten.
Pseudocode:
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 -Paket: https://pub.dev/packages/dio
Das dio -Paket verwendet auch MultipartFile , um Dateien in Anforderungen zu verarbeiten.
Pseudocode:
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 und AssetPickerViewerProvider sind alle freigelegt und überschrieben. Sie können sie erweitern und Ihren eigenen Typ mit generischen Typ <A: Asset, P: Path> verwenden und dann abstrakte Methoden implementieren.
Um zu wissen, wie Sie Themen, Widgets oder Layouts vollständig anpassen können. Sehen Sie, wie Sie die Delegierten auf der Seite Custom Pickers im Beispiel anpassen.
Sie können PRS einreichen, um eine eigene Implementierung zu erstellen, wenn Sie festgestellt haben, dass Ihre Implementierung für andere nützlich ist. Weitere Informationen finden Sie unter Berechtigte Implementierungen.
Recent auf andere) Recent ist der Namen des Fixalbums für die All Assets on Android, da das All Assets 'Album kein aktuelles Album ist, sondern nur alle Mediendatensätze darstellt.
Um dies auf Android zu lösen, verwenden Sie beispielsweise pathNameBuilder :
AssetPickerConfig (
pathNameBuilder : ( AssetPathEntity path) => switch (path) {
final p when p.isAll => '最近' ,
// You can apply similar conditions to other common paths.
_ => path.name,
},
) Andere Alben oder Alben auf anderen Plattformen (iOS/macOS) folgen der konfigurierten Systemlokalisierung und unterstützten Lokalisierungen. pathNameBuilder ist für alle Alben erhältlich.
Weitere Informationen finden Sie unter photo_manager#561.
AssetEntity aus File oder Uint8List (Rawdata) Um dieses Paket mit Kameraaufnahmen oder etwas zu kombinieren, gibt es eine Lösung, wie Sie eine AssetEntity mit File oder Uint8List -Objekt erstellen können.
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 Hinweis: Wenn Sie die Datei nicht in Ihrem Gerät aufbewahren möchten, verwenden Sie File für den Vorgang so weit wie möglich. Durch das Löschen einer AssetEntity kann Systempopups angezeigt werden:
final List < String > result = await PhotoManager .editor. deleteWithIds (
< String > [entity.id],
);Weitere Informationen finden Sie unter Photo_Manager#From-Raw-Data und Photo_Manager#Delete-entlar.
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 braucht Annotation, um Singleton zu halten, Konflikte zwischen Instanzen und Versionen zu verhindern. Während der Fotomanager Glide verwendet, um Bildfunktionen zu implementieren, sollte das Projekt, das dies importiert, seine eigene AppGlideModule definieren. Siehe SLIDE -erzeugte API -Dokumente zur Implementierung.
Vielen Dank an diese wunderbaren Menschen (Emoji -Schlüssel):
Alex Li ? ? ? ? ️️Echen? | Caijinglong ? | Marcel Schneider ? ? | Ganlanshu0211 ? ? | Jasonhezz ? | Yaniv schotte sich ? ? ? | avi-yadav |
Letalus ? ? | Greymag ? | Nickolay Savchenko ? | Kosuke Saigusa ? | 三闻书店 | Didiosfaust ? | Xiejie ? |
Ahmed Masoud ? | Luomo-pro ️️Echen? | Paigupai ? | Muhammad Taqi Abdul Aziz | 何锦余 ? | Leon Dudlik ? | Maël ? |
dddrop | Nguyen Phuc loi ? | Cevheri ? | Mirimhee ? | Amos ? | Dimil Kalathiya | Benzin Wu ? |
Dieses Projekt folgt der All-Contributors-Spezifikation. Beiträge jeglicher Art willkommen !!
Jeder Aspekt der Intellij -Idee wurde entwickelt, um die Produktivität der Entwickler zu maximieren. Intelligente Codierungshilfe und ergonomisches Design machen die Entwicklung nicht nur produktiv, sondern auch angenehm.
Vielen Dank an JetBrains für die Zuweisung von kostenlosen Open-Source-Lizenzen für IDES wie Intellij IDEE.
