ext_dart.dart 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import 'dart:async';
  2. import 'package:get/get.dart';
  3. import 'package:shared/utils/screen_util.dart';
  4. import 'package:shared/utils/util.dart';
  5. /*
  6. 对象的扩展方法,模仿高阶函数
  7. */
  8. extension LetRunApply<T> on T {
  9. /// let 函数与之前的示例相同,它接受一个闭包并返回其结果。
  10. R let<R>(R Function(T) block) {
  11. return block(this);
  12. }
  13. /// run 函数也与之前的示例相同,它接受一个闭包但不返回任何内容。
  14. void run(void Function(T) block) {
  15. block(this);
  16. }
  17. /// apply 函数它接受一个闭包并在当前对象上执行该闭包。然后,它返回当前对象本身
  18. T apply(void Function(T) block) {
  19. block(this);
  20. return this;
  21. }
  22. }
  23. /*
  24. String的扩展方法,用于处理占位符
  25. */
  26. extension StringExtension on String {
  27. // 自己的校验空
  28. bool get checkEmpty {
  29. return Utils.isEmpty(this);
  30. }
  31. // 自己的校验非空
  32. bool get checkNotEmpty {
  33. return Utils.isNotEmpty(this);
  34. }
  35. // 只有一个 %s 的占位符,直接写就行
  36. String replacePlaceholder(String replacement) {
  37. String result = this;
  38. result = result.replaceFirst('%s', replacement);
  39. return result;
  40. }
  41. // 多个 %s 的占位符,使用List按顺序指定
  42. String replacePlaceholderList(List<String> replacements) {
  43. String result = this;
  44. for (int i = 0; i < replacements.length; i++) {
  45. result = result.replaceFirst('%s', replacements[i]);
  46. }
  47. return result;
  48. }
  49. // 自定义的多个占位符 ,自己写对应关系
  50. String replacePlaceholderMap(Map<String, String> replacements) {
  51. String result = this;
  52. replacements.forEach((key, value) {
  53. final pattern = RegExp(key);
  54. result = result.replaceAll(pattern, value);
  55. });
  56. return result;
  57. }
  58. //时间戳从毫秒转换为秒 13位数转换为10位数
  59. String get formartUnixTimeStamp {
  60. return substring(0, length - 3);
  61. }
  62. }
  63. /*
  64. double的扩展方法,用于ScreenUtil的扩展,主要用于容器与图片的屏幕适配
  65. */
  66. extension DoubleExtension on double {
  67. double get ap {
  68. return ScreenUtil.getInstance().getAdapterSize(this);
  69. }
  70. }
  71. extension IntExtension on int {
  72. double get ap {
  73. return ScreenUtil.getInstance().getAdapterSize(toDouble());
  74. }
  75. }
  76. /*
  77. GetxController 下的扩展方法
  78. */
  79. extension ControllerExtension on GetxController {
  80. /// 处理Form表单的Input错误展示(专用 的我们的Api返回错误逻辑)
  81. void handleFormError(Map<String, dynamic>? json, String key, void Function(String errorStr)? callback) {
  82. if (json?.containsKey(key) == true) {
  83. String errorStrs = json![key]
  84. .map((value) {
  85. if (value is String) {
  86. return value;
  87. } else {
  88. return '';
  89. }
  90. })
  91. .toList()
  92. .join('\r\n');
  93. if (!Utils.isEmpty(errorStrs)) {
  94. callback?.call(errorStrs);
  95. update();
  96. }
  97. }
  98. }
  99. }
  100. // 扩展Function,添加防抖功能
  101. extension DebounceExtension on Function {
  102. void Function() debounce([int milliseconds = 500]) {
  103. Timer? _debounceTimer;
  104. return () {
  105. if (_debounceTimer?.isActive ?? false) _debounceTimer?.cancel();
  106. _debounceTimer = Timer(Duration(milliseconds: milliseconds), () {
  107. this(); //后执行
  108. });
  109. };
  110. }
  111. }
  112. // 扩展Function,添加节流功能
  113. extension ThrottleExtension on Function {
  114. void Function() throttle([int milliseconds = 500]) {
  115. bool _isAllowed = true;
  116. Timer? _throttleTimer;
  117. return () {
  118. if (!_isAllowed) return;
  119. _isAllowed = false;
  120. this(); //先执行
  121. _throttleTimer?.cancel();
  122. _throttleTimer = Timer(Duration(milliseconds: milliseconds), () {
  123. _isAllowed = true;
  124. });
  125. };
  126. }
  127. }