前言
在咱们理论的利用开发过程中,经常会做一些本地长久化数据配置,在利用启动时能够拿到配置去解决对应的业务逻辑。或者咱们下载文件、下载图片等都须要通过IO
流来实现。
在咱们操作文件的时候咱们须要联合dart:io
库中的path_provider
,因为每个零碎下文件门路不同,如果本人去实现会很麻烦,那么path_provider
就此产生。
源码及视频教程地址
github源码地址 视频教程地址
path_provider介绍
path_provider
是一个Flutter
插件,次要作用是提供一种以平台无关统一的形式拜访设施的文件系统,比方利用长期目录、文档目录等。而且path_provider
反对Android、iOS、Linux、MacOS、Windows。
path_provider App目录
app存储目录总共分为八种,咱们来看一下他们的区别:
长期目录
长期目录的是零碎能够随时清空的缓存文件夹
- iOS对应的实现形式是
NSCachesDirectory
- Android对应的实现形式是
getCacheDir()
)
文档目录
文档目录用于存储只能由该利用拜访的文件,零碎不会革除该目录,只有在删除利用时才会隐没。
- iOS对应的实现形式是
NSDocumentDirectory
- Android对应的实现形式是
AppData
应用程序反对目录
应用程序反对目录用于不想向用户公开的文件,也就是你不想给用户看到的文件可搁置在该目录中,零碎不会革除该目录,只有在删除利用时才会隐没。
- iOS对应的实现形式是
NSApplicationSupportDirectory
- Android对应的实现形式是
getFilesDir()
)
应用程序长久文件目录
该目录次要存储长久文件的目录,并且不会对用户公开,罕用于存储数据库文件,比方sqlite.db等。
内部存储目录
次要用于获取内部存储目录,如SD卡等,但iOS不反对内部存储目录,目前只有Android才反对。
内部存储缓存目录
次要用户获取应用程序特定内部缓存数据的目录,比方从SD卡或者手机上有多个存储目录的,但iOS不反对内部存储目录,目前只有Android才反对。
内部存储目录(独自分区)
可依据类型获取内部存储目录,如SD卡、独自分区等,和内部存储目录不同在于他是获取一个目录数组。但iOS不反对内部存储目录,目前只有Android才反对。
桌面程序下载目录
次要用于存储下载文件的目录,只实用于Linux
、MacOS
、Windows
,Android
和iOS
平台无奈应用。
path_provider办法和阐明
办法 | 属性 | 形容 |
---|---|---|
getTemporaryDirectory() | Future<Directory> | 长期目录 |
getApplicationSupportDirectory() | Future<Directory> | 应用程序反对目录 |
getLibraryDirectory() | Future<Directory> | 应用程序长久文件目录 |
getApplicationDocumentsDirectory() | Future<Directory> | 文档目录 |
getExternalStorageDirectory() | Future<Directory> | 内部存储目录 |
getExternalCacheDirectories() | Future<List<Directory>?> | 内部存储缓存目录 |
getExternalStorageDirectories() | Future<List<Directory>?> | 内部存储目录(独自分区) |
getDownloadsDirectory() | Future<Directory?> | 桌面程序下载目录 |
path_provider根本应用
咱们这里举一个简略的例子,通过path_provider
获取磁盘中的门路,把文字写入到文件中,具体步骤如下:
- 增加依赖
- 获取本地目录
- 写入数据到磁盘中
- 读取磁盘数据
第一步:增加依赖
environment: sdk: ">=2.12.0 <3.0.0"dependencies: flutter: sdk: flutter path_provider: ^2.0.5
第二步:获取本地目录
尽管获取门路总共有八种,然而在理论利用开发过程中,咱们常常应用的有三种,咱们别离来获取这三种目录的门路,如下:
/// 获取文档目录文件Future<File> _getLocalDocumentFile() async { final dir = await getApplicationDocumentsDirectory(); return File('${dir.path}/str.txt');}/// 获取长期目录文件Future<File> _getLocalTemporaryFile() async { final dir = await getTemporaryDirectory(); return File('${dir.path}/str.txt');}/// 获取应用程序目录文件Future<File> _getLocalSupportFile() async { final dir = await getApplicationSupportDirectory(); return File('${dir.path}/str.txt');}
第三步:写入数据到磁盘中
咱们这里通过writeAsString()
来将name
值写入到磁盘中,如果你须要同步写入可调用writeAsStringSync()
,或者想通过字节流的形式写入能够调用writeAsBytes()
。
String name = "Jimi";/// 写入数据Future<void> writeString(String str) async { final file = await _getLocalDocumentFile(); await file.writeAsString(name); final file1 = await _getLocalTemporaryFile(); await file1.writeAsString(name); final file2 = await _getLocalSupportFile(); await file2.writeAsString(name); print("写入胜利");}
第四步:读取磁盘数据
这里加了一个try catch
,避免在读取文件出现异常导致解体,咱们别离读取三个目录外面的文件并对其减少相应的打印。
/// 读取值Future<void> readString() async { try { final file = await _getLocalDocumentFile(); final result = await file.readAsString(); print("result-----$result"); final file1 = await _getLocalTemporaryFile(); final result1 = await file1.readAsString(); print("result1-----$result1"); final file2 = await _getLocalSupportFile(); final result2 = await file2.readAsString(); print("result2-----$result2"); } catch (e) { }}
残缺示例代码
import 'dart:io';import 'package:flutter/material.dart';import 'package:path_provider/path_provider.dart';void main() { runApp(MyApp());}class MyApp extends StatelessWidget { String name = "Jimi"; /// 获取文档目录文件 Future<File> _getLocalDocumentFile() async { final dir = await getApplicationDocumentsDirectory(); return File('${dir.path}/str.txt'); } /// 获取长期目录文件 Future<File> _getLocalTemporaryFile() async { final dir = await getTemporaryDirectory(); return File('${dir.path}/str.txt'); } /// 获取应用程序目录文件 Future<File> _getLocalSupportFile() async { final dir = await getApplicationSupportDirectory(); return File('${dir.path}/str.txt'); } /// 读取值 Future<void> readString() async { try { final file = await _getLocalDocumentFile(); final result = await file.readAsString(); print("result-----$result"); final file1 = await _getLocalTemporaryFile(); final result1 = await file1.readAsString(); print("result1-----$result1"); final file2 = await _getLocalSupportFile(); final result2 = await file2.readAsString(); print("result2-----$result2"); } catch (e) { } } /// 写入数据 Future<void> writeString(String str) async { final file = await _getLocalDocumentFile(); await file.writeAsString(name); final file1 = await _getLocalTemporaryFile(); await file1.writeAsString(name); final file2 = await _getLocalSupportFile(); await file2.writeAsString(name); print("写入胜利"); } @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: Scaffold( appBar: AppBar(title: Text("path_provider"),), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Text(name, style: TextStyle( color: Colors.pink, fontSize: 30 ), ), SizedBox(height: 20), ElevatedButton( onPressed: (){ writeString(name); }, child: Text("存入本地目录"), ), ElevatedButton( onPressed: (){ readString(); }, child: Text("读取值"), ), ], ), ), ) ); }}
控制台输入
flutter: 写入胜利flutter: result-----Jimiflutter: result1-----Jimiflutter: result2-----Jimi
总结
当咱们须要长久化数据或下载文件、图片或保留数据库文件咱们将文件写入到磁盘中,那咱们须要借助dart:io
以及path_provider
,而path_provider
次要作用是提供一种以平台无关统一的形式拜访设施的文件系统,比方利用长期目录、文档目录等。