Flutter全網(wǎng)最全常用工具類

Flutter工具類庫 flustars

1屎媳、SpUtil : 單例"同步"SharedPreferences工具類。
2、ScreenUtil : 屏幕工具類.
3、WidgetUtil : Widget具類.
4葬燎、DirectoryUtil : 文件目錄工具類。
5缚甩、DioUtil : 單例Dio網(wǎng)絡(luò)工具類谱净。

Dart常用工具類庫common_utils
1、TimelineUtil : 時間軸.
2擅威、TimerUtil : 倒計時壕探,定時任務(wù).
3、MoneyUtil : 精確轉(zhuǎn)換郊丛,元轉(zhuǎn)分李请,分轉(zhuǎn)元,支持格式輸出.
4厉熟、LogUtil : 簡單封裝打印日志.
5导盅、DateUtil : 日期轉(zhuǎn)換格式化輸出.
6、RegexUtil : 正則驗證手機號庆猫,身份證认轨,郵箱等等.
7、NumUtil : 保留x位小數(shù), 精確加月培、減嘁字、乘、除, 防止精度丟失.
8杉畜、ObjectUtil : 判斷對象是否為空(String List Map),判斷兩個List是否相等.
9纪蜒、EnDecodeUtil : md5加密,Base64加/解密.
10此叠、TextUtil : 銀行卡號每隔4位加空格纯续,每隔3三位加逗號,隱藏手機號等等.

SpUtil

單例"同步"SharedPreferences工具類灭袁。支持get傳入默認值猬错,支持存儲對象,支持存儲對象數(shù)組茸歧。由于SharedPreferences需要異步生成才能使用倦炒。
方式一:簡單粗暴,等待Sp生成后再運行app软瞎。示例項目一
方式二:增加splash頁面逢唤,在splash頁面完初始化,進入主頁就可以同步使用涤浇。示例項目二

/// 方式一
/// 等待sp初始化完成后再運行app鳖藕。
/// sp初始化時間 release模式下30ms左右,debug模式下100多ms只锭。
void main() async {
  await SpUtil.getInstance();
  runApp(MyApp());
}

class MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    /// 同步使用Sp著恩。
    SpUtil.remove("username");
    String defName = SpUtil.getString("username", defValue: "sky");
    SpUtil.putString("username", "sky24");
    String name = SpUtil.getString("username");
    print("MyApp defName: $defName, name: $name");
  }
  @override
  Widget build(BuildContext context) {
    return MaterialApp();
  }
} 

// App啟動時讀取Sp數(shù)據(jù),需要異步等待Sp初始化完成蜻展。
await SpUtil.getInstance();

// 常規(guī)存取示例页滚。
//支持默認值。String铺呵,bool裹驰,int,double片挂,StringList幻林。
SpUtil.putString("username", "sky24");
String defName = SpUtil.getString("username");
String defName = SpUtil.getString("username", defValue: "sky");

// 存取實體對象示例。
City city = new City();
city.name = "成都市";
// 存儲實體對象音念。
SpUtil.putObject("loc_city", city);
// 讀取實體對象沪饺。
City hisCity = SpUtil.getObj("loc_city", (v) => City.fromJson(v)); 

// 存取實體對象list示例。
List<City> list = new List();
list.add(new City(name: "成都市"));
list.add(new City(name: "北京市"));
// 存儲實體對象list闷愤。
SpUtil.putObjectList("loc_city_list", list);
// 讀取實體對象list整葡。
List<City> dataList = SpUtil.getObjList("loc_city_list", (v) => City.fromJson(v)); 

ScreenUtil

屏幕適配,兼容橫/縱屏切換適配讥脐,獲取屏幕寬遭居、高啼器、密度,AppBar高俱萍,狀態(tài)欄高度端壳,屏幕方向.

一、不依賴context
// 屏幕寬
double screenWidth = ScreenUtil.getInstance().screenWidth;
// 屏幕高
double screenHeight = ScreenUtil.getInstance().screenHeight;
// 屏幕像素密度
double screenDensity = ScreenUtil.getInstance().screenDensity;
// 系統(tǒng)狀態(tài)欄高度
double statusBarHeight = ScreenUtil.getInstance().statusBarHeight;
// BottomBar高度 
double bottomBarHeight = ScreenUtil.getInstance().bottomBarHeight;
// 系統(tǒng)AppBar高度
double appBarHeight = ScreenUtil.getInstance().appBarHeight;
// 獲取適配后的尺寸
double adapterSize = ScreenUtil.getInstance().getAdapterSize(100);

二枪蘑、依賴context
// 屏幕寬
double screenWidth = ScreenUtil.getScreenW(context);
// 屏幕高
double screenHeight = ScreenUtil.getScreenH(context);
// 屏幕像素密度
double screenDensity = ScreenUtil.getScreenDensity(context);
// 系統(tǒng)狀態(tài)欄高度
double statusBarHeight = ScreenUtil.getStatusBarH(context);
// BottomBar高度
double bottomBarHeight = ScreenUtil.getBottomBarH(context);
// 屏幕方向
Orientation orientation = ScreenUtil.getOrientation(context);
// 獲取適配后的尺寸
double adapterSize = ScreenUtil.getAdapterSizeCtx(context, 100);

WidgetUtil

監(jiān)聽Widget渲染狀態(tài)损谦,獲取Widget寬高,在屏幕上的坐標岳颇,獲取網(wǎng)絡(luò)/本地圖片尺寸.

asyncPrepare              : Widget渲染監(jiān)聽照捡,監(jiān)聽widget寬高變化,callback返回寬高等參數(shù).
getWidgetBounds           : 獲取widget 寬高.
getWidgetLocalToGlobal    : 獲取widget在屏幕上的坐標.
getImageWH                : 獲取圖片寬高,加載錯誤情況返回 Rect.zero.(單位 px). 
getImageWHE               : 獲取圖片寬高话侧,加載錯誤會拋出異常.(單位 px). 

/// widget渲染監(jiān)聽栗精。
WidgetUtil widgetUtil = new WidgetUtil();
widgetUtil.asyncPrepare(context, true, (Rect rect) {
  // widget渲染完成。
});

/// widget寬高掂摔。
Rect rect = WidgetUtil.getWidgetBounds(context);

/// widget在屏幕上的坐標术羔。
Offset offset = WidgetUtil.getWidgetLocalToGlobal(context);
  
/// 獲取CachedNetworkImage下的圖片尺寸
Image image = new Image(image: new CachedNetworkImageProvider("Url"));
Rect rect1 = await WidgetUtil.getImageWH(image: image);  

/// 其他image
Image imageAsset = new Image.asset("");
Image imageFile = new Image.file(File("path"));
Image imageNetwork = new Image.network("url");
Image imageMemory = new Image.memory(null);

/// 獲取網(wǎng)絡(luò)圖片尺寸
Rect rect2 = await WidgetUtil.getImageWH(url: "Url");

/// 獲取本地圖片尺寸 localUrl 需要全路徑
Rect rect3 = await WidgetUtil.getImageWH(localUrl: "assets/images/3.0x/ali_connors.png");

/// 其他方式
WidgetUtil.getImageWH(url: "Url").then((Rect rect) {
  print("rect: " + rect.toString();
});

WidgetUtil.getImageWHE(url: "Url").then((Rect rect) {
  print("rect: " + rect.toString();
}).catchError((error) {
  print("rect: " + error.toString();
});

DirectoryUtil

文件目錄工具類.

await DirectoryUtil.getInstance();
String path = DirectoryUtil.getTempPath(fileName: 'demo.png', category: 'image');
String path = DirectoryUtil.getAppDocPath(fileName: 'demo.mp4', category: 'video');
String path = DirectoryUtil.getStoragePath(fileName: 'flutterwanandroid.apk', package: 'com.thl.flutterwanandroid');

Directory dir = DirectoryUtil.createTempDirSync(package: 'doc', category: 'image');

DioUtil

單例DioUtil,已遷移至此處DioUtil乙漓。(基于v1.0.13级历,僅供參考~)

// 打開debug模式.
DioUtil.openDebug();   
  
// 配置網(wǎng)絡(luò)參數(shù).
Options options = DioUtil.getDefOptions();
options.baseUrl = "http://www.wanandroid.com/";
HttpConfig config = new HttpConfig(options: options);
DioUtil().setConfig(config);
  
// 兩種單例請求方式.
DioUtil().request<List>(Method.get, "banner/json");
DioUtil.getInstance().request(Method.get, "banner/json");
  
//示例
LoginReq req = new LoginReq('username', 'password');
DioUtil().request(Method.post, "user/login",data: req.toJson());
  
//示例
FormData formData = new FormData.from({
      "username": "username",
      "password": "password",
    });
DioUtil().requestR(Method.post, "user/login",data: rformData);

TextUtil

isEmpty                     : isEmpty.(新)
formatSpace4                : 每隔4位加空格,格式化銀行卡.(新)
formatComma3                : 每隔3三位加逗號.(新)
hidePhone                   : 隱藏手機號.(新)
replace                     : replace.(新)
split                       : split.(新)
  
/// example
String phoneNo = TextUtil.formatSpace4("15845678910"); // 1584 5678 910
String num     = TextUtil.formatComma3("1234"); // 123,4
String phoneNo = TextUtil.hidePhone("15845678910")// 158****8910

EnDecodeUtil

encodeMd5                   : md5 加密.(新)
encodeBase64                : Base64加密.(新)
decodeBase64()              : Base64解密.(新)

TimelineUtil

時間軸叭披。例如:微信朋友圈寥殖,微博時間軸,支付寶時間軸涩蜘。

///(xx)為可配置輸出
enum DayFormat {
  ///(小于10s->剛剛)嚼贡、x分鐘、x小時同诫、(昨天)粤策、x天.
  Simple,
  ///(小于10s->剛剛)、x分鐘误窖、x小時叮盘、[今年: (昨天/1天前)、(2天前)霹俺、MM-dd],[往年: yyyy-MM-dd].
  Common,
  ///小于10s->剛剛)柔吼、x分鐘、x小時丙唧、[今年: (昨天 HH:mm/1天前)愈魏、(2天前)、MM-dd HH:mm],[往年: yyyy-MM-dd HH:mm].
  Full,
}
///Timeline信息配置.
abstract class TimelineInfo {
  String suffixAgo(); //suffix ago(后綴 后).
  String suffixAfter(); //suffix after(后綴 前).
  String lessThanTenSecond() => ''; //just now(剛剛).
  String customYesterday() => ''; //Yesterday(昨天).優(yōu)先級高于keepOneDay
  bool keepOneDay(); //保持1天,example: true -> 1天前, false -> MM-dd.
  bool keepTwoDays(); //保持2天,example: true -> 2天前, false -> MM-dd.
  String oneMinute(int minutes); //a minute(1分鐘).
  String minutes(int minutes); //x minutes(x分鐘).
  String anHour(int hours); //an hour(1小時).
  String hours(int hours); //x hours(x小時).
  String oneDay(int days); //a day(1天).
  String days(int days); //x days(x天).
  DayFormat dayFormat(); //format.
}
setLocaleInfo               : 自定義設(shè)置配置信息.
formatByDateTime            : 格式輸出時間軸信息 by DateTime .
format                      : 格式輸出時間軸信息.

TimerUtil

倒計時,定時任務(wù)培漏。

setInterval                 : 設(shè)置Timer間隔.
setTotalTime                : 設(shè)置倒計時總時間.
startTimer()                : 啟動定時Timer.
startCountDown              : 啟動倒計時Timer.
updateTotalTime             : 重設(shè)倒計時總時間.
cancel                      : 取消計時器.
setOnTimerTickCallback      : 計時器回調(diào).
isActive                    : Timer是否啟動.

  TimerUtil timerUtil;
  //定時任務(wù)test
  timerUtil = new TimerUtil(mInterval: 1000);
  //timerUtil.setInterval(1000);
  timerUtil.setOnTimerTickCallback((int value) {
    LogUtil.e("TimerTick: " + value.toString());
  });
  timerUtil.startTimer();
  if (timerUtil != null) timerUtil.cancel(); //dispose()

  TimerUtil timerCountDown;
  //倒計時test
  timerCountDown = new TimerUtil(mInterval: 1000, mTotalTime: 3 * 1000);
//    timerCountDown.setInterval(1000);
//    timerCountDown.setTotalTime(3 * 1000);
  timerCountDown.setOnTimerTickCallback((int value) {
    double tick = (value / 1000);
    LogUtil.e("CountDown: " + tick.toInt().toString());
  });
  timerCountDown.startCountDown();
  if (timerCountDown != null) timerCountDown.cancel(); //dispose()

MoneyUtil

金額工具類溪厘,分/元互轉(zhuǎn),精確轉(zhuǎn)換,防止精度丟失北苟。

changeF2Y                   : 分 轉(zhuǎn) 元, format格式輸出.
changeFStr2YWithUnit        : 分字符串 轉(zhuǎn) 元, format 與 unit 格式 輸出.
changeF2YWithUnit           : 分 轉(zhuǎn) 元, format 與 unit 格式 輸出.
changeYWithUnit             : 元, format 與 unit 格式 輸出.
changeY2F                   : 元 轉(zhuǎn) 分.

LogUtil

簡單封裝打印日志桩匪,可完整輸出超長log打瘪。

init(isDebug, tag)          : isDebug: 模式, tag 標簽.
e(object, tag)              : 日志e
v(object, tag)              : 日志v友鼻,只在debug模式輸出.

DateUtil

日期工具類,支付自定義格式輸出闺骚。

enum DateFormat {
  DEFAULT, //yyyy-MM-dd HH:mm:ss.SSS
  NORMAL, //yyyy-MM-dd HH:mm:ss
  YEAR_MONTH_DAY_HOUR_MINUTE, //yyyy-MM-dd HH:mm
  YEAR_MONTH_DAY, //yyyy-MM-dd
  YEAR_MONTH, //yyyy-MM
  MONTH_DAY, //MM-dd
  MONTH_DAY_HOUR_MINUTE, //MM-dd HH:mm
  HOUR_MINUTE_SECOND, //HH:mm:ss
  HOUR_MINUTE, //HH:mm

  ZH_DEFAULT, //yyyy年MM月dd日 HH時mm分ss秒SSS毫秒
  ZH_NORMAL, //yyyy年MM月dd日 HH時mm分ss秒  /  timeSeparate: ":" --> yyyy年MM月dd日 HH:mm:ss
  ZH_YEAR_MONTH_DAY_HOUR_MINUTE, //yyyy年MM月dd日 HH時mm分  /  timeSeparate: ":" --> yyyy年MM月dd日 HH:mm
  ZH_YEAR_MONTH_DAY, //yyyy年MM月dd日
  ZH_YEAR_MONTH, //yyyy年MM月
  ZH_MONTH_DAY, //MM月dd日
  ZH_MONTH_DAY_HOUR_MINUTE, //MM月
  dd日 HH時mm分  /  timeSeparate: ":" --> MM月dd日 HH:mm
  ZH_HOUR_MINUTE_SECOND, //HH時mm分ss秒
  ZH_HOUR_MINUTE, //HH時mm分
}
formatDate                      : 格式化日期 DateTime.(新)
formatDateStr                   : 格式化日期 字符串.(新)
formatDateMs                    : 格式化日期 毫秒.(新)
getNowDateMs                    : 獲取現(xiàn)在 毫秒.
getNowDateStr                   : 獲取現(xiàn)在 日期字符串.(yyyy-MM-dd HH:mm:ss)
getDateMsByTimeStr              : 獲取毫秒 By 日期字符串(Format格式輸出).
getDateStrByTimeStr             : 獲取日期字符串 By 日期字符串(Format格式輸出).
getDateStrByMs                  : 獲取日期字符串 By 毫秒(Format格式輸出).
getDateStrByDateTime            : 獲取日期字符串 By DateTime(Format格式輸出).
getWeekDay                      : 獲取WeekDay By DateTime.
getZHWeekDay                    : 獲取星期 By DateTime.
getWeekDayByMs                  : 獲取WeekDay By 毫秒.
getZHWeekDayByMs                : 獲取星期 By 毫秒.
isLeapYearByYear                : 是否是閏年.
yearIsEqual                     : 是否同年.
getDayOfYear                    : 在今年的第幾天.
isYesterday                     : 是否是昨天.
isToday                         : 是否是今天.
isWeek                          : 是否是本周.(新)

/// DateUtil
DateUtil.formatDateMs(DateTime.now().millisecondsSinceEpoch, format: DataFormats.full); // 2019-07-09 16:51:14
DateUtil.formatDateStr("2019-07-09 16:51:14", format: "yyyy/M/d HH:mm:ss"); // 2019/7/9 16:51:14
DateUtil.formatDate(DateTime.now(), format: "yyyy/MM/dd HH:mm:ss");  // 2019/07/09 16:51:14

RegexUtil

正則工具類彩扔。

isMobileSimple            : 簡單驗證手機號
isMobileExact             : 精確驗證手機號
isTel                     : 驗證電話號碼
isIDCard                  : 驗證身份證號碼
isIDCard15                : 驗證身份證號碼 15 位
isIDCard18                : 簡單驗證身份證號碼 18 位
isIDCard18Exact           : 精確驗證身份證號碼 18 位
isEmail                   : 驗證郵箱
isURL                     : 驗證 URL
isZh                      : 驗證漢字
isDate                    : 驗證 yyyy-MM-dd 格式的日期校驗,已考慮平閏年
isIP                      : 驗證 IP 地址

NumUtil

數(shù)值運算工具類僻爽,保留x位小數(shù), 精確加虫碉、減、乘胸梆、除, 防止精度丟失.

getIntByValueStr            : 數(shù)字字符串轉(zhuǎn)int.
getDoubleByValueStr         : 數(shù)字字符串轉(zhuǎn)double.
getNumByValueStr            : 保留x位小數(shù) by 數(shù)字字符串.
getNumByValueDouble         : 保留x位小數(shù) by double.
add                         : 加(精確相加,防止精度丟失).
subtract                    : 減(精確相減,防止精度丟失).
multiply                    : 乘(精確相乘,防止精度丟失).
divide                      : 除(精確相除,防止精度丟失).

ObjectUtil

判斷對象是否為空(String List Map),判斷兩個List是否相等.

isEmptyString             : 判斷String是否為空.
isEmptyList               : 判斷List是否為空.
isEmptyMap                : 判斷Map是否為空.
isEmpty                   : 判斷對象是否為空.(String List Map).
isNotEmpty                : 判斷對象是否非空.(String List Map).
twoListIsEqual            : 判斷兩個List是否相等.

關(guān)于作者

GitHub : Sky24n
簡書 ????: Sky24n
掘金 ????: Sky24n
Pub ?????: Sky24n

項目示例

GitHub : flutter_demos
APK????? :點擊下載 v0.2.1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敦捧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碰镜,更是在濱河造成了極大的恐慌兢卵,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绪颖,死亡現(xiàn)場離奇詭異秽荤,居然都是意外死亡,警方通過查閱死者的電腦和手機柠横,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門窃款,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人牍氛,你說我怎么就攤上這事晨继。” “怎么了搬俊?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵紊扬,是天一觀的道長。 經(jīng)常有香客問我悠抹,道長珠月,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任楔敌,我火速辦了婚禮啤挎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己庆聘,他們只是感情好胜臊,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伙判,像睡著了一般象对。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宴抚,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天勒魔,我揣著相機與錄音,去河邊找鬼菇曲。 笑死冠绢,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的常潮。 我是一名探鬼主播弟胀,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼喊式!你這毒婦竟也來了孵户?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤岔留,失蹤者是張志新(化名)和其女友劉穎夏哭,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贸诚,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡方庭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了酱固。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片械念。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖运悲,靈堂內(nèi)的尸體忽然破棺而出龄减,到底是詐尸還是另有隱情,我是刑警寧澤班眯,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布希停,位于F島的核電站,受9級特大地震影響署隘,放射性物質(zhì)發(fā)生泄漏宠能。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一磁餐、第九天 我趴在偏房一處隱蔽的房頂上張望违崇。 院中可真熱鬧,春花似錦、人聲如沸羞延。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伴箩。三九已至入愧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗤谚,已是汗流浹背棺蛛。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呵恢,地道東北人鞠值。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓媚创,卻偏偏與公主長得像渗钉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子钞钙,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容