[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-9360":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":37,"readmeContent":38,"aiSummary":39,"trendingCount":16,"starSnapshotCount":16,"syncStatus":40,"lastSyncTime":41,"discoverSource":42},9360,"common_utils","Sky24n\u002Fcommon_utils","Sky24n","Dart common utils library. DateUtil, EncryptUtil, JsonUtil, LogUtil, MoneyUtil, NumUtil, ObjectUtil,  RegexUtil, TextUtil, TimelineUtil, TimerUtil. 包含日期，正则，倒计时，时间轴等工具类。","",null,"Dart",1454,264,26,12,0,3,55.57,"BSD 2-Clause \"Simplified\" License",false,"master",true,[24,25,26,27,28,29,30,31,32,33,34,35,36],"dart","dart-package","dateutil","endecodeutil","flutter","logutil","moneyutil","numutil","objectutil","regexutil","textutil","timelineutil","timerutil","2026-06-12 04:00:44","Language: [English](README-EN.md) | 中文简体\n\n[![Pub](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Fv\u002Fcommon_utils.svg?style=flat-square&color=009688)](https:\u002F\u002Fpub.dartlang.org\u002Fpackages\u002Fcommon_utils)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[![Pub](https:\u002F\u002Fimg.shields.io\u002Fpub\u002Fv\u002Fcommon_utils.svg?style=flat-square&color=2196F3)](https:\u002F\u002Fpub.flutter-io.cn\u002Fpackages\u002Fcommon_utils)\n\nDart常用工具类库。包含日期，正则，倒计时，时间轴等工具类。如果你有好的工具类欢迎PR.\n\n1、如果您是纯Dart项目，可以直接引用本库。\n```yaml\ndependencies:\n  common_utils: ^2.1.0\n```\n2、如果您是Flutter项目，请使用Flutter常用工具类库 [flustars][flustars_github]，该库依赖于本项目。[flustars][flustars_github]库为大家提供更多的工具类，例如SpUtil，ScreenUtil, DirectoryUtil等等。\n```yaml\ndependencies:\n  flustars: ^2.0.1  \n```\n\nDart常用工具类库 [common_utils][common_utils_github]\n1. TimelineUtil     : 时间轴.\n2. TimerUtil        : 倒计时，定时任务.\n3. MoneyUtil        : 精确转换，元转分，分转元，支持格式输出.\n4. LogUtil          : 简单封装打印日志.\n5. DateUtil         : 日期转换格式化输出.\n6. RegexUtil        : 正则验证手机号，身份证，邮箱等等.\n7. NumUtil          : 保留x位小数, 精确加、减、乘、除, 防止精度丢失.\n8. ObjectUtil       : 判断对象是否为空(String List Map),判断两个List是否相等.\n9. EncryptUtil      : 异或对称加\u002F解密，md5加密，Base64加\u002F解密.\n10. TextUtil        : 银行卡号每隔4位加空格，每隔3三位加逗号，隐藏手机号等等.\n11. JsonUtil        : 简单封装json字符串转对象.\n\nFlutter常用工具类库 [flustars][flustars_github]\n1. SpUtil           : 单例\"同步\"SharedPreferences工具类。支持get传入默认值，支持存储对象，支持存储对象数组。\n2. ScreenUtil       : 屏幕适配，获取屏幕宽、高、密度，AppBar高，状态栏高度，屏幕方向.\n3. WidgetUtil       : 监听Widget渲染状态，获取Widget宽高，在屏幕上的坐标，获取网络\u002F本地图片尺寸.\n4. ImageUtil        : 获取网络\u002F本地图片尺寸.\n5. DirectoryUtil    : 文件目录工具类.\n6. DioUtil          : 单例Dio网络工具类(已迁移至此处[DioUtil](https:\u002F\u002Fgithub.com\u002FSky24n\u002FFlutterRepos\u002Fblob\u002Fmaster\u002Fbase_library\u002Flib\u002Fsrc\u002Fdata\u002Fnet\u002Fdio_util.dart))。\n \n\n### APIs\n* SpUtil\n强大易用的SharedPreferences工具类，详细使用请参考原仓库[flustars][flustars_github]。\n```dart\n\u002F\u002F\u002F 等待Sp初始化完成。\nawait SpUtil.getInstance();  \n  \n\u002F\u002F\u002F 同步使用Sp。支付默认值。\nString name = SpUtil.putString(\"key_username\", \"Sky24n\");\nbool isShow = SpUtil.getBool(\"key_show\", defValue: true);\n  \n\u002F\u002F\u002F 存储实体对象示例。\nCity city = new City();\ncity.name = \"成都市\";\nSpUtil.putObject(\"loc_city\", city);\n    \nCity hisCity = SpUtil.getObj(\"loc_city\", (v) => City.fromJson(v));\nprint(\"City: \" + (hisCity == null ? \"null\" : hisCit.toString()));\n  \n\u002F\u002F\u002F 存储实体对象list示例。\nList\u003CCity> list = new List();\nlist.add(new City(name: \"成都市\"));\nlist.add(new City(name: \"北京市\"));\nSpUtil.putObjectList(\"loc_city_list\", list);\n    \nList\u003CCity> _cityList = SpUtil.getObjList(\"loc_city_list\", (v) => City.fromJson(v));\nprint(\"City list: \" + (_cityList == null ? \"null\" : _cityList.toString()));\n```\n\n* DateUtil -> [Example](https:\u002F\u002Fgithub.com\u002FSky24n\u002Fflutter_wanandroid\u002Fblob\u002Fmaster\u002Flib\u002Fdemos\u002Fdate_page.dart)\n```\n\u002F\u002F\u002F 一些常用格式参照。可以自定义格式，例如：\"yyyy\u002FMM\u002Fdd HH:mm:ss\"，\"yyyy\u002FM\u002Fd HH:mm:ss\"。\n\u002F\u002F\u002F 格式要求\n\u002F\u002F\u002F year -> yyyy\u002Fyy   month -> MM\u002FM    day -> dd\u002Fd\n\u002F\u002F\u002F hour -> HH\u002FH      minute -> mm\u002Fm   second -> ss\u002Fs\nclass DataFormats {\n  static String full = \"yyyy-MM-dd HH:mm:ss\";\n  static String y_mo_d_h_m = \"yyyy-MM-dd HH:mm\";\n  static String y_mo_d = \"yyyy-MM-dd\";\n  static String y_mo = \"yyyy-MM\";\n  static String mo_d = \"MM-dd\";\n  static String mo_d_h_m = \"MM-dd HH:mm\";\n  static String h_m_s = \"HH:mm:ss\";\n  static String h_m = \"HH:mm\";\n\n  static String zh_full = \"yyyy年MM月dd日 HH时mm分ss秒\";\n  static String zh_y_mo_d_h_m = \"yyyy年MM月dd日 HH时mm分\";\n  static String zh_y_mo_d = \"yyyy年MM月dd日\";\n  static String zh_y_mo = \"yyyy年MM月\";\n  static String zh_mo_d = \"MM月dd日\";\n  static String zh_mo_d_h_m = \"MM月dd日 HH时mm分\";\n  static String zh_h_m_s = \"HH时mm分ss秒\";\n  static String zh_h_m = \"HH时mm分\";\n}\n\ngetDateTimeByMs                 : .\ngetDateMsByTimeStr              : .\ngetNowDateMs                    : 获取现在 毫秒.\ngetNowDateStr                   : 获取现在 日期字符串.(yyyy-MM-dd HH:mm:ss)\nformatDate                      : 格式化日期 DateTime.\nformatDateStr                   : 格式化日期 字符串.\nformatDateMs                    : 格式化日期 毫秒.\ngetWeekday                      : 获取星期几.\ngetDayOfYear                    : 在今年的第几天.\nisToday                         : 是否是今天.\nisYesterday                     : 是否是昨天.\nisWeek                          : 是否是本周.\nyearIsEqual                     : 是否同年.\nisLeapYear                      : 是否是闰年.\n\n\u002F\u002F example\nDateUtil.formatDateMs(dateMs, format: DateFormats.full); \u002F\u002F2019-07-09 16:16:16\nDateUtil.formatDateStr('2019-07-09 16:16:16', format: \"yyyy\u002FM\u002Fd HH:mm:ss\"); \u002F\u002F2019\u002F7\u002F9 16:16:16\nDateUtil.formatDate(DateTime.now(), format: DateFormats.zh_full); \u002F\u002F2019年07月09日 16时16分16秒\n```\n\n* EncryptUtil\n```\nencodeMd5                   : md5 加密.\nencodeBase64                : Base64加密.\ndecodeBase64()              : Base64解密.\nxorCode()                   : 异或对称加密.\nxorBase64Encode()           : 异或对称 Base64 加密.\nxorBase64Decode()           : 异或对称 Base64 解密.\n\nconst String key = '11, 22, 33, 44, 55, 66';\nString userName = 'Sky24n';\nString encode = EncryptUtil.xorBase64Encode(userName, key); \u002F\u002F WH1YHgMs\nString decode = EncryptUtil.xorBase64Decode(encode, key); \u002F\u002F Sky24n\n```\n\n* JsonUtil\n```\nencodeObj                   : object to json string.\ngetObj                      : json string to object.\ngetObject                   : json string \u002F map to object.\ngetObjList                  : json string list to object list.\ngetObjectList               : json string \u002F map list to object list.\n\nString objStr = \"{\\\"name\\\":\\\"成都市\\\"}\";\nCity hisCity = JsonUtil.getObj(objStr, (v) => City.fromJson(v));\nString listStr = \"[{\\\"name\\\":\\\"成都市\\\"}, {\\\"name\\\":\\\"北京市\\\"}]\";\nList\u003CCity> cityList = JsonUtil.getObjList(listStr, (v) => City.fromJson(v));\n```\n\n* LogUtil\n```\ninit(tag, isDebug, maxLen)  : tag 标签, isDebug: 模式, maxLen 每行最大长度.\ne(object, tag)              : 日志e\nv(object, tag)              : 日志v，只在debug模式输出.\n\n\u002F\u002F超长log查看\ncommon_utils e  — — — — — — — — — — — — — — — — st — — — — — — — — — — — — — — — —\ncommon_utils e | 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,\ncommon_utils e | 7,988,989,990,991,992,993,994,995,996,997,998,999,\ncommon_utils e  — — — — — — — — — — — — — — — — ed — — — — — — — — — — — — — — — —\n```\n\n* MoneyUtil 精确转换,防止精度丢失 -> [Example](https:\u002F\u002Fgithub.com\u002FSky24n\u002Fflutter_wanandroid\u002Fblob\u002Fmaster\u002Flib\u002Fdemos\u002Fmoney_page.dart)\n```\nchangeF2Y                   : 分 转 元, format格式输出.\nchangeFStr2YWithUnit        : 分字符串 转 元, format 与 unit 格式 输出.\nchangeF2YWithUnit           : 分 转 元, format 与 unit 格式 输出.\nchangeYWithUnit             : 元, format 与 unit 格式 输出.\nchangeY2F                   : 元 转 分. \n```\n\n* NumUtil -> [Example](https:\u002F\u002Fgithub.com\u002FSky24n\u002Fflutter_wanandroid\u002Fblob\u002Fmaster\u002Flib\u002Fdemos\u002Fnum_util_page.dart)\n```\ngetIntByValueStr            : 数字字符串转int.\ngetDoubleByValueStr         : 数字字符串转double.\ngetNumByValueStr            : 保留x位小数 by 数字字符串.\ngetNumByValueDouble         : 保留x位小数 by double.\nisZero                      : 是否为0.\nadd                         : 加(精确相加,防止精度丢失).\nsubtract                    : 减(精确相减,防止精度丢失).\nmultiply                    : 乘(精确相乘,防止精度丢失).\ndivide                      : 除(精确相除,防止精度丢失).\nremainder                   : 余.\nlessThan                    : \u003C .\nthanOrEqual                 : \u003C= .\ngreaterThan                 : > .\ngreaterOrEqual              : >= .\n```\n\n* ObjectUtil -> [Example](https:\u002F\u002Fgithub.com\u002FSky24n\u002Fflutter_wanandroid\u002Fblob\u002Fmaster\u002Flib\u002Fdemos\u002Fobject_util_page.dart)\n```\nisEmptyString             : 判断String是否为空.\nisEmptyList               : 判断List是否为空.\nisEmptyMap                : 判断Map是否为空.\nisEmpty                   : 判断对象是否为空.(String List Map).\nisNotEmpty                : 判断对象是否非空.(String List Map).\ntwoListIsEqual            : 判断两个List是否相等.\n```\n\n* RegexUtil -> [Example](https:\u002F\u002Fgithub.com\u002FSky24n\u002Fflutter_wanandroid\u002Fblob\u002Fmaster\u002Flib\u002Fdemos\u002Fregex_page.dart)\n```\nisMobileSimple            : 简单验证手机号\nisMobileExact             : 精确验证手机号\nisTel                     : 验证电话号码\nisIDCard                  : 验证身份证号码\nisIDCard15                : 验证身份证号码 15 位\nisIDCard18                : 简单验证身份证号码 18 位\nisIDCard18Exact           : 精确验证身份证号码 18 位\nisEmail                   : 验证邮箱\nisURL                     : 验证 URL\nisZh                      : 验证汉字\nisDate                    : 验证 yyyy-MM-dd 格式的日期校验，已考虑平闰年\nisIP                      : 验证 IP 地址\nisUserName                : 验证用户名\nisQQ                      : 验证 QQ\n```\n\n* TextUtil\n```\nisEmpty                     : isEmpty.\nformatSpace4                : 每隔4位加空格，格式化银行卡.\nformatComma3                : 每隔3三位加逗号.\nformatDoubleComma3          : 每隔3三位加逗号.\nhideNumber                  : 隐藏号码.\nreplace                     : replace.\nsplit                       : split.\nreverse                     : reverse.\n  \n\u002F\u002F\u002F example\nString phoneNo = TextUtil.formatSpace4(\"15845678910\"); \u002F\u002F 1584 5678 910\nString num     = TextUtil.formatComma3(\"1234\"); \u002F\u002F 123,4\nString phoneNo = TextUtil.hideNumber(\"15845678910\")\u002F\u002F 158****8910\n```\n\n* TimelineUtil -> [Example](https:\u002F\u002Fgithub.com\u002FSky24n\u002Fflutter_wanandroid\u002Fblob\u002Fmaster\u002Flib\u002Fdemos\u002Ftimeline_page.dart)\n```\n\u002F\u002F\u002F(xx)为可配置输出\nenum DayFormat {\n  \u002F\u002F\u002F(小于30s->刚刚)、x分钟、x小时、(昨天)、x天.\n  Simple,\n  \u002F\u002F\u002F(小于30s->刚刚)、x分钟、x小时、[今年: (昨天\u002F1天前)、(2天前)、MM-dd],[往年: yyyy-MM-dd].\n  Common,\n  \u002F\u002F\u002F小于30s->刚刚)、x分钟、x小时、[今年: (昨天 HH:mm\u002F1天前)、(2天前)、MM-dd HH:mm],[往年: yyyy-MM-dd HH:mm].\n  Full,\n}\n\u002F\u002F\u002FTimeline信息配置.\nabstract class TimelineInfo {\n  String suffixAgo(); \u002F\u002Fsuffix ago(后缀 后).\n  String suffixAfter(); \u002F\u002Fsuffix after(后缀 前).\n  int maxJustNowSecond() => 30; \u002F\u002F max just now second.\n  String lessThanOneMinute() => ''; \u002F\u002Fjust now(刚刚).\n  String customYesterday() => ''; \u002F\u002FYesterday(昨天).优先级高于keepOneDay\n  bool keepOneDay(); \u002F\u002F保持1天,example: true -> 1天前, false -> MM-dd.\n  bool keepTwoDays(); \u002F\u002F保持2天,example: true -> 2天前, false -> MM-dd.\n  String oneMinute(int minutes); \u002F\u002Fa minute(1分钟).\n  String minutes(int minutes); \u002F\u002Fx minutes(x分钟).\n  String anHour(int hours); \u002F\u002Fan hour(1小时).\n  String hours(int hours); \u002F\u002Fx hours(x小时).\n  String oneDay(int days); \u002F\u002Fa day(1天).\n  String days(int days); \u002F\u002Fx days(x天).\n}\nsetLocaleInfo               : 自定义设置配置信息.\nformatByDateTime            : 格式输出时间轴信息 by DateTime .\nformat                      : 格式输出时间轴信息.\nformatA                     : 格式输出时间轴信息. like QQ.\n```\n\n* TimerUtil -> [Example](https:\u002F\u002Fgithub.com\u002FSky24n\u002Fflutter_wanandroid\u002Fblob\u002Fmaster\u002Flib\u002Fdemos\u002Ftimer_page.dart)\n```\nsetInterval                 : 设置Timer间隔.\nsetTotalTime                : 设置倒计时总时间.\nstartTimer()                : 启动定时Timer.\nstartCountDown              : 启动倒计时Timer.\nupdateTotalTime             : 重设倒计时总时间.\ncancel                      : 取消计时器.\nsetOnTimerTickCallback      : 计时器回调.\nisActive                    : Timer是否启动.\n```\n\n### [Flutter Demos](https:\u002F\u002Fgithub.com\u002FSky24n\u002Fflutter_wanandroid\u002Ftree\u002Fmaster\u002Flib\u002Fdemos)   \n \n>- |--demos\n>    - |-- city_select_page.dart 城市列表(索引&悬停)示例\n>    - |-- date_page.dart 日期格式化示例\n>    - |-- image_size_page.dart 获取网络\u002F本地图片尺寸示例\n>    - |-- money_page.dart 金额(元转分\u002F分转元)示例\n>    - |-- pinyin_page.dart 汉字转拼音示例\n>    - |-- regex_page.dart 正则工具类示例\n>    - |-- round_portrait_page.dart 圆形圆角头像示例\n>    - |-- timeline_page.dart 时间轴示例\n>    - |-- timer_page.dart 倒计时\u002F定时器示例\n>    - |-- widget_page.dart 获取Widget尺寸\u002F屏幕坐标示例\n\n### Thanks\n本库部分源码参考，正则，时间轴。  \nBlankj [AndroidUtilCode](https:\u002F\u002Fgithub.com\u002FBlankj\u002FAndroidUtilCode) 强大易用的安卓工具类库。   \nAndres Araujo [timeago](https:\u002F\u002Fgithub.com\u002Fandresaraujo\u002Ftimeago.dart) Dart时间轴库。   \na14n [decimal](https:\u002F\u002Fgithub.com\u002Fa14n\u002Fdart-decimal) 精确运算，避免精度丢失。\n\n### 关于作者\nGitHub : [Sky24n](https:\u002F\u002Fgithub.com\u002FSky24n)  \n掘金 &nbsp;&nbsp;&nbsp;&nbsp;: [Sky24n](https:\u002F\u002Fjuejin.im\u002Fuser\u002F5b9e8a92e51d453df0440422\u002Fposts)  \n简书 &nbsp;&nbsp;&nbsp;&nbsp;: [Sky24n](https:\u002F\u002Fwww.jianshu.com\u002Fu\u002Fcbf2ad25d33a)\n\n### Changelog\nPlease see the [Changelog](CHANGELOG.md) page to know what's recently changed.\n\n### Apps\n[flutter_wanandroid](https:\u002F\u002Fgithub.com\u002FSky24n\u002Fflutter_wanandroid)  \n[Moss](https:\u002F\u002Fgithub.com\u002FSky24n\u002FMoss).  \nA GitHub client app developed with Flutter, which supports Android iOS Web.  \nWeb ：[Flutter Web](https:\u002F\u002Fsky24n.github.io\u002FSky24n\u002Fmoss).\n\n|![](https:\u002F\u002Fz3.ax1x.com\u002F2021\u002F04\u002F26\u002Fgp1hm6.jpg)|![](https:\u002F\u002Fz3.ax1x.com\u002F2021\u002F04\u002F26\u002Fgp1Tte.jpg)|![](https:\u002F\u002Fz3.ax1x.com\u002F2021\u002F04\u002F26\u002Fgp17fH.jpg)|\n|:---:|:---:|:---:|\n\n\n[flutter_wanandroid_qr]: https:\u002F\u002Fraw.githubusercontent.com\u002FSky24n\u002FLDocuments\u002Fmaster\u002FAppImgs\u002Fflutter_wanandroid\u002Fqrcode.png\n\n[common_utils_github]: https:\u002F\u002Fgithub.com\u002FSky24n\u002Fcommon_utils\n\n[flustars_github]: https:\u002F\u002Fgithub.com\u002FSky24n\u002Fflustars\n\n\n","Sky24n\u002Fcommon_utils 是一个针对 Dart 语言的常用工具类库，提供了包括日期处理、正则表达式验证、倒计时管理等在内的多种实用功能。该库的核心功能覆盖了从基础的数据类型转换（如 MoneyUtil 提供的货币单位转换）到复杂的对象操作（例如 ObjectUtil 中的对象非空判断），以及加密解密服务（EncryptUtil 支持的多种加解密方式）。此外，它还包含了方便的日志记录(LogUtil)和文本格式化(TextUtil)工具。适用于需要快速集成高效工具函数以提升开发效率的各种 Dart 或 Flutter 项目中，无论是移动应用还是桌面应用程序都能从中受益。",2,"2026-06-11 03:22:20","top_language"]