Bez popisu

photo.dart 3.5KB

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