共计 4919 个字符,预计需要花费 13 分钟才能阅读完成。
前言
在咱们理论的利用开发过程中,经常会做一些本地长久化数据配置,在利用启动时能够拿到配置去解决对应的业务逻辑。或者咱们下载文件、下载图片等都须要通过 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-----Jimi
flutter: result1-----Jimi
flutter: result2-----Jimi
总结
当咱们须要长久化数据或下载文件、图片或保留数据库文件咱们将文件写入到磁盘中,那咱们须要借助 dart:io
以及 path_provider
,而path_provider
次要作用是提供一种以平台无关统一的形式拜访设施的文件系统,比方利用长期目录、文档目录等。