image_preview.dart 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import 'package:flutter/material.dart';
  2. import 'package:image_preview/preview.dart';
  3. import 'package:image_preview/preview_data.dart';
  4. import 'package:shared/utils/date_time_utils.dart';
  5. import 'package:shared/utils/log_utils.dart';
  6. import 'package:shared/utils/util.dart';
  7. import '../directory/directory_util.dart';
  8. class ImagePreviewEngine {
  9. /// 单图的预览
  10. static void singleImagePreview(
  11. BuildContext context,
  12. String url, {
  13. String? heroTag,
  14. void Function(String? url)? onLongPressAction,
  15. Widget? Function(int index)? tipWidget,
  16. }) {
  17. String path;
  18. // 根据URL类型处理路径
  19. if (isNetworkUrl(url)) {
  20. // 从URL中提取文件名
  21. String fileName = extractFileName(url);
  22. // 生成保存路径
  23. path = DirectoryUtil.getTempPath(category: 'Pictures', fileName: fileName) ?? "";
  24. } else {
  25. // 如果是本地路径,直接使用URL作为路径
  26. path = url;
  27. }
  28. // 调用预览页面
  29. openPreviewPage(
  30. Navigator.of(context),
  31. data: PreviewData(
  32. type: Type.image,
  33. heroTag: heroTag ?? '',
  34. image: ImageData(
  35. url: url,
  36. path: path,
  37. ),
  38. ),
  39. tipWidget: tipWidget,
  40. onLongPressHandler: (context, data) {
  41. onLongPressAction?.call(data.image?.url);
  42. },
  43. );
  44. }
  45. /// 多图的预览
  46. static void multipleImagePreview(
  47. BuildContext context,
  48. List<String?> urls, {
  49. List<String>? heroes,
  50. void Function(String? url)? onLongPressAction,
  51. void Function(int index)? onPageChanged,
  52. Widget? Function(int index)? tipWidget,
  53. }) {
  54. // 过滤掉 null 值的 URL
  55. List<String> filteredUrls = urls.where((url) => url != null).cast<String>().toList();
  56. List<PreviewData> previewDataList = filteredUrls.asMap().entries.map((entry) {
  57. int index = entry.key;
  58. String url = entry.value;
  59. String path;
  60. if (isNetworkUrl(url)) {
  61. String fileName = extractFileName(url);
  62. path = DirectoryUtil.getTempPath(category: 'Pictures', fileName: fileName) ?? "";
  63. } else {
  64. path = url;
  65. }
  66. return PreviewData(
  67. type: Type.image,
  68. heroTag: heroes != null && heroes.length > index ? heroes[index] : index.toString(),
  69. image: ImageData(
  70. url: url,
  71. path: path,
  72. ),
  73. );
  74. }).toList();
  75. // 调用预览页面
  76. openPreviewPages(
  77. Navigator.of(context),
  78. data: previewDataList,
  79. tipWidget: tipWidget,
  80. onPageChanged: onPageChanged,
  81. onLongPressHandler: (context, data) {
  82. onLongPressAction?.call(data.image?.url);
  83. },
  84. );
  85. }
  86. /// 工具函数:从URL提取文件名
  87. static String extractFileName(String url) {
  88. // 检查是否包含 '/'
  89. if (!url.contains('/')) {
  90. return DateTimeUtils.getNowDateMs().toString();
  91. }
  92. // 获取最后一个 '/' 后的部分
  93. String fileName = url.split('/').last;
  94. // 检查是否包含 '.'
  95. if (Utils.isEmpty(fileName)) {
  96. return DateTimeUtils.getNowDateMs().toString();
  97. }
  98. return fileName;
  99. }
  100. /// 工具函数:判断是否为网络URL
  101. static bool isNetworkUrl(String url) {
  102. return url.startsWith('http://') || url.startsWith('https://');
  103. }
  104. }