前言
在我們實際的應(yīng)用開發(fā)過程中,常常會做一些本地持久化數(shù)據(jù)配置界赔,在應(yīng)用啟動時可以拿到配置去處理對應(yīng)的業(yè)務(wù)邏輯丢习。或者我們下載文件仔蝌、下載圖片等都需要通過IO
流來實現(xiàn)泛领。
在我們操作文件的時候我們需要結(jié)合dart:io
庫中的path_provider
,因為每個系統(tǒng)下文件路徑不同敛惊,如果自己去實現(xiàn)會很麻煩渊鞋,那么path_provider
就此產(chǎn)生。
源碼及視頻教程地址
path_provider介紹
path_provider
是一個Flutter
插件瞧挤,主要作用是提供一種以平臺無關(guān)一致的方式訪問設(shè)備的文件系統(tǒng)锡宋,比如應(yīng)用臨時目錄、文檔目錄等特恬。而且path_provider
支持Android执俩、iOS、Linux癌刽、MacOS役首、Windows。
path_provider App目錄
app存儲目錄總共分為八種显拜,我們來看一下他們的區(qū)別:
臨時目錄
臨時目錄的是系統(tǒng)可以隨時清空的緩存文件夾
iOS對應(yīng)的實現(xiàn)方式是
NSCachesDirectory
Android對應(yīng)的實現(xiàn)方式是
getCacheDir()
文檔目錄
文檔目錄用于存儲只能由該應(yīng)用訪問的文件衡奥,系統(tǒng)不會清除該目錄,只有在刪除應(yīng)用時才會消失远荠。
- iOS對應(yīng)的實現(xiàn)方式是
NSDocumentDirectory
- Android對應(yīng)的實現(xiàn)方式是
AppData
應(yīng)用程序支持目錄
應(yīng)用程序支持目錄用于不想向用戶公開的文件矮固,也就是你不想給用戶看到的文件可放置在該目錄中,系統(tǒng)不會清除該目錄譬淳,只有在刪除應(yīng)用時才會消失档址。
iOS對應(yīng)的實現(xiàn)方式是
NSApplicationSupportDirectory
Android對應(yīng)的實現(xiàn)方式是
getFilesDir()
應(yīng)用程序持久文件目錄
該目錄主要存儲持久文件的目錄,并且不會對用戶公開邻梆,常用于存儲數(shù)據(jù)庫文件守伸,比如sqlite.db等。
外部存儲目錄
主要用于獲取外部存儲目錄确虱,如SD卡等含友,但iOS不支持外部存儲目錄替裆,目前只有Android才支持校辩。
外部存儲緩存目錄
主要用戶獲取應(yīng)用程序特定外部緩存數(shù)據(jù)的目錄窘问,比如從SD卡或者手機上有多個存儲目錄的,但iOS不支持外部存儲目錄宜咒,目前只有Android才支持惠赫。
外部存儲目錄(單獨分區(qū))
可根據(jù)類型獲取外部存儲目錄,如SD卡故黑、單獨分區(qū)等儿咱,和外部存儲目錄不同在于他是獲取一個目錄數(shù)組。但iOS不支持外部存儲目錄场晶,目前只有Android才支持混埠。
桌面程序下載目錄
主要用于存儲下載文件的目錄,只適用于Linux
诗轻、MacOS
钳宪、Windows
,Android
和iOS
平臺無法使用扳炬。
path_provider方法和說明
方法 | 屬性 | 描述 |
---|---|---|
getTemporaryDirectory() | Future<Directory> | 臨時目錄 |
getApplicationSupportDirectory() | Future<Directory> | 應(yīng)用程序支持目錄 |
getLibraryDirectory() | Future<Directory> | 應(yīng)用程序持久文件目錄 |
getApplicationDocumentsDirectory() | Future<Directory> | 文檔目錄 |
getExternalStorageDirectory() | Future<Directory> | 外部存儲目錄 |
getExternalCacheDirectories() | Future<List<Directory>?> | 外部存儲緩存目錄 |
getExternalStorageDirectories() | Future<List<Directory>?> | 外部存儲目錄(單獨分區(qū)) |
getDownloadsDirectory() | Future<Directory?> | 桌面程序下載目錄 |
path_provider基本使用
我們這里舉一個簡單的例子吏颖,通過path_provider
獲取磁盤中的路徑,把文字寫入到文件中恨樟,具體步驟如下:
- 添加依賴
- 獲取本地目錄
- 寫入數(shù)據(jù)到磁盤中
- 讀取磁盤數(shù)據(jù)
第一步:添加依賴
environment:
sdk: ">=2.12.0 <3.0.0"
dependencies:
flutter:
sdk: flutter
path_provider: ^2.0.5
第二步:獲取本地目錄
雖然獲取路徑總共有八種半醉,但是在實際應(yīng)用開發(fā)過程中,我們經(jīng)常使用的有三種劝术,我們分別來獲取這三種目錄的路徑缩多,如下:
/// 獲取文檔目錄文件
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');
}
/// 獲取應(yīng)用程序目錄文件
Future<File> _getLocalSupportFile() async {
final dir = await getApplicationSupportDirectory();
return File('${dir.path}/str.txt');
}
第三步:寫入數(shù)據(jù)到磁盤中
我們這里通過writeAsString()
來將name
值寫入到磁盤中,如果你需要同步寫入可調(diào)用writeAsStringSync()
养晋,或者想通過字節(jié)流的方式寫入可以調(diào)用writeAsBytes()
衬吆。
String name = "Jimi";
/// 寫入數(shù)據(jù)
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("寫入成功");
}
第四步:讀取磁盤數(shù)據(jù)
這里加了一個try catch
,防止在讀取文件出現(xiàn)異常導(dǎo)致崩潰匙握,我們分別讀取三個目錄里面的文件并對其增加相應(yīng)的打印咆槽。
/// 讀取值
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');
}
/// 獲取應(yīng)用程序目錄文件
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) {
}
}
/// 寫入數(shù)據(jù)
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
總結(jié)
當我們需要持久化數(shù)據(jù)或下載文件、圖片或保存數(shù)據(jù)庫文件我們將文件寫入到磁盤中圈纺,那我們需要借助dart:io
以及path_provider
秦忿,而path_provider
主要作用是提供一種以平臺無關(guān)一致的方式訪問設(shè)備的文件系統(tǒng),比如應(yīng)用臨時目錄蛾娶、文檔目錄等灯谣。