thl před 5 roky
rodič
revize
960d3a5b00

+ 4 - 0
CHANGELOG.md

@@ -1,3 +1,7 @@
+### 0.3.0
+
+* TODO: add ImageUtil, Refactor DirectoryUtil.
+
 ### 0.2.6+2
 
 * TODO: fix minimum version dependency.

+ 89 - 0
CHANGE_LOG.md

@@ -0,0 +1,89 @@
+## [更新说明](doc/UPDATELOG.md)
+
+v0.3.0
+新增ImageUtil。
+
+[common_utils](https://github.com/Sky24n/common_utils)新版本v1.1.3。  
+如果项目中使用了 flustars: ^0.2.6及以上版本。  
+删除pubspec.lock文件,直接运行flutter  packages get 即可使用最新版!
+
+v1.1.3 (2019.07.10)  
+1、新增TextUtil 银行卡号每隔4位加空格,每隔3三位加逗号,隐藏手机号等等.  
+2、新增EnDecodeUtil md5加密,Base64加/解密.  
+3、DateUtil 新增日期格式化,支持自定义格式输出。  
+4、LogUtil 支持输出超长log。  
+5、RegexUtil 支持199号段。
+```dart
+/// 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
+  
+/// TextUtil
+String phoneNo = TextUtil.formatSpace4("15845678910"); // 1584 5678 910
+String num     = TextUtil.formatComma3("12345678"); // 12,345,678
+String phoneNo = TextUtil.hideNumber("15845678910")// 158****8910
+```
+
+
+v0.2.6 (2019.06.11)  
+1.新增文件目录工具类
+```dart
+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');
+...
+```
+
+2.SpUtil全面支持读取对象,对象列表。
+```dart
+City hisCity = SpUtil.getObj("loc_city", (v) => City.fromJson(v));  
+List<City> _cityList = SpUtil.getObjList("loc_city_list", (v) => City.fromJson(v));
+```
+
+3.ScreenUtil 兼容横/纵屏适配。
+```dart
+double adapterSize = ScreenUtil.getInstance().getAdapterSize(100);
+double adapterSize = ScreenUtil.getAdapterSizeCtx(context, 100)
+```
+
+v0.2.5 (2019.03.07)  
+WidgetUtil 新增获取图片尺寸。  
+/// get image width height,load error return Rect.zero.(unit px)  
+/// 获取图片宽高,加载错误情况返回 Rect.zero.(单位 px)  
+Future<Rect> getImageWH({Image image, String url, String localUrl, String package});
+
+/// get image width height, load error throw exception.(unit px)  
+/// 获取图片宽高,加载错误会抛出异常.(单位 px)  
+Future<Rect> getImageWHE({Image image, String url, String localUrl, String package});
+```dart
+/// 获取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);
+
+/// 获取网络图片尺寸
+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();
+});
+```

+ 580 - 0
README-EN.md

@@ -0,0 +1,580 @@
+Language: English | [中文简体](https://github.com/Sky24n/flustars)
+
+# flustars(Flutter common utils library)
+[![Pub](https://img.shields.io/pub/v/flustars.svg?style=flat-square)](https://pub.dartlang.org/packages/flustars)  
+
+Flutter common utils library, SharedPreferences Util, Screen Util, Directory Util, Widget Util, Image Util。If you have good tools, welcome PR.
+
+Pub [flustars](https://pub.flutter-io.cn/packages/flustars)
+
+[✓] Flutter (Channel stable, v1.12.13+hotfix.9, locale zh-Hans-CN)
+
+## Get started
+
+### Add dependency
+```yaml
+dependencies:
+  flustars: ^0.3.0
+  
+import 'package:flustars/flustars.dart';
+
+or
+
+// git (version 0.3.0)
+dependencies:
+  flustars:
+    git:
+      url: git://github.com/Sky24n/flustars.git
+```
+
+### [Change Log](CHANGE_LOG.md)
+
+v0.3.0
+add ImageUtil。
+
+### Flutter common util library [flustars][flustars_github]
+ 1、SpUtil       : SharedPreferences util, support save object, object list.  
+ 2、ScreenUtil   : adapter size,screen size.  
+ 3、WidgetUtil   : Widget rendering listener,get Widget Bounds.  
+ 4、DioUtil      : dio util move to [DioUtil](https://github.com/Sky24n/FlutterRepos/blob/master/base_library/lib/src/data/net/dio_util.dart)。  
+ 5、ImageUtil    : get image size.
+
+### Dart common util library [common_utils][common_utils_github]
+ 1、TimelineUtil : timeline util.  
+ 2、TimerUtil    : timer util.  
+ 3、MoneyUtil    : money util.  
+ 4、LogUtil      : log util.  
+ 5、DateUtil     : date util.  
+ 6、RegexUtil    : regex util, mobile, email, date.
+ 7、NumUtil      : num util.  
+ 8、ObjectUtil   : object util.
+ 9、TextUtil     : TextUtil.  
+ 10、EncryptUtil : EncryptUtil.  
+ 11、JsonUtil    : JsonUtil.
+
+
+### APIs
+
+* #### SpUtil -> [Example](./example/lib/main.dart)
+```dart
+getObj
+getObjList
+putObject
+getObject
+putObjectList
+getObjectList
+getString
+putString
+getBool
+putBool
+getInt
+putInt
+getDouble
+putDouble
+getStringList
+putStringList
+getDynamic
+haveKey
+getKeys
+remove
+clear
+isInitialized
+  
+  
+/// SpUtil使用:
+/// 方式一
+/// 等待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(
+      home: SplashPage(),
+    );
+  }
+}  
+
+
+/// 方式二
+/// 增加闪屏页,在闪屏页SpUtil初始化完成, await SpUtil.getInstance();
+/// 跳转到主页后,可以直接同步使用。 String defName = SpUtil.getString("username");
+   
+import 'package:flustars/flustars.dart'; 
+  
+/// SpUtil详细使用示例!  
+void main() => runApp(MyApp());
+  
+class MyApp extends StatefulWidget {
+  @override
+  State<StatefulWidget> createState() {
+    return MyAppState();
+  }
+}
+  
+class MyAppState extends State<MyApp> {
+  @override
+  void initState() {
+    super.initState();
+    _initAsync();
+  }
+  
+  _initAsync() async {
+    /// App启动时读取Sp数据,需要异步等待Sp初始化完成。
+    await SpUtil.getInstance();
+
+    /// 同步使用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(
+      routes: {
+        '/MainPage': (ctx) => MyHomePage(),
+      },
+      home: SplashPage(),
+    );
+  }
+}  
+  
+/// 闪屏页。
+class SplashPage extends StatefulWidget {
+  SplashPage({Key key}) : super(key: key);
+  
+  @override
+  _SplashPageState createState() => _SplashPageState();
+}
+  
+class _SplashPageState extends State<SplashPage> {
+  String _info = '';
+  
+  @override
+  void initState() {
+    super.initState();
+    _initAsync();
+  }
+  
+  _initAsync() async {
+    /// App启动时读取Sp数据,需要异步等待Sp初始化完成。
+    await SpUtil.getInstance();
+    Future.delayed(new Duration(milliseconds: 500), () {
+      /// 同步使用Sp。
+      /// 是否显示引导页。
+      if (SpUtil.getBool("key_guide", defValue: true)) {
+        SpUtil.putBool("key_guide", false);
+        _initBanner();
+      } else {
+        _initSplash();
+      }
+    });
+  }
+  
+  /// App引导页逻辑。
+  void _initBanner() {
+    setState(() {
+      _info = "引导页~";
+    });
+  }
+  
+  /// App广告页逻辑。
+  void _initSplash() {
+    setState(() {
+      _info = "广告页,2秒后跳转到主页";
+    });
+    Future.delayed(new Duration(milliseconds: 2000), () {
+      Navigator.of(context).pushReplacementNamed('/MainPage');
+    });
+  }
+  
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: Text("Splash"),
+      ),
+      body: new Center(
+        child: new Text("$_info"),
+      ),
+      floatingActionButton: FloatingActionButton(
+        onPressed: () {
+          bool isGuide = SpUtil.getBool("key_guide", defValue: true);
+          if (isGuide) {
+            Navigator.of(context).pushReplacementNamed('/MainPage');
+          }
+        },
+        child: Icon(Icons.navigate_next),
+      ),
+    );
+  }
+}
+  
+class MyHomePage extends StatefulWidget {
+  MyHomePage({Key key}) : super(key: key);
+  
+  @override
+  _MyHomePageState createState() => _MyHomePageState();
+}
+  
+class _MyHomePageState extends State<MyHomePage> {
+  @override
+  void initState() {
+    super.initState();
+    
+    /// 同步使用Sp。
+   
+    /// 存取基础类型
+    SpUtil.putString("username", "Sky24n");
+    String userName = SpUtil.getString("username");
+    print("MyHomePage userName: " + userName);
+    
+    bool isFirst = SpUtil.getBool("userName", defValue: true);
+    SpUtil.putBool("isFirst", false);
+    print("MyHomePage isFirst: $isFirst");
+    
+    /// save object example.
+    /// 存储实体对象示例。
+    City city = new City();
+    city.name = "成都市";
+    SpUtil.putObject("loc_city", city);
+    
+    City hisCity = SpUtil.getObj("loc_city", (v) => City.fromJson(v));
+    print("City: " + (hisCity == null ? "null" : hisCity.toString()));
+    
+    /// save object list example.
+    /// 存储实体对象list示例。
+    List<City> list = new List();
+    list.add(new City(name: "成都市"));
+    list.add(new City(name: "北京市"));
+    SpUtil.putObjectList("loc_city_list", list);
+    
+    List<City> _cityList = SpUtil.getObjList("loc_city_list", (v) => City.fromJson(v));
+    print("City list: " + (_cityList == null ? "null" : _cityList.toString()));
+  }
+  
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+      appBar: AppBar(
+        title: Text("Home"),
+      ),
+      body: new Center(
+        child: new Text(SpUtil.getString("username")),
+      ),
+    );
+  }
+}
+  
+class City {
+  String name;
+  
+  City({this.name});
+  
+  /// 必须写.
+  City.fromJson(Map<String, dynamic> json) : name = json['name'];
+  
+  /// 必须写.
+  Map<String, dynamic> toJson() => {
+        'name': name,
+      };
+  
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer('{');
+    sb.write("\"name\":\"$name\"");
+    sb.write('}');
+    return sb.toString();
+  }
+}
+
+```
+
+* #### ScreenUtil -> [Example](./example/lib/main.dart) 
+```dart
+getWidth                  : 返回根据屏幕宽适配后尺寸.
+getHeight                 : 返回根据屏幕高适配后尺寸.
+getWidthPx                : 返回根据屏幕宽适配后尺寸.
+getHeightPx               : 返回根据屏幕高适配后尺寸.
+getSp                     : 返回根据屏幕宽适配后字体尺寸.
+screenWidth               : 获取屏幕宽.
+screenHeight              : 获取屏幕高.
+screenDensity             : 获取屏幕密度.
+appBarHeight              : 获取系统AppBar高度.
+statusBarHeight           : 获取系统状态栏高度.
+getScreenW(ctx)           : 当前屏幕 宽.
+getScreenH(ctx)           : 当前屏幕 高.
+getStatusBarH(ctx)        : 当前状态栏高度.
+getBottomBarH(ctx)        : 当前BottomBar高度.
+getScaleW(ctx,size)       : 返回根据屏幕宽适配后尺寸.
+getScaleH(ctx,size)       : 返回根据屏幕高适配后尺寸.
+getScaleSp(ctx,size)      : 返回根据屏幕宽适配后字体尺寸.  
+getScaleSp(ctx,size)      : 返回根据屏幕宽适配后字体尺寸.  
+
+///旧适配方法仅适用于纵屏适配。
+///推荐使用以下新适配方法。
+getAdapterSize(size)             : 返回适配后尺寸,可用于宽,高,字体尺寸.  
+getAdapterSizeCtx(ctx,size)      : 返回适配后尺寸,可用于宽,高,字体尺寸.   
+
+double adapterSize = ScreenUtil.getInstance().getAdapterSize(100);
+double adapterSize = ScreenUtil.getAdapterSizeCtx(context, 100);
+  
+一、不依赖context
+// 屏幕宽
+double screenWidth = ScreenUtil.getInstance().screenWidth;
+// 屏幕高
+double screenHeight = ScreenUtil.getInstance().screenHeight;
+// 屏幕像素密度
+double screenDensity = ScreenUtil.getInstance().screenDensity;
+// 系统状态栏高度
+double statusBarHeight = ScreenUtil.getInstance().statusBarHeight;
+// BottomBar高度 
+double bottomBarHeight = ScreenUtil.getInstance().bottomBarHeight;
+// 系统AppBar高度
+double appBarHeight = ScreenUtil.getInstance().appBarHeight;
+// 根据屏幕宽适配后尺寸
+double adapterW100 = ScreenUtil.getInstance().getWidth(100);
+// 根据屏幕高适配后尺寸
+double adapterH100 = ScreenUtil.getInstance().getHeight(100);
+// 根据屏幕宽适配后字体尺寸
+double adapterSp100 = ScreenUtil.getInstance().getSp(100);
+// 根据屏幕宽适配后尺寸(输入px)
+double adapterW100px = ScreenUtil.getInstance().getWidthPx(300);
+// 根据屏幕高适配后尺寸(输入px)
+double adapterH100px = ScreenUtil.getInstance().getHeightPx(300);
+  
+二、依赖context
+// 屏幕宽
+double screenWidth = ScreenUtil.getScreenW(context);
+// 屏幕高
+double screenHeight = ScreenUtil.getScreenH(context);
+// 屏幕像素密度
+double screenDensity = ScreenUtil.getScreenDensity(context);
+// 系统状态栏高度
+double statusBarHeight = ScreenUtil.getStatusBarH(context);
+// BottomBar高度
+double bottomBarHeight = ScreenUtil.getBottomBarH(context);
+// 根据屏幕宽适配后尺寸
+double adapterW100 = ScreenUtil.getScaleW(context, 100);
+// 根据屏幕高适配后尺寸
+double adapterH100 = ScreenUtil.getScaleH(context, 100);
+// 根据屏幕宽适配后字体尺寸
+double adapterSp100 = ScreenUtil.getScaleSp(context, 100);
+// 屏幕方向
+Orientation orientation = ScreenUtil.getOrientation(context);
+
+```
+
+* #### DirectoryUtil
+```dart
+setInitDir
+initTempDir
+initAppDocDir
+initAppSupportDir
+initStorageDir
+createDirSync
+createDir
+getTempPath
+getAppDocPath
+getAppSupportPath
+getStoragePath
+createTempDirSync
+createAppDocDirSync
+createStorageDirSync
+createTempDir
+createAppDocDir
+createStorageDir
+
+    await DirectoryUtil.getInstance();
+    String tempPath = DirectoryUtil.getTempPath(
+        category: 'Pictures', fileName: 'demo', format: 'png');
+    print("thll  tempPath: $tempPath");
+
+    String appDocPath = DirectoryUtil.getAppDocPath(
+        category: 'Pictures', fileName: 'demo', format: 'png');
+    print("thll  appDocPath: $appDocPath");
+
+    String appSupportPath = DirectoryUtil.getAppSupportPath(
+        category: 'Pictures', fileName: 'demo', format: 'png');
+    print("thll  appSupportPath: $appSupportPath");
+
+    String storagePath = DirectoryUtil.getStoragePath(
+        category: 'Pictures', fileName: 'demo', format: 'png');
+    print("thll  storagePath: $storagePath");
+
+```
+
+* #### WidgetUtil -> [Example1](https://github.com/Sky24n/flutter_wanandroid/blob/master/lib/demos/widget_page.dart),[Example2](https://github.com/Sky24n/flutter_wanandroid/blob/master/lib/demos/image_size_page.dart)
+```dart
+asyncPrepare              : Widget渲染监听,监听widget宽高变化,callback返回宽高等参数.
+getWidgetBounds           : 获取widget 宽高.
+getWidgetLocalToGlobal    : 获取widget在屏幕上的坐标.
+getImageWH                : 获取图片宽高,加载错误情况返回 Rect.zero.(单位 px). 
+getImageWHE               : 获取图片宽高,加载错误会抛出异常.(单位 px). 
+
+/// widget渲染监听。
+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);
+
+/// 获取网络图片尺寸
+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();
+});
+```
+
+* #### ImageUtil
+```dart
+getImageWH
+```
+
+* #### DioUtil (dio: ^1.0.13) 详细请求+解析请参考[flutter_wanandroid][flutter_wanandroid_github]项目。
+```dart
+// 打开debug模式.
+DioUtil.openDebug(); 
+
+// 配置网络参数.
+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);
+  
+// 网络请求日志  
+I/flutter ( 5922): ----------------Http Log----------------
+I/flutter ( 5922): [statusCode]:   200
+I/flutter ( 5922): [request   ]:   method: GET  baseUrl: http://www.wanandroid.com/  path: lg/collect/list/0/json
+I/flutter ( 5922): [reqdata   ]:   null
+I/flutter ( 5922): [response  ]:   {data: {curPage: 1, datas: [], offset: 0, over: true, pageCount: 0, size: 20, total: 0}, errorCode: 0, errorMsg: }
+```
+
+### [Flutter Demos](https://github.com/Sky24n/flutter_wanandroid/tree/master/lib/demos)   
+ 
+>- |--demos
+>    - |-- city_select_page.dart 城市列表(索引&悬停)示例
+>    - |-- date_page.dart 日期格式化示例
+>    - |-- image_size_page.dart 获取网络/本地图片尺寸示例
+>    - |-- money_page.dart 金额(元转分/分转元)示例
+>    - |-- pinyin_page.dart 汉字转拼音示例
+>    - |-- regex_page.dart 正则工具类示例
+>    - |-- round_portrait_page.dart 圆形圆角头像示例
+>    - |-- timeline_page.dart 时间轴示例
+>    - |-- timer_page.dart 倒计时/定时任务示例
+>    - |-- widget_page.dart 获取Widget尺寸/屏幕坐标示例
+
+## 点击下载APK : [v0.1.x][flutter_wanandroid_apk] 
+## 扫码下载APK :
+  ![flutter_wanandroid][flutter_wanandroid_qr] 
+
+### Screenshots
+<img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20181003-234414.jpg" width="200">   <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20181003-211011.jpg" width="200">   <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20180930-012302.jpg" width="200">  
+<img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20180930-012431.jpg" width="200">  <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20180919-231618.jpg" width="200">   <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20180926-144840.png" width="200">  
+<img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20180919-224204.jpg" width="200">   <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20180919-224146.jpg" width="200">   <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20180919-224231.jpg" width="200">   
+
+### 关于作者
+GitHub : [Sky24n](https://github.com/Sky24n)  
+简书 &nbsp;&nbsp;&nbsp;&nbsp;: [Sky24n](https://www.jianshu.com/u/cbf2ad25d33a)  
+掘金 &nbsp;&nbsp;&nbsp;&nbsp;: [Sky24n](https://juejin.im/user/5b9e8a92e51d453df0440422/posts)  
+Pub &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: [Sky24n](https://pub.flutter-io.cn/packages?q=email%3Asky24no%40gmail.com)
+
+如果您觉得本项目不错的话,来个star支持下作者吧!  
+  
+Flutter全局屏幕适配 [auto_size](https://github.com/flutterchina/auto_size)  
+  
+[![GitHub stars](https://img.shields.io/github/stars/flutterchina/auto_size.svg?style=social&label=Star)](https://github.com/flutterchina/auto_size) [![GitHub forks](https://img.shields.io/github/forks/flutterchina/auto_size.svg?style=social&label=Fork)](https://github.com/flutterchina/auto_size) [![GitHub watchers](https://img.shields.io/github/watchers/flutterchina/auto_size.svg?style=social&label=Watch)](https://github.com/flutterchina/auto_size)  
+  
+Flutter版玩安卓 [flutter_wanandroid](https://github.com/Sky24n/flutter_wanandroid)  
+  
+[![GitHub stars](https://img.shields.io/github/stars/Sky24n/flutter_wanandroid.svg?style=social&label=Star)](https://github.com/Sky24n/flutter_wanandroid) [![GitHub forks](https://img.shields.io/github/forks/Sky24n/flutter_wanandroid.svg?style=social&label=Fork)](https://github.com/Sky24n/flutter_wanandroid) [![GitHub watchers](https://img.shields.io/github/watchers/Sky24n/flutter_wanandroid.svg?style=social&label=Watch)](https://github.com/Sky24n/flutter_wanandroid)  
+  
+Flutter仿滴滴出行 [GreenTravel](https://github.com/Sky24n/GreenTravel)  
+  
+[![GitHub stars](https://img.shields.io/github/stars/Sky24n/GreenTravel.svg?style=social&label=Star)](https://github.com/Sky24n/GreenTravel) [![GitHub forks](https://img.shields.io/github/forks/Sky24n/GreenTravel.svg?style=social&label=Fork)](https://github.com/Sky24n/GreenTravel) [![GitHub watchers](https://img.shields.io/github/watchers/Sky24n/GreenTravel.svg?style=social&label=Watch)](https://github.com/Sky24n/GreenTravel)  
+  
+Flutter常用工具类库 [flustars](https://github.com/Sky24n/flustars)  
+  
+[![GitHub stars](https://img.shields.io/github/stars/Sky24n/flustars.svg?style=social&label=Star)](https://github.com/Sky24n/flustars) [![GitHub forks](https://img.shields.io/github/forks/Sky24n/flustars.svg?style=social&label=Fork)](https://github.com/Sky24n/flustars) [![GitHub watchers](https://img.shields.io/github/watchers/Sky24n/flustars.svg?style=social&label=Watch)](https://github.com/Sky24n/flustars)  
+  
+Dart常用工具类库 [common_utils](https://github.com/Sky24n/common_utils)  
+  
+[![GitHub stars](https://img.shields.io/github/stars/Sky24n/common_utils.svg?style=social&label=Star)](https://github.com/Sky24n/common_utils) [![GitHub forks](https://img.shields.io/github/forks/Sky24n/common_utils.svg?style=social&label=Fork)](https://github.com/Sky24n/common_utils) [![GitHub watchers](https://img.shields.io/github/watchers/Sky24n/common_utils.svg?style=social&label=Watch)](https://github.com/Sky24n/common_utils)  
+  
+Flutter城市列表 [azlistview](https://github.com/flutterchina/azlistview)  
+  
+[![GitHub stars](https://img.shields.io/github/stars/flutterchina/azlistview.svg?style=social&label=Star)](https://github.com/flutterchina/azlistview) [![GitHub forks](https://img.shields.io/github/forks/flutterchina/azlistview.svg?style=social&label=Fork)](https://github.com/flutterchina/azlistview) [![GitHub watchers](https://img.shields.io/github/watchers/flutterchina/azlistview.svg?style=social&label=Watch)](https://github.com/flutterchina/azlistview)  
+  
+Flutter汉字转拼音库 [lpinyin](https://github.com/flutterchina/lpinyin)  
+  
+[![GitHub stars](https://img.shields.io/github/stars/flutterchina/lpinyin.svg?style=social&label=Star)](https://github.com/flutterchina/lpinyin) [![GitHub forks](https://img.shields.io/github/forks/flutterchina/lpinyin.svg?style=social&label=Fork)](https://github.com/flutterchina/lpinyin) [![GitHub watchers](https://img.shields.io/github/watchers/flutterchina/lpinyin.svg?style=social&label=Watch)](https://github.com/flutterchina/lpinyin)  
+  
+Flutter国际化库 [fluintl](https://github.com/Sky24n/fluintl)  
+  
+[![GitHub stars](https://img.shields.io/github/stars/Sky24n/fluintl.svg?style=social&label=Star)](https://github.com/Sky24n/fluintl) [![GitHub forks](https://img.shields.io/github/forks/Sky24n/fluintl.svg?style=social&label=Fork)](https://github.com/Sky24n/fluintl) [![GitHub watchers](https://img.shields.io/github/watchers/Sky24n/fluintl.svg?style=social&label=Watch)](https://github.com/Sky24n/fluintl)  
+ 
+[flutter_wanandroid_github]: https://github.com/Sky24n/flutter_wanandroid
+[flutter_wanandroid_apk]: https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppStore/flutter_wanandroid.apk
+[flutter_wanandroid_qr]: https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_wanandroid/qrcode.png
+
+[common_utils_github]: https://github.com/Sky24n/common_utils
+
+[flustars_github]: https://github.com/Sky24n/flustars

+ 68 - 143
README.md

@@ -1,21 +1,22 @@
+Language: [English](README-EN.md) | 中文简体
+
 # flustars(Flutter常用工具类库)
-[![Pub](https://img.shields.io/pub/v/flustars.svg?style=flat-square)](https://pub.dartlang.org/packages/flustars)
+[![Pub](https://img.shields.io/pub/v/flustars.svg?style=flat-square)](https://pub.dartlang.org/packages/flustars)  
+
+flustars依赖于Dart常用工具类库[common_utils](https://github.com/Sky24n/common_utils),以及对其他第三方库封装,致力于为大家分享简单易用工具类。如果你有好的工具类欢迎PR.
+目前包含SharedPreferences Util, Screen Util, Directory Util, Widget Util, Image Util。
 
-flustars依赖于Dart常用工具类库[common_utils](https://github.com/Sky24n/common_utils),以及对其他第三方库封装,致力于为大家分享简单易用工具类。如果你有好的工具类欢迎PR. 
-目前包含SharedPreferences Util, Screen Util, Directory Util, Widget Util。
+Pub [flustars](https://pub.flutter-io.cn/packages/flustars)
 
-### 注意:
-由于path_provider库升级,导致Directory路径发生变更,请暂时不要使用DirectoryUtil,谢谢!!!
-v0.3.0版本package参数已删除!
+[✓] Flutter (Channel stable, v1.12.13+hotfix.9, locale zh-Hans-CN)
 
 ### 使用方式:
-```dart
+```yaml
 dependencies:
-  flustars: ^0.2.6+1
+  flustars: ^0.3.0
   
 import 'package:flustars/flustars.dart';
 
-
 or
 
 // git (version 0.3.0)
@@ -25,109 +26,18 @@ dependencies:
       url: git://github.com/Sky24n/flustars.git
 ```
 
-### 注意
-本库基于Flutter beta 分支开发。如不是该版本,请自行升级!
-```dart
-[✓] Flutter (Channel beta, v1.6.3, locale zh-Hans-CN)
-  
-//切换到flutter beta分支
-flutter channel beta
-  
-//升级
-flutter upgrade
-```
-
-## [更新说明](./doc/UPDATELOG.md)
-[common_utils](https://github.com/Sky24n/common_utils)新版本v1.1.3。  
-如果项目中使用了 flustars: ^0.2.6及以上版本。  
-删除pubspec.lock文件,直接运行flutter  packages get 即可使用最新版!  
-
-v1.1.3 (2019.07.10)  
-1、新增TextUtil 银行卡号每隔4位加空格,每隔3三位加逗号,隐藏手机号等等.  
-2、新增EnDecodeUtil md5加密,Base64加/解密.  
-3、DateUtil 新增日期格式化,支持自定义格式输出。  
-4、LogUtil 支持输出超长log。  
-5、RegexUtil 支持199号段。  
-```dart 
-/// 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
-  
-/// TextUtil
-String phoneNo = TextUtil.formatSpace4("15845678910"); // 1584 5678 910
-String num     = TextUtil.formatComma3("12345678"); // 12,345,678
-String phoneNo = TextUtil.hideNumber("15845678910")// 158****8910
-```
-
-  
-v0.2.6 (2019.06.11)  
-1.新增文件目录工具类
-```dart  
-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');
-...
-```
+### [Change Log](CHANGE_LOG.md)
 
-2.SpUtil全面支持读取对象,对象列表。
-```dart  
-City hisCity = SpUtil.getObj("loc_city", (v) => City.fromJson(v));  
-List<City> _cityList = SpUtil.getObjList("loc_city_list", (v) => City.fromJson(v));
-```   
+v0.3.0
+新增ImageUtil。
 
-3.ScreenUtil 兼容横/纵屏适配。
-```dart  
-double adapterSize = ScreenUtil.getInstance().getAdapterSize(100);
-double adapterSize = ScreenUtil.getAdapterSizeCtx(context, 100)
-``` 
-  
-v0.2.5 (2019.03.07)  
-WidgetUtil 新增获取图片尺寸。  
-/// get image width height,load error return Rect.zero.(unit px)  
-/// 获取图片宽高,加载错误情况返回 Rect.zero.(单位 px)  
-Future<Rect> getImageWH({Image image, String url, String localUrl, String package});  
-  
-/// get image width height, load error throw exception.(unit px)  
-/// 获取图片宽高,加载错误会抛出异常.(单位 px)  
-Future<Rect> getImageWHE({Image image, String url, String localUrl, String package});
-```dart
-/// 获取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);
-
-/// 获取网络图片尺寸
-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();
-});
-```
-
-### [Flutter工具类库 flustars][flustars_github]   
+### [Flutter工具类库 flustars][flustars_github]
  1、SpUtil       : 单例"同步"SharedPreferences工具类。支持get传入默认值,支持存储对象,支持存储对象数组。  
  2、ScreenUtil   : 屏幕适配,获取屏幕宽、高、密度,AppBar高,状态栏高度,屏幕方向.  
  3、WidgetUtil   : 监听Widget渲染状态,获取Widget宽高,在屏幕上的坐标,获取网络/本地图片尺寸.  
  4、DioUtil      : 单例Dio网络工具类(已迁移至此处[DioUtil](https://github.com/Sky24n/flutter_wanandroid/blob/master/lib/data/net/dio_util.dart))。
+ 5、ImageUtil    : 获取网络/本地图片尺寸.
 
 ### [Dart常用工具类库 common_utils][common_utils_github]  
  1、TimelineUtil : 时间轴.(新)  
@@ -137,35 +47,18 @@ WidgetUtil.getImageWHE(url: "Url").then((Rect rect) {
  5、DateUtil     : 日期转换格式化输出.  
  6、RegexUtil    : 正则验证手机号,身份证,邮箱等等.  
  7、NumUtil      : 保留x位小数, 精确加、减、乘、除, 防止精度丢失.  
- 8、ObjectUtil   : 判断对象是否为空(String List Map),判断两个List是否相等. 
+ 8、ObjectUtil   : 判断对象是否为空(String List Map),判断两个List是否相等.  
+ 9、TextUtil     : TextUtil.  
+ 10、EncryptUtil : EncryptUtil.  
+ 11、JsonUtil    : JsonUtil.
 
-### Add dependency
-```dart
-dependencies:
-  flustars: x.x.x  #latest version
-```
 
 ### APIs
-* #### DirectoryUtil
-```dart
-setInitDir
-initTempDir
-initAppDocDir
-createDirSync
-createDir
-getTempPath
-getAppDocPath
-getStoragePath
-createTempDirSync
-createAppDocDirSync
-createStorageDirSync
-createTempDir
-createAppDocDir
-createStorageDir
-```
 
 * #### SpUtil -> [Example](./example/lib/main.dart)
 ```dart
+getObj
+getObjList
 putObject
 getObject
 putObjectList
@@ -489,6 +382,45 @@ Orientation orientation = ScreenUtil.getOrientation(context);
 
 ```
 
+* #### DirectoryUtil
+```dart
+setInitDir
+initTempDir
+initAppDocDir
+initAppSupportDir
+initStorageDir
+createDirSync
+createDir
+getTempPath
+getAppDocPath
+getAppSupportPath
+getStoragePath
+createTempDirSync
+createAppDocDirSync
+createStorageDirSync
+createTempDir
+createAppDocDir
+createStorageDir
+
+    await DirectoryUtil.getInstance();
+    String tempPath = DirectoryUtil.getTempPath(
+        category: 'Pictures', fileName: 'demo', format: 'png');
+    print("thll  tempPath: $tempPath");
+
+    String appDocPath = DirectoryUtil.getAppDocPath(
+        category: 'Pictures', fileName: 'demo', format: 'png');
+    print("thll  appDocPath: $appDocPath");
+
+    String appSupportPath = DirectoryUtil.getAppSupportPath(
+        category: 'Pictures', fileName: 'demo', format: 'png');
+    print("thll  appSupportPath: $appSupportPath");
+
+    String storagePath = DirectoryUtil.getStoragePath(
+        category: 'Pictures', fileName: 'demo', format: 'png');
+    print("thll  storagePath: $storagePath");
+
+```
+
 * #### WidgetUtil -> [Example1](https://github.com/Sky24n/flutter_wanandroid/blob/master/lib/demos/widget_page.dart),[Example2](https://github.com/Sky24n/flutter_wanandroid/blob/master/lib/demos/image_size_page.dart)
 ```dart
 asyncPrepare              : Widget渲染监听,监听widget宽高变化,callback返回宽高等参数.
@@ -537,6 +469,11 @@ WidgetUtil.getImageWHE(url: "Url").then((Rect rect) {
 });
 ```
 
+* #### ImageUtil
+```dart
+getImageWH
+```
+
 * #### DioUtil (dio: ^1.0.13) 详细请求+解析请参考[flutter_wanandroid][flutter_wanandroid_github]项目。
 ```dart
 // 打开debug模式.
@@ -589,7 +526,7 @@ I/flutter ( 5922): [response  ]:   {data: {curPage: 1, datas: [], offset: 0, ove
 ## 扫码下载APK :
   ![flutter_wanandroid][flutter_wanandroid_qr] 
 
-### Screenshot
+### Screenshots
 <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20181003-234414.jpg" width="200">   <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20181003-211011.jpg" width="200">   <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20180930-012302.jpg" width="200">  
 <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20180930-012431.jpg" width="200">  <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20180919-231618.jpg" width="200">   <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20180926-144840.png" width="200">  
 <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20180919-224204.jpg" width="200">   <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20180919-224146.jpg" width="200">   <img src="https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/Screenshot_20180919-224231.jpg" width="200">   
@@ -598,8 +535,7 @@ I/flutter ( 5922): [response  ]:   {data: {curPage: 1, datas: [], offset: 0, ove
 GitHub : [Sky24n](https://github.com/Sky24n)  
 简书 &nbsp;&nbsp;&nbsp;&nbsp;: [Sky24n](https://www.jianshu.com/u/cbf2ad25d33a)  
 掘金 &nbsp;&nbsp;&nbsp;&nbsp;: [Sky24n](https://juejin.im/user/5b9e8a92e51d453df0440422/posts)  
-Pub &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: [Sky24n](https://pub.flutter-io.cn/packages?q=email%3A863764940%40qq.com)    
-Email &nbsp;&nbsp;: 863764940@qq.com  
+Pub &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: [Sky24n](https://pub.flutter-io.cn/packages?q=email%3Asky24no%40gmail.com)
 
 如果您觉得本项目不错的话,来个star支持下作者吧!  
   
@@ -639,17 +575,6 @@ Flutter国际化库 [fluintl](https://github.com/Sky24n/fluintl)
 [flutter_wanandroid_apk]: https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppStore/flutter_wanandroid.apk
 [flutter_wanandroid_qr]: https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_wanandroid/qrcode.png
 
-[flutter_demos_github]: https://github.com/Sky24n/flutter_demos
-[flutter_demos_apk]: https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppStore/flutter_demos.apk
-[flutter_demos_qr]: https://raw.githubusercontent.com/Sky24n/LDocuments/master/AppImgs/flutter_demos/qrcode.png
-
 [common_utils_github]: https://github.com/Sky24n/common_utils
 
-[flustars_github]: https://github.com/Sky24n/flustars
-
-[jianshuSvg]: https://img.shields.io/badge/简书-@Sky24n-536dfe.svg
-[jianshu]: https://www.jianshu.com/u/cbf2ad25d33a
-
-[juejinSvg]: https://img.shields.io/badge/掘金-@Sky24n-536dfe.svg
-[juejin]: https://juejin.im/user/5b9e8a92e51d453df0440422
-
+[flustars_github]: https://github.com/Sky24n/flustars

+ 1 - 1
example/.flutter-plugins-dependencies

@@ -1 +1 @@
-{"_info":"// This is a generated file; do not edit or check into version control.","dependencyGraph":[{"name":"path_provider","dependencies":["path_provider_macos"]},{"name":"path_provider_macos","dependencies":[]},{"name":"shared_preferences","dependencies":[]}]}
+{"_info":"// This is a generated file; do not edit or check into version control.","dependencyGraph":[{"name":"path_provider","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_macos","shared_preferences_web"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]}]}

+ 14 - 8
example/ios/Podfile.lock

@@ -2,32 +2,38 @@ PODS:
   - Flutter (1.0.0)
   - path_provider (0.0.1):
     - Flutter
-  - path_provider_macos (0.0.1):
-    - Flutter
   - shared_preferences (0.0.1):
     - Flutter
+  - shared_preferences_macos (0.0.1):
+    - Flutter
+  - shared_preferences_web (0.0.1):
+    - Flutter
 
 DEPENDENCIES:
   - Flutter (from `Flutter`)
   - path_provider (from `.symlinks/plugins/path_provider/ios`)
-  - path_provider_macos (from `.symlinks/plugins/path_provider_macos/ios`)
   - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`)
+  - shared_preferences_macos (from `.symlinks/plugins/shared_preferences_macos/ios`)
+  - shared_preferences_web (from `.symlinks/plugins/shared_preferences_web/ios`)
 
 EXTERNAL SOURCES:
   Flutter:
     :path: Flutter
   path_provider:
     :path: ".symlinks/plugins/path_provider/ios"
-  path_provider_macos:
-    :path: ".symlinks/plugins/path_provider_macos/ios"
   shared_preferences:
     :path: ".symlinks/plugins/shared_preferences/ios"
+  shared_preferences_macos:
+    :path: ".symlinks/plugins/shared_preferences_macos/ios"
+  shared_preferences_web:
+    :path: ".symlinks/plugins/shared_preferences_web/ios"
 
 SPEC CHECKSUMS:
   Flutter: 0e3d915762c693b495b44d77113d4970485de6ec
-  path_provider: fb74bd0465e96b594bb3b5088ee4a4e7bb1f2a9d
-  path_provider_macos: f760a3c5b04357c380e2fddb6f9db6f3015897e0
-  shared_preferences: 1feebfa37bb57264736e16865e7ffae7fc99b523
+  path_provider: f96fff6166a8867510d2c25fdcc346327cc4b259
+  shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d
+  shared_preferences_macos: f3f29b71ccbb56bf40c9dd6396c9acf15e214087
+  shared_preferences_web: 141cce0c3ed1a1c5bf2a0e44f52d31eeb66e5ea9
 
 PODFILE CHECKSUM: 3dbe063e9c90a5d7c9e4e76e70a821b9e2c1d271
 

+ 22 - 2
example/lib/main.dart

@@ -95,16 +95,23 @@ class MainPage extends StatefulWidget {
 /// Or use context-dependent methods to obtain screen parameters and adaptions.
 class MainPageState extends State<MainPage> {
   void test2() async {
+    print("thll xxxxxxxxxxx test7......");
     await DirectoryUtil.getInstance();
     String tempPath = DirectoryUtil.getTempPath(
         category: 'Pictures', fileName: 'demo', format: 'png');
     print("thll  tempPath: $tempPath");
+
     String appDocPath = DirectoryUtil.getAppDocPath(
         category: 'Pictures', fileName: 'demo', format: 'png');
     print("thll  appDocPath: $appDocPath");
+
     String appSupportPath = DirectoryUtil.getAppSupportPath(
         category: 'Pictures', fileName: 'demo', format: 'png');
     print("thll  appSupportPath: $appSupportPath");
+
+    String storagePath = DirectoryUtil.getStoragePath(
+        category: 'Pictures', fileName: 'demo', format: 'png');
+    print("thll  storagePath: $storagePath");
   }
 
   @override
@@ -113,6 +120,16 @@ class MainPageState extends State<MainPage> {
     test2();
   }
 
+  void test() async {
+    String _src =
+        "https://dsd361-oss1.oss-cn-beijing.aliyuncs.com/upload/advert/2d56ad78-472d-4eaf-b1f1-9a6887089d17.gif";
+
+    Rect rect2 = await WidgetUtil.getImageWH(url: _src);
+
+//    ImageUtil imageUtil = ImageUtil();
+//    imageUtil.getImageWH().then((Rect rect) {});
+  }
+
   @override
   Widget build(BuildContext context) {
     /// 如果使用依赖不context方法获取屏幕参数及适配,需要调用此方法。
@@ -142,8 +159,11 @@ class MainPageState extends State<MainPage> {
           IconButton(
             icon: Icon(Icons.search),
             onPressed: () {
-              Navigator.push(context,
-                  CupertinoPageRoute<void>(builder: (ctx) => SecondPage()));
+              print("thll onPressed......");
+              //test2();
+              test();
+//              Navigator.push(context,
+//                  CupertinoPageRoute<void>(builder: (ctx) => SecondPage()));
             },
           ),
         ],

+ 2 - 1
lib/flustars.dart

@@ -3,6 +3,7 @@ library flustars;
 export 'src/ui/my_app_bar.dart';
 
 export 'src/directory_util.dart';
+export 'src/image_util.dart';
 export 'src/screen_util.dart';
-export 'src/widget_util.dart';
 export 'src/sp_util.dart';
+export 'src/widget_util.dart';

+ 7 - 4
lib/src/directory_util.dart

@@ -26,10 +26,10 @@ import 'package:synchronized/synchronized.dart';
 /// 在iOS上,这个函数抛出一个[UnsupportedError],因为它不可能访问应用程序的沙箱之外。
 /// 在Android上,它使用`getExternalFilesDir(null)`。
 
-bool _initTempDir = true;
-bool _initAppDocDir = true;
-bool _initAppSupportDir = true;
-bool _initStorageDir = true;
+bool _initTempDir = false;
+bool _initAppDocDir = false;
+bool _initAppSupportDir = false;
+bool _initStorageDir = false;
 
 /// 配置初始化Directory。
 void setInitDir({
@@ -81,6 +81,7 @@ class DirectoryUtil {
   DirectoryUtil._();
 
   Future _init() async {
+    int old = DateTime.now().millisecondsSinceEpoch;
     if (_initTempDir) {
       await initTempDir();
     }
@@ -93,6 +94,8 @@ class DirectoryUtil {
     if (_initStorageDir) {
       await initStorageDir();
     }
+    print(
+        "thll DirectoryUtil init : ${DateTime.now().millisecondsSinceEpoch - old}");
   }
 
   static Future<Directory> initTempDir() async {

+ 66 - 0
lib/src/image_util.dart

@@ -0,0 +1,66 @@
+import 'dart:async';
+
+import 'package:flutter/widgets.dart';
+
+/**
+ * @Author: Sky24n
+ * @GitHub: https://github.com/Sky24n
+ * @Email: sky24no@gmail.com
+ * @Description: Image Util.
+ * @Date: 2018/9/10
+ */
+
+/// Image Util.
+class ImageUtil {
+  ImageStreamListener _listener;
+  ImageStream _imageStream;
+
+  /// get image width height,load error throw exception.(unit px)
+  /// 获取图片宽高,加载错误会抛出异常.(单位 px)
+  /// image
+  /// url network
+  /// local url , package
+  Future<Rect> getImageWH({
+    Image image,
+    String url,
+    String localUrl,
+    String package,
+    ImageConfiguration configuration,
+  }) {
+    int start = DateTime.now().millisecondsSinceEpoch;
+    Completer<Rect> completer = Completer<Rect>();
+    _listener = ImageStreamListener(
+      (ImageInfo info, bool synchronousCall) {
+        int now = DateTime.now().millisecondsSinceEpoch;
+        print("thll ------------[${now - start}]---------------");
+        _imageStream.removeListener(_listener);
+        if (!completer.isCompleted) {
+          completer.complete(Rect.fromLTWH(
+              0, 0, info.image.width.toDouble(), info.image.height.toDouble()));
+        }
+      },
+      onError: (dynamic exception, StackTrace stackTrace) {
+        print(
+            "thll ------------[exception]---------------${exception?.toString()}");
+        _imageStream.removeListener(_listener);
+        if (!completer.isCompleted) {
+          completer.completeError(exception, stackTrace);
+        }
+      },
+    );
+
+    if (image == null &&
+        (url == null || url.isEmpty) &&
+        (localUrl == null || localUrl.isEmpty)) {
+      return Future.value(Rect.zero);
+    }
+    Image img = image != null
+        ? image
+        : ((url != null && url.isNotEmpty)
+            ? Image.network(url)
+            : Image.asset(localUrl, package: package));
+    _imageStream = img.image.resolve(configuration ?? ImageConfiguration());
+    _imageStream.addListener(_listener);
+    return completer.future;
+  }
+}

+ 50 - 17
lib/src/widget_util.dart

@@ -63,13 +63,23 @@ class WidgetUtil {
     return box == null ? Offset.zero : box.localToGlobal(Offset.zero);
   }
 
+  /// Suggest use ImageUtil instead.
+  ///
   /// get image width height,load error return Rect.zero.(unit px)
+  /// Gif is not supported.
   /// 获取图片宽高,加载错误情况返回 Rect.zero.(单位 px)
   /// image
   /// url network
   /// local url , package
-  static Future<Rect> getImageWH(
-      {Image image, String url, String localUrl, String package}) {
+
+  @deprecated
+  static Future<Rect> getImageWH({
+    Image image,
+    String url,
+    String localUrl,
+    String package,
+    ImageConfiguration configuration,
+  }) {
     if (image == null &&
         (url == null || url.isEmpty) &&
         (localUrl == null || localUrl.isEmpty)) {
@@ -82,27 +92,45 @@ class WidgetUtil {
             ? Image.network(url)
             : Image.asset(localUrl, package: package));
     img.image
-        .resolve(new ImageConfiguration())
-        .addListener(new ImageStreamListener(
-          (ImageInfo info, bool _) {
-            completer.complete(Rect.fromLTWH(0, 0, info.image.width.toDouble(),
-                info.image.height.toDouble()));
+        .resolve(configuration ?? ImageConfiguration())
+        .addListener(ImageStreamListener(
+          (ImageInfo info, bool synchronousCall) {
+            print(
+                "thll ImageStreamListener suc...... ${completer.isCompleted}");
+            if (!completer.isCompleted) {
+              completer.complete(Rect.fromLTWH(0, 0,
+                  info.image.width.toDouble(), info.image.height.toDouble()));
+            }
           },
           onError: (dynamic exception, StackTrace stackTrace) {
-            completer.completeError(exception, stackTrace);
+            print(
+                "thll ImageStreamListener fail...... ${completer.isCompleted}");
+            if (!completer.isCompleted) {
+              completer.complete(Rect.zero);
+            }
           },
         ));
     return completer.future;
   }
 
+  /// Suggest use ImageUtil instead.
+  ///
   /// get image width height, load error throw exception.(unit px)
+  /// Gif is not supported.
   /// 获取图片宽高,加载错误会抛出异常.(单位 px)
   /// image
   /// url network
   /// local url (full path/全路径,example:"assets/images/ali_connors.png",""assets/images/3.0x/ali_connors.png"" );
   /// package
-  static Future<Rect> getImageWHE(
-      {Image image, String url, String localUrl, String package}) {
+
+  @deprecated
+  static Future<Rect> getImageWHE({
+    Image image,
+    String url,
+    String localUrl,
+    String package,
+    ImageConfiguration configuration,
+  }) {
     if (image == null &&
         (url == null || url.isEmpty) &&
         (localUrl == null || localUrl.isEmpty)) {
@@ -115,17 +143,22 @@ class WidgetUtil {
             ? Image.network(url)
             : Image.asset(localUrl, package: package));
     img.image
-        .resolve(new ImageConfiguration())
-        .addListener(new ImageStreamListener(
-          (ImageInfo info, bool _) {
-            completer.complete(Rect.fromLTWH(0, 0, info.image.width.toDouble(),
-                info.image.height.toDouble()));
+        .resolve(configuration ?? ImageConfiguration())
+        .addListener(ImageStreamListener(
+          (ImageInfo info, bool synchronousCall) {
+            print("thll ImageStreamListener suc......");
+            if (!completer.isCompleted) {
+              completer.complete(Rect.fromLTWH(0, 0,
+                  info.image.width.toDouble(), info.image.height.toDouble()));
+            }
           },
           onError: (dynamic exception, StackTrace stackTrace) {
-            completer.completeError(exception, stackTrace);
+            print("thll ImageStreamListener fail......");
+            if (!completer.isCompleted) {
+              completer.completeError(exception, stackTrace);
+            }
           },
         ));
-
     return completer.future;
   }
 }

+ 4 - 2
pubspec.yaml

@@ -1,5 +1,5 @@
 name: flustars
-description: Flutter common utils library. SpUtil, ScreenUtil, WidgetUtil. SharedPreferences Util. Screen info & Screen adaptation. get image size.
+description: Flutter common utils library. SpUtil, ScreenUtil, WidgetUtil, ImageUtil. SharedPreferences Util. Screen info & Screen adaptation. get image size.
 version: 0.3.0
 author: Sky24n <863764940@qq.com>
 homepage: https://github.com/Sky24n/flustars
@@ -10,9 +10,11 @@ environment:
 dependencies:
   flutter:
     sdk: flutter
+  # Dart common utils library. https://github.com/Sky24n/common_utils
+  common_utils: '>=1.1.0 <3.0.0'
   # https://github.com/tekartik/synchronized.dart
   synchronized: '>=1.5.1 <4.0.0'
   # https://github.com/flutter/plugins/tree/master/packages/shared_preferences
   shared_preferences: '>=0.4.1 <3.0.0'
   # https://github.com/flutter/plugins/tree/master/packages/path_provider
-  path_provider: '>=1.1.0 <3.0.0'
+  path_provider: '>=1.2.0 <3.0.0'