Flutter进阶—读取与写入文件

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(),
  ));
}

这里写图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页