image_util.dart 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import 'dart:async';
  2. import 'package:flutter/widgets.dart';
  3. /**
  4. * @Author: Sky24n
  5. * @GitHub: https://github.com/Sky24n
  6. * @Email: sky24no@gmail.com
  7. * @Description: Image Util.
  8. * @Date: 2020/03/10
  9. */
  10. /// Image Util.
  11. class ImageUtil {
  12. late ImageStreamListener _listener;
  13. late ImageStream _imageStream;
  14. /// get image width height,load error throw exception.(unit px)
  15. /// 获取图片宽高,加载错误会抛出异常.(单位 px)
  16. /// image
  17. /// url network
  18. /// local url , package
  19. Future<Rect> getImageWH({
  20. Image? image,
  21. String? url,
  22. String? localUrl,
  23. String? package,
  24. ImageConfiguration? configuration,
  25. }) {
  26. Completer<Rect> completer = Completer<Rect>();
  27. _listener = ImageStreamListener(
  28. (ImageInfo info, bool synchronousCall) {
  29. _imageStream.removeListener(_listener);
  30. if (!completer.isCompleted) {
  31. completer.complete(Rect.fromLTWH(
  32. 0, 0, info.image.width.toDouble(), info.image.height.toDouble()));
  33. }
  34. },
  35. onError: (dynamic exception, StackTrace? stackTrace) {
  36. _imageStream.removeListener(_listener);
  37. if (!completer.isCompleted) {
  38. completer.completeError(exception, stackTrace);
  39. }
  40. },
  41. );
  42. if (image == null &&
  43. (url == null || url.isEmpty) &&
  44. (localUrl == null || localUrl.isEmpty)) {
  45. return Future.value(Rect.zero);
  46. }
  47. Image? img = image;
  48. if (img == null) {
  49. img = (url != null && url.isNotEmpty)
  50. ? Image.network(url)
  51. : Image.asset(localUrl!, package: package);
  52. }
  53. _imageStream = img.image.resolve(configuration ?? ImageConfiguration());
  54. _imageStream.addListener(_listener);
  55. return completer.future;
  56. }
  57. }