Idioma: inglês | 中文
Um seletor de imagens (também com vídeos e áudios) para projetos de vibração com base na interface do usuário do WeChat.
Versão atual do WeChat que a interface do usuário baseada em: 8.0.51 Designs da interface do usuário serão atualizados após a atualização do WeChat a qualquer momento.
Para tirar uma foto ou um vídeo para ativos, verifique o uso detalhado no exemplo e acesse wechat_camera_picker. O pacote é uma extensão independente que pode ser usada com combinação.
Consulte o Guia de Migração para aprender a migrar entre as mudanças de quebra.
O pacote garante apenas trabalhar na versão estável do Flutter . Não o atualizamos em tempo real para alinhar com outros canais de vibração.
| 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+ | ✅ | ✅ |
Se você obteve um erro resolve conflict ao executar flutter pub get , use dependency_overrides para corrigi -lo.
O pacote é construído a partir desses pacotes maravilhosos.
| Nome | Características |
|---|---|
| foto_manager | As abstrações básicas e gerenciamento de ativos. |
| Extended_image | Visualizar ativos com comportamentos esperados. |
| provedor | Ajuda a gerenciar o estado de interação do seletor. |
| video_player | Reproduz vídeos e áudios correspondentemente. |
Sua implementação deve ser relativamente estável no pacote. Se você encontrou algum problema relacionado a eles ao usar o seletor, envie os problemas ao nosso rastreador de problemas primeiro.
AssetEntity com dados de formuláriohttpdioRecent para outros)AssetEntity a partir File ou Uint8List (RawData)ThemeDataentity.file ou AssetEntityImage para eles quando exibem.| nome | pub | Github |
|---|---|---|
| insta_assets_picker |
![]() | ![]() | ![]() |
|---|---|---|
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
Esteja ciente dos avisos abaixo antes de começar qualquer coisa:
AssetEntityAssetPathEntityQuando você tiver dúvidas sobre APIs e comportamentos relacionados, verifique os documentos da API do Photo_Manager para obter mais detalhes.
A maioria dos usos é detalhada coberta pelo exemplo. Por favor, passe pelo exemplo cuidadosamente antes de ter alguma dúvida.
Run flutter pub add wechat_assets_picker , ou Adicione wechat_assets_picker às dependências pubspec.yaml manualmente.
dependencies :
wechat_assets_picker : ^latest_versionA última versão estável é:
A versão mais recente do dev é:
Em seguida, importe o pacote em seu código:
import 'package:wechat_assets_picker/wechat_assets_picker.dart' ; Ao usar o pacote, atualize targetSdkVersion e compileSdkVersion para 33 . Caso contrário, nenhum ativo pode ser buscado no Android 13.
| Nome | Obrigatório | Declarado | Nível máximo de API | Outros |
|---|---|---|---|---|
READ_EXTERNAL_STORAGE | SIM | SIM | 32 | |
WRITE_EXTERNAL_STORAGE | NÃO | NÃO | 29 | |
ACCESS_MEDIA_LOCATION | SIM* | NÃO | N / D | Necessário ao ler Exif |
READ_MEDIA_IMAGES | SIM* | SIM | N / D | Necessário ao ler imagens |
READ_MEDIA_VIDEO | SIM* | SIM | N / D | Necessário ao ler vídeos |
READ_MEDIA_AUDIO | SIM* | SIM | N / D | Necessário ao ler áudios |
Se você estiver segmentando o Android SDK 33+ e não precisar carregar fotos, vídeos ou áudios, considere declarar apenas a permissão relevante em seus aplicativos, mais especificamente:
< 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 e atualize de acordo. platform :ios, '11.0'
# se a linha começar com ela.Info.plist . <key>NSPhotoLibraryUsageDescription</key>
<string>Replace with your permission description.</string>
macos/Podfile e atualize de acordo. platform :osx , '10.15'# se a linha começar com ela.macos/Runner.xcworkspace .Info.plist de acordo. Quando você está escolhendo ativos, o pacote obtém a Locale? Do seu BuildContext e retorne o delegado de texto correspondente do idioma atual. Verifique se você possui um Locale válido em sua árvore de widgets que pode ser acessada a partir do BuildContext . Caso contrário, o delegado chinês padrão será usado.
Os delegados de texto incorporados são:
Se você deseja usar um delegado de texto personalizado/fixo, passe -o através do AssetPickerConfig.textDelegate .
final List < AssetEntity > ? result = await AssetPicker . pickAssets (context); Use AssetPickerConfig para mais comportamentos de escolha.
final List < AssetEntity > ? result = await AssetPicker . pickAssets (
context,
pickerConfig : const AssetPickerConfig (),
); Campos em AssetPickerConfig :
| Nome | Tipo | Descrição | Padrão |
|---|---|---|---|
| SelectedASSETS | List<AssetEntity>? | Ativos selecionados. Evite a seleção duplicada. | null |
| maxassets | int | Ativo máximo que o seletor pode escolher. | 9 |
| PageSize | int? | Número de ativos por página. Deve ser um múltiplo de gridCount . | 80 |
| Gridthumbnailsize | ThumbnailSize | Tamanho da miniatura para o item da grade. | ThumbnailSize.square(200) |
| Paththumbnailsize | ThumbnailSize | Tamanho da miniatura para o seletor de caminho. | ThumbnailSize.square(80) |
| VisuewThumbnailsize | ThumbnailSize? | Visualizar tamanho de miniatura no espectador. | null |
| RequestType | RequestType | Tipo de solicitação para seletor. | RequestType.common |
| SpecialPickerType | SpecialPickerType? | Fornece a opção para integrar um tipo de seletor personalizado. | null |
| KeepScrollOffset | bool | Se o seletor deve salvar o deslocamento de rolagem entre pushes e pops. | null |
| SortPathDelegate | SortPathDelegate<AssetPathEntity>? | As entidades de caminho classificam o delegado para o seletor, classifique os caminhos como você deseja. | CommonSortPathDelegate |
| SortPathsByModifiedDate | bool | Se deve permitir que os delegados classifiquem os caminhos com FilterOptionGroup.containsPathModified . | false |
| FilterOptions | PMFilter? | Permitir que os usuários personalizem as opções de filtro de ativos. | null |
| GridCount | int | Contagem de grade em Picker. | 4 |
| Temecolor | Color? | Cor do tema principal para o seletor. | Color(0xff00bc56) |
| PickerTheme | ThemeData? | Provedor de dados de temas para o seletor e o espectador. | null |
| TextDelegate | AssetPickerTextDelegate? | Delegado de texto para o seletor, para personalizar os textos. | AssetPickerTextDelegate() |
| EspecialItemPosition | SpecialItemPosition | Permitir que os usuários defina um item especial no seletor com várias posições. | SpecialItemPosition.none |
| EspecialItembuilder | SpecialItemBuilder? | O construtor de widgets para o item especial. | null |
| LoadingIndicatorBuilder | IndicatorBuilder? | Indica o status de carregamento do construtor. | null |
| SelectPredicate | AssetSelectPredicate | Predicar se um ativo pode ser selecionado ou não selecionado. | null |
| MustRevertGrid | bool? | Se a grade de ativos deve reverter. | null |
| LimitedPermissionOverlayPredicate | LimitedPermissionOverlayPredicate? | Predique se a sobreposição de permissão limitada deve ser exibida. | null |
| PathNameBuilder | PathNameBuilder<AssetPathEntity>? | Construa o nome do caminho personalizado (álbum) com a entidade do caminho fornecido. | null |
| AssetsChanGecallback | AssetsChangeCallback<AssetPathEntity>? | O retorno de chamada que será chamado quando o sistema notificar os ativos muda. | null |
| AssetsChangeRefreshpredicate | AssetsChangeRefreshPredicate<AssetPathEntity>? | Se a mudança de ativos deve chamar a atualização com a chamada fornecida e o caminho selecionado atual. | null |
| MUITO MUITO VERVIE | bool | Se a pré -visualização deve reproduzir automaticamente. | false |
maxAssets é igual a 1 (também conhecido como modo de seleção único), use SpecialPickerType.noPreview selecionará imediatamente o ativo clicado (pressionado) pelo usuário e estourado.limitedPermissionOverlayPredicate vidas sem persistência, se você deseja ignorar a visualização limitada após o reinício, precisará se integrar aos seus próprios métodos de economia. Colocamos o uso comum múltiplo com os pacotes no exemplo. Você pode encontrar List<PickMethod> pickMethods aqui e aqui, que fornecem métodos no modo de colheita múltipla e colheita única. Os ativos serão armazenados temporários e exibidos na página abaixo da página.
O AssetEntityImage e AssetEntityImageProvider podem exibir a imagem de polegar de imagens e vídeos e os dados originais da imagem . Use -o como uma Image e ImageProvider comuns.
AssetEntityImage (asset, isOriginal : false );Ou:
Image (image : AssetEntityImageProvider (asset, isOriginal : false )); // Register callback.
AssetPicker . registerObserve ();
// Unregister callback.
AssetPicker . unregisterObserve ();AssetEntity com dados de formulário Existem várias maneiras de fazer upload de uma AssetEntity com métodos relacionados à E/S. Esteja ciente, os métodos relacionados à E/S consumirão desempenho (normalmente tempo e memória), eles não devem ser chamados com frequência.
http Pacote http : https://pub.dev/packages/http
O pacote http usa MultipartFile para lidar com arquivos nas solicitações.
Código 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 Pacote dio : https://pub.dev/packages/do
O pacote dio também usa MultipartFile para lidar com arquivos nas solicitações.
Código 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 e AssetPickerViewerProvider são todos expostos e substituídos. Você pode estendê -los e usar seu próprio tipo com tipo genérico <A: Asset, P: Path> e, em seguida, implementar métodos abstratos.
Para saber como personalizar completamente temas, widgets ou layouts. Veja como personalizar delegados na página Custom Pickers no exemplo.
Você pode enviar o PRS para criar sua própria implementação se achar que sua implementação pode ser útil para outras pessoas. Consulte Contribua com implementações personalizadas para obter mais detalhes.
Recent para outros) Recent é o nome do álbum Fix for the All Assets On Android, já que o álbum dos All Asset não é um álbum real, ele representa apenas todos os registros de dados de mídia.
Para resolver isso no Android, use pathNameBuilder , por exemplo:
AssetPickerConfig (
pathNameBuilder : ( AssetPathEntity path) => switch (path) {
final p when p.isAll => '最近' ,
// You can apply similar conditions to other common paths.
_ => path.name,
},
) Outros álbuns ou álbuns em outras plataformas (iOS/MacOS) seguirão a localização do sistema configurada e as localizações suportadas. pathNameBuilder está disponível para todos os álbuns.
Veja o Photo_Manager#561 para mais detalhes.
AssetEntity a partir File ou Uint8List (RawData) Para combinar este pacote com o tiroteio de câmera ou algo relacionado, há uma solução sobre como criar uma AssetEntity com File ou 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 AVISO: Se você não deseja manter o arquivo no seu dispositivo, use File para operações o máximo possível. A exclusão de uma AssetEntity pode fazer com que os pop -ups do sistema mostrem:
final List < String > result = await PhotoManager .editor. deleteWithIds (
< String > [entity.id],
);Veja o Photo_Manager#From-Raw-Data e Photo_Manager#Delete-Entities para obter mais detalhes.
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 precisa de anotação para manter o Singleton, impedir conflitos entre instâncias e versões; portanto, enquanto o gerenciador de fotos usa Glide para implementar recursos de imagem, o projeto que importa isso deve definir seu próprio AppGlideModule . Consulte DOCs de API gerados por Glide para implementação.
Muito obrigado a essas pessoas maravilhosas (key emoji):
Alex Li ? ? ? ? ️️️️♿️? | Caijinglong ? | Marcel Schneider ? ? | Ganlanshu0211 ? ? | Jasonhezz ? | Yaniv abafa ? ? ? | Avi-Yadav |
Letalus ? ? | Greymag ? | Nickolay Savchenko ? | Kosuke Saigusa ? | 三闻书店 | Didiosfaust ? | Xiejie ? |
Ahmed Masoud ? | Luomo-pro ️️️️♿️? | Paigupai ? | Muhammad Taqi Abdul Aziz | 何锦余 ? | Leon Dudlik ? | Maël ? |
dddrop | Nguyen phuc loi ? | Cevheri ? | Mirimhee ? | Amos ? | Dimil Kalathiya | Gasol Wu ? |
Este projeto segue a especificação de todos os contribuintes. Contribuições de qualquer tipo bem -vindo !!
Todos os aspectos da idéia do Intellij foram projetados para maximizar a produtividade do desenvolvedor. Juntos, a assistência inteligente de codificação e o design ergonômico tornam o desenvolvimento não apenas produtivo, mas também agradável.
Agradecemos à JetBrains por alocar licenças gratuitas de código aberto para IDEs, como a Intellij Idea.
