123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- library photo;
-
- import 'dart:async';
- import 'dart:io';
-
- import 'package:flutter/material.dart';
- import 'package:image_picker/image_picker.dart';
- import 'package:photo/src/entity/_theme.dart';
- import 'package:photo/src/ui/page/photo_list_page.dart';
- import 'package:photo/src/ui/page/photo_main_page.dart';
-
- import 'package:photo_manager/photo_manager.dart';
-
- import 'package:photo/src/delegate/badge_delegate.dart';
- import 'package:photo/src/delegate/checkbox_builder_delegate.dart';
- import 'package:photo/src/delegate/loading_delegate.dart';
- import 'package:photo/src/delegate/sort_delegate.dart';
- import 'package:photo/src/entity/options.dart';
- import 'package:photo/src/provider/i18n_provider.dart';
- import 'package:photo/src/ui/dialog/not_permission_dialog.dart';
- import 'package:provider/provider.dart';
-
- import 'src/provider/config_provider.dart';
- export 'package:photo/src/delegate/checkbox_builder_delegate.dart';
- export 'package:photo/src/delegate/loading_delegate.dart';
- export 'package:photo/src/delegate/sort_delegate.dart';
- export 'package:photo/src/provider/i18n_provider.dart'
- show I18NCustomProvider, I18nProvider, CNProvider, ENProvider;
- export 'package:photo/src/entity/options.dart' show PickType, PickedEntity;
- export 'package:photo/src/delegate/badge_delegate.dart';
- export 'package:photo/src/entity/_theme.dart';
- export 'package:image_picker/image_picker.dart' show CameraDevice;
- export 'package:photo_manager/photo_manager.dart' show AssetEntity;
-
- class PhotoPicker {
- static PhotoPicker _instance;
-
- PhotoPicker._();
-
- factory PhotoPicker() {
- _instance ??= PhotoPicker._();
- return _instance;
- }
-
- static const String rootRouteName = "photo_picker_image";
-
- /// 没有授予权限的时候,会开启一个dialog去帮助用户去应用设置页面开启权限
- /// 确定开启设置页面,取消关闭弹窗,无论选择什么,返回值都是null
- /// 当用户给予权限后
- ///
- /// 返回一个[PickedEntity] 内有[AssetEntity]以及[isFullImage]
- ///
- /// 当用户取消时[AssetEntity]返回一个空数组
- ///
- /// [photoPathList] 一旦设置 则 [pickType]参数无效
- ///
- /// [pickedAssetList] 已选择的asset
- ///
- /// 关于参数可以查看readme文档介绍
- static Future<PickedEntity> pickAsset({
- @required BuildContext context,
- int rowCount = 4,
- int maxSelected = 9,
- double padding = 1,
- double itemRadio = 1.0,
- int thumbSize = 180,
- PhotoTheme theme,
- I18nProvider provider = I18nProvider.chinese,
- SortDelegate sortDelegate,
- LoadingDelegate loadingDelegate,
- PickType pickType = PickType.all,
- List<AssetPathEntity> photoPathList,
- List<AssetEntity> pickedAssetList,
- }) {
- assert(maxSelected != 0, "maxSelected must be not 0");
- assert(provider != null, "provider must be not null");
- assert(context != null, "context must be not null");
- assert(pickType != null, "pickType must be not null");
-
- sortDelegate ??= SortDelegate.common;
-
- loadingDelegate ??= DefaultLoadingDelegate();
-
- var options = Options(
- rowCount: rowCount,
- maxSelected: maxSelected,
- itemRadio: itemRadio,
- padding: padding,
- theme: theme ?? PhotoTheme.fallback(context),
- thumbSize: thumbSize,
- sortDelegate: sortDelegate,
- checkBoxBuilderDelegate: DefaultCheckBoxBuilderDelegate(),
- loadingDelegate: loadingDelegate,
- badgeDelegate: DefaultBadgeDelegate(),
- pickType: pickType,
- );
-
- return PhotoPicker()._pickAsset(
- context,
- options,
- provider,
- photoPathList,
- pickedAssetList,
- );
- }
-
-
- static Future<AssetEntity> pickSingleAsset({
- @required BuildContext context,
- int rowCount = 4,
- double padding = 1,
- double itemRadio = 1.0,
- int thumbSize = 180,
- PhotoTheme theme,
- I18nProvider provider = I18nProvider.chinese,
- SortDelegate sortDelegate,
- LoadingDelegate loadingDelegate,
- PickType pickType = PickType.all,
- List<AssetPathEntity> photoPathList,
- }) async {
- final PickedEntity result = await PhotoPicker.pickAsset(
- context: context,
- rowCount: rowCount,
- maxSelected: 1,
- padding: padding,
- itemRadio: itemRadio,
- thumbSize: thumbSize,
- theme: theme,
- provider: provider,
- sortDelegate: sortDelegate,
- loadingDelegate: loadingDelegate,
- pickType: pickType,
- photoPathList: photoPathList,
- pickedAssetList: [],
- );
- if (result.asset.isNotEmpty) {
- return result.asset[0];
- }
- return null;
- }
-
- static Future<File> pickCamera({
- double maxWidth,
- double maxHeight,
- int imageQuality,
- CameraDevice preferredCameraDevice = CameraDevice.rear,
- }) async {
- return ImagePicker.pickImage(
- source: ImageSource.camera,
- maxWidth: maxWidth,
- maxHeight: maxHeight,
- imageQuality: imageQuality,
- preferredCameraDevice: preferredCameraDevice,
- );
- }
-
- Future<PickedEntity> _pickAsset(
- BuildContext context,
- Options options,
- I18nProvider provider,
- List<AssetPathEntity> photoList,
- List<AssetEntity> pickedAssetList,
- ) async {
- await requestPermission(context, provider: provider);
-
- return _openGalleryContentPage(
- context,
- options,
- provider,
- photoList,
- pickedAssetList,
- );
- }
-
- static Widget buildGallery({
- @required BuildContext context,
- double padding = 1,
- int maxSelected = 9,
- int thumbSize = 180,
- double itemRadio = 1.0,
- PhotoTheme theme,
- I18nProvider provider = I18nProvider.chinese,
- SortDelegate sortDelegate,
- LoadingDelegate loadingDelegate,
- PickType pickType = PickType.all,
- List<AssetPathEntity> photoPathList,
- List<AssetEntity> pickedAssetList,
- bool isFullImage = false,
- void Function(PickedEntity value) onSelected,
- }) {
- sortDelegate ??= SortDelegate.common;
-
- loadingDelegate ??= DefaultLoadingDelegate();
-
- var options = ListOptions(
- padding: padding,
- maxSelected: maxSelected,
- itemRadio: itemRadio,
- theme: theme ?? PhotoTheme.fallback(context),
- thumbSize: thumbSize,
- sortDelegate: sortDelegate,
- checkBoxBuilderDelegate: DefaultCheckBoxBuilderDelegate(),
- loadingDelegate: loadingDelegate,
- badgeDelegate: DefaultBadgeDelegate(),
- pickType: pickType,
- );
- assert(provider != null, "provider must be not null");
- assert(context != null, "context must be not null");
- assert(pickType != null, "pickType must be not null");
-
- return ChangeNotifierProvider(
- create: (_) => PhotoProvider(
- provider: provider,
- options: options,
- pickedAssetList: pickedAssetList,
- ),
- child: PhotoListPage(
- onSelected: onSelected,
- options: options,
- isFullImage: isFullImage,
- ),
- );
- }
-
- Future<void> requestPermission(BuildContext context,
- {@required I18nProvider provider}) async {
- var requestPermission = await PhotoManager.requestPermission();
- if (requestPermission != true) {
- var result = await showDialog(
- context: context,
- builder: (ctx) => NotPermissionDialog(
- provider.getNotPermissionText(),
- ),
- );
- if (result == true) {
- PhotoManager.openSetting();
- }
- return null;
- }
- }
-
- Future<PickedEntity> _openGalleryContentPage(
- BuildContext context,
- Options options,
- I18nProvider provider,
- List<AssetPathEntity> photoList,
- List<AssetEntity> pickedAssetList,
- ) async {
- return Navigator.of(context, rootNavigator: true).push(
- MaterialPageRoute(
- builder: (ctx) => ChangeNotifierProvider(
- create: (_) => PhotoProvider(
- provider: provider,
- options: options,
- pickedAssetList: pickedAssetList,
- ),
- child: PhotoMainPage(
- onClose: (PickedEntity value) {
- Navigator.pop(ctx, value);
- },
- options: options,
- photoList: photoList,
- ),
- ),
- ),
- );
- }
- }
|