Flutter开发之文件存储(手机缓存)

414 阅读2分钟

今天开发缓存图片到本地的功能。遇到一些问题,记录一下。 其中涉及到一些插件的使用

//路径管理
path_provider
//图片选择器
image_picker
//轻量级的用户信息缓存
shared_preferences

image_picker本身在通过相机和相册选择完图片后会在 tmp 目录缓存一份。 我本想然他缓存到我指定目录,发现没有对应的功能。

然后我把从image_picker获取的缓存路径存入到shared_preferences。 完整路径如下

/Users/SSL/Library/Developer/CoreSimulator/Devices/F7190475-7F26-497D-892D-BC2E0F34E2AC/data/Containers/Data/Application/16110F0F-9540-461A-9468-4FC343A80CFF/tmp/image_crop_2AE0A757-7915-4F05-9C5E-9F18E6C43203-57503-0000088F5510E1E1.jpg

后来发现从其启动应用程序后这个路径就获取不到图片了。后来发现下边高亮区域,每次重启应用都会发生变化。

/Users/SSL/Library/Developer/CoreSimulator/Devices/F7190475-7F26-497D-892D-BC2E0F34E2AC/data/Containers/Data/Application/16110F0F-9540-461A-9468-4FC343A80CFF/tmp/image_crop_2AE0A757-7915-4F05-9C5E-9F18E6C43203-57503-0000088F5510E1E1.jpg

我在思考是不是应该只存储图片的名字,而不是整个路径。

但是我发现不管以任何方法path_provider都获取不到tmp这个文件夹。所以我准备在image_picker获取到图片后,吧他返回的图片,复制一份出来到/Library/Caches路径。

具体代码:(这里耽误了挺久主要是查询资料,了解缓存以及存储机制,还有代码试错,不过终究还是搞定了)。

saveImage(File file) async{
  ///得到一个缓存的路径
  Directory appDocDir = await getApplicationDocumentsDirectory();
  ///转换为bytes
  ByteData bytedata = await rootBundle.load(file.path);
  List<int> bytes =
  bytedata.buffer.asUint8List(bytedata.offsetInBytes, bytedata.lengthInBytes);
  ///获取文件名称
  String fileName = file.path.split("/").last;
  ///根据文件名称创建一个新文件
  File newFile = File(appDocDir.path+"/"+fileName);
  ///写入文件
  newFile.writeAsBytes(bytes);
  //判断是否写入成功
  bool reuslt = await file.exists();
  if (reuslt){
    print("缓存成功${newFile.path}");
  }else {
    print("缓存失败${newFile.path}");
  }
}

接下来就是保存到相册: 未完待续