Flutter使用path_provider
插件读取与写入文件,path_provider
插件提供了一种平台无关的方法来访问设备文件系统上常用的位置。该类目前支持访问两个文件系统位置:
临时目录:系统可以随时清除的临时目录(缓存),在iOS上,对应NSTemporaryDirectory()返回的值,在Android上,这是getCacheDir()返回的值。
文档目录:应用程序的目录,用于存储只有它可以访问的文件,仅当删除应用程序时,系统才会清除目录,在iOS上,这对应NSDocumentsDirectory,在Android上,这是AppData目录。
首先我们需要修改一下pubspec.yaml
文件,添加path_provider
插件,再在pubspec.yaml
顶部的动作功能区中点击“Packages Get”。
dependencies:
flutter:
sdk: flutter
path_provider: ^0.2.1+1
当你的Flutter应用程序有一个文件位置的引用,你可以使用dart:io API对文件系统执行读/写操作。
下面的示例会在点击按钮时保存按钮按下的次数,并在应用程序重新启动时加载按钮按下的次数:
import 'dart:io';
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
class ReadAndWriteDemo extends StatefulWidget {
@override
_ReadAndWriteDemoState createState() => new _ReadAndWriteDemoState();
}
class _ReadAndWriteDemoState extends State<ReadAndWriteDemo> {
// 全局变量,存储点击数
int _counter;
// 覆盖initState函数,创建状态对象调用该方法
@override
void initState() {
// 调用原initState方法内容
super.initState();
/*
* 调用_readCounter函数,读取点击数
* 将点击数作为参数,创建一个函数
*/
_readCounter().then((int value){
// 通知框架此对象的内部状态已更改
setState((){
// 将参数赋予存储点击数的变量
_counter = value;
});
});
}
/*
* _readCounter函数,读取点击数
* 关键字async表示异步操作
* 返回值Future类型,表示延迟处理的对象
*/
Future<int> _readCounter() async {
try {
/*
* 获取本地文件目录
* 关键字await表示等待操作完成
*/
File file = await _getLocalFile();
// 使用给定的编码将整个文件内容读取为字符串
String contents = await file.readAsString();
// 返回文件中的点击数
return int.parse(contents);
} on FileSystemException {
// 发生异常时返回默认值
return 0;
}
}
// _getLocalFile函数,获取本地文件目录
Future<File> _getLocalFile() async {
// 获取本地文档目录
String dir = (await getApplicationDocumentsDirectory()).path;
// 返回本地文件目录
return new File('$dir/counter.txt');
}
// _incrementCounter函数,点击增加按钮时的回调
Future<Null> _incrementCounter() async {
setState((){
// 存储点击数的变量自加1
_counter++;
});
// 将存储点击数的变量作为字符串写入文件
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('点击按钮${_counter==0?'':'$_counter次'}!')
),
floatingActionButton: new FloatingActionButton(
onPressed: _incrementCounter,
tooltip: '增加',
child: new Icon(Icons.add),
)
);
}
}
void main() {
runApp(new MaterialApp(
title: 'Flutter',
home: new ReadAndWriteDemo(),
));
}