thl 6 лет назад
Родитель
Сommit
ed253a25ac
8 измененных файлов с 265 добавлено и 57 удалено
  1. 1 1
      CHANGELOG.md
  2. 74 7
      README.md
  3. 24 0
      doc/UPDATELOG.md
  4. 7 12
      example/lib/main.dart
  5. 3 2
      lib/flustars.dart
  6. 138 33
      lib/src/directory_util.dart
  7. 17 1
      lib/src/sp_util.dart
  8. 1 1
      pubspec.yaml

+ 1 - 1
CHANGELOG.md

@@ -1,6 +1,6 @@
 ### 0.2.6
 
-* TODO: xxx.
+* TODO: dependencies common_utils ,new DirectoryUtil, SpUtil add getObj,getObjList, ScreenUtil add getAdapterSize, getAdapterSizeCtx.
 
 ### 0.2.5+1
 

+ 74 - 7
README.md

@@ -1,8 +1,8 @@
 # flustars(Flutter常用工具类库)
 [![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, Widget Util。
+flustars依赖于Dart常用工具类库[common_utils](https://github.com/Sky24n/common_utils),以及对其他第三方库封装,致力于为大家分享简单易用工具类。如果你有好的工具类欢迎PR. 
+目前包含SharedPreferences Util, Screen Util, Directory Util, Widget Util。
 
 ### 关于使用本开源库规则
 如果您是用于公司项目,请随意使用~  
@@ -14,17 +14,37 @@
 ### 使用方式:
 ```dart
 dependencies:
-  flustars: ^0.2.5+1
+  flustars: ^0.2.6
   
 import 'package:flustars/flustars.dart';  
 ```
 
 ## [更新说明](./doc/UPDATELOG.md)
+🔥🔥🔥Flutter全局屏幕适配[auto_size](https://github.com/flutterchina/auto_size),欢迎使用~   
+  
+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> dataList = SpUtil.getObjList("loc_city_list", (v) => City.fromJson(v));
+```   
 
-
-
-🔥🔥🔥Flutter全局屏幕适配[auto_size](https://github.com/flutterchina/auto_size),欢迎使用~  
+3.ScreenUtil 兼容横/纵屏适配。
+```dart  
+double adapterSize = ScreenUtil.getInstance().getAdapterSize(100);
+double adapterSize = ScreenUtil.getAdapterSizeCtx(context, 100)
+``` 
   
 v0.2.5 (2019.03.07)  
 WidgetUtil 新增获取图片尺寸。  
@@ -87,6 +107,24 @@ dependencies:
 ```
 
 ### APIs
+* #### DirectoryUtil
+```dart
+setInitDir
+initTempDir
+initAppDocDir
+createDirSync
+createDir
+getTempPath
+getAppDocPath
+getStoragePath
+createTempDirSync
+createAppDocDirSync
+createStorageDirSync
+createTempDir
+createAppDocDir
+createStorageDir
+```
+
 * #### SpUtil -> [Example](./example/lib/main.dart)
 ```dart
 putObject
@@ -111,7 +149,36 @@ clear
 isInitialized
   
   
-/// SpUtil使用建议:
+/// 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");
    

+ 24 - 0
doc/UPDATELOG.md

@@ -1,4 +1,28 @@
 ## 更新说明
+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> dataList = 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)  

+ 7 - 12
example/lib/main.dart

@@ -50,7 +50,7 @@ class _MyAppState extends State<MyApp> {
 
     SpUtil.putString("username", "sky24");
     String userName = SpUtil.getString("username", defValue: "");
-    print("thll  thll userName: " + userName);
+    print("thll userName: " + userName);
 
     /// save object example.
     /// 存储实体对象示例。
@@ -58,10 +58,8 @@ class _MyAppState extends State<MyApp> {
     city.name = "成都市";
     SpUtil.putObject("loc_city", city);
 
-    Map dataStr = SpUtil.getObject("loc_city");
-    City hisCity = dataStr == null ? null : City.fromJson(dataStr);
-    print(
-        "thll  thll City: " + (hisCity == null ? "null" : hisCity.toString()));
+    City hisCity = SpUtil.getObj("loc_city", (v) => City.fromJson(v));
+    print("thll City: " + (hisCity == null ? "null" : hisCity.toString()));
 
     /// save object list example.
     /// 存储实体对象list示例。
@@ -70,13 +68,10 @@ class _MyAppState extends State<MyApp> {
     list.add(new City(name: "北京市"));
     SpUtil.putObjectList("loc_city_list", list);
 
-    List<Map> dataList = SpUtil.getObjectList("loc_city_list");
-    List<City> _cityList = dataList?.map((value) {
-      return City.fromJson(value);
-    })?.toList();
-
-    print("thll  thll CityList: " +
-        (_cityList == null ? "null" : _cityList.toString()));
+    List<City> dataList =
+        SpUtil.getObjList("loc_city_list", (v) => City.fromJson(v));
+    print(
+        "thll CityList: " + (dataList == null ? "null" : dataList.toString()));
   }
 
   @override

+ 3 - 2
lib/flustars.dart

@@ -1,9 +1,10 @@
 library flustars;
 
-export 'src/ui/my_app_bar.dart';
-
 export 'package:common_utils/common_utils.dart';
 
+export 'src/ui/my_app_bar.dart';
+
+export 'src/directory_util.dart';
 export 'src/screen_util.dart';
 export 'src/widget_util.dart';
 export 'src/sp_util.dart';

+ 138 - 33
lib/src/directory_util.dart

@@ -27,6 +27,17 @@ import 'package:synchronized/synchronized.dart';
 /// 在iOS上,这个函数抛出一个[UnsupportedError],因为它不可能访问应用程序的沙箱之外。
 /// 在Android上,它使用“getExternalStorageDirectory”API。
 
+bool _initTempDir = true;
+bool _initAppDocDir = true;
+bool _initStorageDir = true;
+
+/// 配置初始化Directory。
+void setInitDir({bool initTempDir, bool initAppDocDir, bool initStorageDir}) {
+  _initTempDir = initTempDir ?? _initTempDir;
+  _initAppDocDir = initAppDocDir ?? _initAppDocDir;
+  _initStorageDir = initStorageDir ?? _initStorageDir;
+}
+
 /**
  * @Author: thl
  * @GitHub: https://github.com/Sky24n
@@ -36,7 +47,7 @@ import 'package:synchronized/synchronized.dart';
  * @Date: 2019/05/09
  */
 
-///
+/// DirectoryUtil。
 class DirectoryUtil {
   static DirectoryUtil _singleton;
 
@@ -63,22 +74,76 @@ class DirectoryUtil {
 
   DirectoryUtil._();
 
-  Future _init() async {
-    _tempDir = await getTemporaryDirectory();
-    _appDocDir = await getApplicationDocumentsDirectory();
-    if (Platform.isAndroid) {
-      _storageDir = await getExternalStorageDirectory();
+  void _init() async {
+    if (_initTempDir) {
+      await initTempDir();
+    }
+    if (_initAppDocDir) {
+      await initAppDocDir();
+    }
+    if (_initStorageDir) {
+      await initStorageDir();
+    }
+  }
+
+  static void initTempDir() async {
+    if (_tempDir == null) {
+      _tempDir = await getTemporaryDirectory();
+    }
+  }
+
+  static void initAppDocDir() async {
+    if (_appDocDir == null) {
+      _appDocDir = await getApplicationDocumentsDirectory();
+    }
+  }
+
+  static void initStorageDir() async {
+    if (_storageDir == null) {
+      if (Platform.isAndroid) {
+        _storageDir = await getExternalStorageDirectory();
+      }
+      if (Platform.isIOS) {
+        _storageDir = await getApplicationSupportDirectory();
+      }
     }
-    if (Platform.isIOS) {
-      _storageDir = await getApplicationSupportDirectory();
+  }
+
+  /// 同步创建文件夹
+  static Directory createDirSync(String path) {
+    if (ObjectUtil.isEmpty(path)) return null;
+    Directory dir = new Directory(path);
+    if (!dir.existsSync()) {
+      dir.createSync(recursive: true);
+    }
+    return dir;
+  }
+
+  /// 异步创建文件夹
+  static Future<Directory> createDir(String path) async {
+    if (ObjectUtil.isEmpty(path)) return null;
+    Directory dir = new Directory(path);
+    bool exist = await dir.exists();
+    if (!exist) {
+      dir = await dir.create(recursive: true);
     }
+    return dir;
   }
 
-  static String getTempPath(
-      {String fileName,
-      String format,
-      String package = 'doc',
-      String category}) {
+  /// fileName 文件名
+  /// format 文件格式,如果文件名包含格式,则不需要
+  /// package 顶层文件夹名,默认doc
+  /// category 分类,例如:video,image等等
+  /// String path = DirectoryUtil.getTempPath(fileName: 'demo.png', category: 'image');
+  /// String path = DirectoryUtil.getTempPath(fileName: 'demo', format: 'png', category: 'image');
+  /// Android: /data/user/0/com.thl.flustars_example/cache/doc/image/demo.png
+  /// iOS: xxx;
+  static String getTempPath({
+    String fileName,
+    String format,
+    String package = 'doc',
+    String category,
+  }) {
     if (_tempDir == null) return null;
     StringBuffer sb = new StringBuffer("${_tempDir.path}");
     if (!ObjectUtil.isEmpty(package)) sb.write("/$package");
@@ -88,11 +153,20 @@ class DirectoryUtil {
     return sb.toString();
   }
 
-  static String getAppDocPath(
-      {String fileName,
-      String format,
-      String package = 'doc',
-      String category}) {
+  /// fileName 文件名
+  /// format 文件格式,如果文件名包含格式,则不需要
+  /// package 顶层文件夹名,默认doc
+  /// category 分类,例如:video,image等等
+  /// String path = DirectoryUtil.getAppDocPath(fileName: 'demo.mp4', category: 'video');
+  /// String path = DirectoryUtil.getAppDocPath(fileName: 'demo', format: 'mp4', category: 'video');
+  /// Android: /data/user/0/com.thl.flustars_example/app_flutter/doc/video/demo.mp4
+  /// iOS: xxx;
+  static String getAppDocPath({
+    String fileName,
+    String format,
+    String package = 'doc',
+    String category,
+  }) {
     if (_appDocDir == null) return null;
     StringBuffer sb = new StringBuffer("${_appDocDir.path}");
     if (!ObjectUtil.isEmpty(package)) sb.write("/$package");
@@ -102,8 +176,20 @@ class DirectoryUtil {
     return sb.toString();
   }
 
-  static String getStoragePath(
-      {String fileName, String format, String package, String category}) {
+  /// fileName 文件名
+  /// format 文件格式,如果文件名包含格式,则不需要
+  /// package 顶层文件夹名,建议使用包名
+  /// category 分类,例如:video,image等等
+  /// String path = DirectoryUtil.getStoragePath(fileName: 'flutterwanandroid.apk', package: 'com.thl.flutterwanandroid');
+  /// String path = DirectoryUtil.getStoragePath(fileName: 'flutterwanandroid', format: 'apk', package: 'com.thl.flutterwanandroid');
+  /// Android: /storage/emulated/0/com.thl.flutterwanandroid/flutterwanandroid.apk
+  /// iOS: xxx;
+  static String getStoragePath({
+    String fileName,
+    String format,
+    String package,
+    String category,
+  }) {
     if (_storageDir == null) return null;
     StringBuffer sb = new StringBuffer("${_storageDir.path}");
     if (!ObjectUtil.isEmpty(package)) sb.write("/$package");
@@ -113,20 +199,39 @@ class DirectoryUtil {
     return sb.toString();
   }
 
-  static Directory createDirSync(String path) {
-    Directory dir = new Directory(path);
-    if (!dir.existsSync()) {
-      dir.createSync(recursive: true);
-    }
-    return dir;
+  static Directory createTempDirSync({String package, String category}) {
+    String path = getTempPath(package: package, category: category);
+    return createDirSync(path);
   }
 
-  static Future<Directory> createDir(String path) async {
-    Directory dir = new Directory(path);
-    bool exist = await dir.exists();
-    if (!exist) {
-      dir = await dir.create(recursive: true);
-    }
-    return dir;
+  static Directory createAppDocDirSync({String package, String category}) {
+    String path = getAppDocPath(package: package, category: category);
+    return createDirSync(path);
+  }
+
+  static Directory createStorageDirSync({String package, String category}) {
+    String path = getStoragePath(package: package, category: category);
+    return createDirSync(path);
+  }
+
+  static Future<Directory> createTempDir(
+      {String package, String category}) async {
+    await initTempDir();
+    String path = getTempPath(package: package, category: category);
+    return createDir(path);
+  }
+
+  static Future<Directory> createAppDocDir(
+      {String package, String category}) async {
+    await initAppDocDir();
+    String path = getAppDocPath(package: package, category: category);
+    return createDir(path);
+  }
+
+  static Future<Directory> createStorageDir(
+      {String package, String category}) async {
+    await initStorageDir();
+    String path = getStoragePath(package: package, category: category);
+    return createDir(path);
   }
 }

+ 17 - 1
lib/src/sp_util.dart

@@ -36,7 +36,7 @@ class SpUtil {
 
   SpUtil._();
 
-  Future _init() async {
+  void _init() async {
     _prefs = await SharedPreferences.getInstance();
   }
 
@@ -46,6 +46,12 @@ class SpUtil {
     return _prefs.setString(key, value == null ? "" : json.encode(value));
   }
 
+  /// get obj.
+  static T getObj<T>(String key, T f(Map v), {T defValue}) {
+    Map map = getObject(key);
+    return map == null ? defValue : f(map);
+  }
+
   /// get object.
   static Map getObject(String key) {
     if (_prefs == null) return null;
@@ -62,6 +68,16 @@ class SpUtil {
     return _prefs.setStringList(key, _dataList);
   }
 
+  /// get obj list.
+  static List<T> getObjList<T>(String key, T f(Map v),
+      {List<T> defValue = const []}) {
+    List<Map> dataList = getObjectList(key);
+    List<T> list = dataList?.map((value) {
+      return f(value);
+    })?.toList();
+    return list ?? defValue;
+  }
+
   /// get object list.
   static List<Map> getObjectList(String key) {
     if (_prefs == null) return null;

+ 1 - 1
pubspec.yaml

@@ -1,7 +1,7 @@
 name: flustars
 description: Flutter common utils library. SpUtil, ScreenUtil, WidgetUtil. SharedPreferences Util. Screen info & Screen adaptation. get image size.
 version: 0.2.6
-author: thl <863764940@qq.com>
+author: Sky24n <863764940@qq.com>
 homepage: https://github.com/Sky24n/flustars
 
 environment: