美文网首页
从零开始用flutter写一个完整应用(10):持久化储存2 -

从零开始用flutter写一个完整应用(10):持久化储存2 -

作者: 逃离_102 | 来源:发表于2022-07-03 09:52 被阅读0次

说明

继续上篇文章,这篇文章说说文件读写。磁盘文件的读写操作可能会相对方便地实现某些业务场景。它常见于应用启动期间产生的持久化数据,或者从网络下载数据供离线使用。为了将文件保存到磁盘,你需要结合使用 dart:io 库中的 path_provider这个 package。下边就来说说基本使用。

找到正确的本地路径

将这些数据存储在哪里?这就需要找到正确的本地路径。path_provider package 提供一种平台无关的方式以一致的方式访问设备的文件位置系统。该 plugin 当前支持访问两种文件位置系统:
临时文件夹:
这是一个系统可以随时清空的临时(缓存)文件夹。在 iOS 上对应 NSCachesDirectory的返回值;在 Android 上对应 getCacheDir() 的返回值。
Documents 目录:
供应用使用,用于存储只能由该应用访问的文件。只有在删除应用时,系统才会清除这个目录。在 iOS 上,这个目录对应于 NSDocumentDirectory。在 Android 上,则是 AppData 目录。
在本示例中,你需要将信息存储在 Documents 目录中。可以按如下所示,找到 Documents 目录路径:

Future<String> get _localPath async {
  final directory = await getApplicationDocumentsDirectory();
  return directory.path;
}

创建一个指向文件位置的引用

确定文件的存储位置后,需要创建对文件完整位置的引用。为此,你可以使用 dart:io 库的 File类来实现。示例如下

Future<File> get _localFile async {
  final path = await _localPath;
  return File('$path/counter.txt');
}

将数据写入文件

Future<File> writeCounter(int counter) async {
  final file = await _localFile;
  return file.writeAsString('$counter');
}

从文件读取数据

Future<int> readCounter() async {
  try {
    final file = await _localFile;
    final contents = await file.readAsString();
    return int.parse(contents);
  } catch (e) {
    return 0;
  }
}

完整示例如下

import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';

void main() {
  runApp(
    MaterialApp(
      title: '读写文件',
      home: FlutterDemo(storage: CounterStorage()),
    ),
  );
}

class CounterStorage {
  Future<String> get _localPath async {
    final directory = await getApplicationDocumentsDirectory();
    return directory.path;
  }

  Future<File> get _localFile async {
    final path = await _localPath;
    return File('$path/counter.txt');
  }

  Future<int> readCounter() async {
    try {
      final file = await _localFile;
      final contents = await file.readAsString();
      return int.parse(contents);
    } catch (e) {
      return 0;
    }
  }

  Future<File> writeCounter(int counter) async {
    final file = await _localFile;
    return file.writeAsString('$counter');
  }
}

class FlutterDemo extends StatefulWidget {
  const FlutterDemo({super.key, required this.storage});

  final CounterStorage storage;

  @override
  _FlutterDemoState createState() => _FlutterDemoState();
}

class _FlutterDemoState extends State<FlutterDemo> {
  int _counter = 0;

  @override
  void initState() {
    super.initState();
    widget.storage.readCounter().then((value) {
      setState(() {
        _counter = value;
      });
    });
  }

  Future<File> _incrementCounter() {
    setState(() {
      _counter++;
    });
    return widget.storage.writeCounter(_counter);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Reading and Writing Files'),
      ),
      body: Center(
        child: Text(
          'Button tapped $_counter time${_counter == 1 ? '' : 's'}.',
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

文件读写还是比较简单,先就写这么多,如有遗漏欢迎留言,如有错误欢迎指正,谢谢

相关文章

网友评论

      本文标题:从零开始用flutter写一个完整应用(10):持久化储存2 -

      本文链接:https://www.haomeiwen.com/subject/kdtkbrtx.html