W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
Dart 的 IO 庫包含了文件讀寫的相關(guān)類,它屬于 Dart 語法標(biāo)準(zhǔn)的一部分,所以通過 Dart IO 庫,無論是 Dart VM 下的腳本還是 Flutter,都是通過 Dart IO 庫來操作文件的,不過和 Dart VM 相比, Flutter 有一個(gè)重要差異是文件系統(tǒng)路徑不同,這是因?yàn)?Dart VM 是運(yùn)行在 PC 或服務(wù)器操作系統(tǒng)下,而 Flutter 是運(yùn)行在移動(dòng)操作系統(tǒng)中,他們的文件系統(tǒng)會(huì)有一些差異。
Android 和 iOS 的應(yīng)用存儲(chǔ)目錄不同,PathProvider
(opens new window)插件提供了一種平臺(tái)透明的方式來訪問設(shè)備文件系統(tǒng)上的常用位置。該類當(dāng)前支持訪問兩個(gè)文件系統(tǒng)位置:
getTemporaryDirectory()
來獲取臨時(shí)目錄; 系統(tǒng)可隨時(shí)清除的臨時(shí)目錄(緩存)。在 iOS 上,這對應(yīng)于NSTemporaryDirectory()
(opens new window)返回的值。在 Android 上,這是getCacheDir()
(opens new window)返回的值。getApplicationDocumentsDirectory()
來獲取應(yīng)用程序的文檔目錄,該目錄用于存儲(chǔ)只有自己可以訪問的文件。只有當(dāng)應(yīng)用程序被卸載時(shí),系統(tǒng)才會(huì)清除該目錄。在iOS上,這對應(yīng)于NSDocumentDirectory
。在 Android 上,這是AppData
目錄。getExternalStorageDirectory()
來獲取外部存儲(chǔ)目錄,如 SD 卡;由于 iOS 不支持外部目錄,所以在 iOS 下調(diào)用該方法會(huì)拋出UnsupportedError
異常,而在 Android 下結(jié)果是 android SDK 中getExternalStorageDirectory
的返回值。一旦你的 Flutter 應(yīng)用程序有一個(gè)文件位置的引用,你可以使用 dart:io (opens new window)API 來執(zhí)行對文件系統(tǒng)的讀/寫操作。有關(guān)使用 Dart 處理文件和目錄的詳細(xì)內(nèi)容可以參考 Dart 語言文檔,下面我們看一個(gè)簡單的例子。
我們還是以計(jì)數(shù)器為例,實(shí)現(xiàn)在應(yīng)用退出重啟后可以恢復(fù)點(diǎn)擊次數(shù)。 這里,我們使用文件來保存數(shù)據(jù):
pubspec.yaml
文件中添加如下聲明: path_provider: ^0.4.1
添加后,執(zhí)行flutter packages get
獲取一下, 版本號(hào)可能隨著時(shí)間推移會(huì)發(fā)生變化,讀者可以使用最新版。
import 'dart:io';
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
class FileOperationRoute extends StatefulWidget {
FileOperationRoute({Key key}) : super(key: key);
@override
_FileOperationRouteState createState() => new _FileOperationRouteState();
}
class _FileOperationRouteState extends State<FileOperationRoute> {
int _counter;
@override
void initState() {
super.initState();
//從文件讀取點(diǎn)擊次數(shù)
_readCounter().then((int value) {
setState(() {
_counter = value;
});
});
}
Future<File> _getLocalFile() async {
// 獲取應(yīng)用目錄
String dir = (await getApplicationDocumentsDirectory()).path;
return new File('$dir/counter.txt');
}
Future<int> _readCounter() async {
try {
File file = await _getLocalFile();
// 讀取點(diǎn)擊次數(shù)(以字符串)
String contents = await file.readAsString();
return int.parse(contents);
} on FileSystemException {
return 0;
}
}
Future<Null> _incrementCounter() async {
setState(() {
_counter++;
});
// 將點(diǎn)擊次數(shù)以字符串類型寫到文件中
await (await _getLocalFile()).writeAsString('$_counter');
}
@override
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(title: new Text('文件操作')),
body: new Center(
child: new Text('點(diǎn)擊了 $_counter 次'),
),
floatingActionButton: new FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: new Icon(Icons.add),
),
);
}
}
上面代碼比較簡單,不再贅述,需要說明的是,本示例只是為了演示文件讀寫,而在實(shí)際開發(fā)中,如果要存儲(chǔ)一些簡單的數(shù)據(jù),使用 shared_preferences 插件會(huì)比較簡單。
注意,Dart IO 庫操作文件的 API 非常豐富,但本書不是介紹 Dart 語言的,故不詳細(xì)說明,讀者需要的話可以自行學(xué)習(xí)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: