Bez popisu

photo.dart 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. library photo;
  2. import 'dart:async';
  3. import 'package:flutter/material.dart';
  4. import 'package:photo/src/entity/options.dart';
  5. import 'package:photo/src/provider/i18n_provider.dart';
  6. import 'package:photo/src/ui/dialog/not_permission_dialog.dart';
  7. import 'package:photo/src/ui/photo_app.dart';
  8. import 'package:photo_manager/photo_manager.dart';
  9. export 'package:photo/src/provider/i18n_provider.dart' show I18NCustomProvider,I18nProvider,CNProvider,ENProvider;
  10. class PhotoPicker {
  11. static PhotoPicker _instance;
  12. PhotoPicker._();
  13. factory PhotoPicker() {
  14. _instance ??= PhotoPicker._();
  15. return _instance;
  16. }
  17. static const String rootRouteName = "photo_picker_image";
  18. /// 没有授予权限的时候,会开启一个dialog去帮助用户去应用设置页面开启权限
  19. /// 确定开启设置页面,取消关闭弹窗
  20. ///
  21. ///
  22. /// 当用户给予权限后
  23. ///
  24. /// 当用户确定时,返回一个图片[ImageEntity]列表
  25. ///
  26. /// 当用户取消时
  27. ///
  28. /// if user not grand permission, then return null and show a dialog to help user open setting.
  29. /// sure is open setting cancel ,cancel to dismiss dialog
  30. ///
  31. /// when user give permission.
  32. ///
  33. /// when user sure , return a [ImageEntity] of [List]
  34. ///
  35. /// when user cancel selected,result is empty list
  36. static Future<List<ImageEntity>> pickImage({
  37. @required BuildContext context,
  38. int rowCount = 4,
  39. int maxSelected = 9,
  40. double padding = 0.5,
  41. double itemRadio = 1.0,
  42. Color themeColor,
  43. Color dividerColor,
  44. Color textColor,
  45. Color disableColor,
  46. int thumbSize = 64,
  47. I18nProvider provider = I18nProvider.chinese,
  48. }) {
  49. assert(provider != null, "provider must be not null");
  50. assert(context != null, "context must be not null");
  51. themeColor ??= Theme.of(context)?.primaryColor ?? Colors.black;
  52. dividerColor ??= Theme.of(context)?.dividerColor ?? Colors.grey;
  53. disableColor ??= Theme.of(context)?.disabledColor ?? Colors.grey;
  54. textColor ??= Colors.white;
  55. var options = Options(
  56. rowCount: rowCount,
  57. dividerColor: dividerColor,
  58. maxSelected: maxSelected,
  59. itemRadio: itemRadio,
  60. padding: padding,
  61. disableColor: disableColor,
  62. textColor: textColor,
  63. themeColor: themeColor,
  64. thumbSize: thumbSize,
  65. );
  66. return PhotoPicker()._pickImage(context, options, provider);
  67. }
  68. Future<List<ImageEntity>> _pickImage(
  69. BuildContext context,
  70. Options options,
  71. I18nProvider provider,
  72. ) async {
  73. var requestPermission = await PhotoManager.requestPermission();
  74. if (requestPermission != true) {
  75. var result = await showDialog(
  76. context: context,
  77. builder: (ctx) => NotPermissionDialog(
  78. provider.getNotPermissionText(options),
  79. ),
  80. );
  81. if (result == true) {
  82. PhotoManager.openSetting();
  83. }
  84. return null;
  85. }
  86. return _openGalleryContentPage(context, options, provider);
  87. }
  88. Future<List<ImageEntity>> _openGalleryContentPage(
  89. BuildContext context, Options options, I18nProvider provider)async{
  90. return Navigator.of(context).push(
  91. MaterialPageRoute(
  92. builder: (ctx) => PhotoApp(
  93. options: options,
  94. provider: provider,
  95. ),
  96. ),
  97. );
  98. }
  99. }