添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
大气的作业本  ·  英伦留声机·  1 周前    · 
礼貌的煎饼  ·  热门标签 - CAD自学网·  2 月前    · 
面冷心慈的帽子  ·  Reduction & Grouping ...·  8 月前    · 

这个例子里,我们将会显示一个计数器,当计数器发生变化时,你将在磁盘中写入数据,以便在应用加载时重新读取这些数据。因此,你一定想知道:我应该将这些数据存储在哪里?

path_provider package 提供一种平台无关的方式以一致的方式访问设备的文件位置系统。该 plugin 当前支持访问两种文件位置系统:

临时文件夹:
这是一个系统可以随时清空的临时(缓存)文件夹。在 iOS 上对应 NSCachesDirectory 的返回值;在 Android 上对应 getCacheDir() 的返回值。

Documents 目录:
供应用使用,用于存储只能由该应用访问的文件。只有在删除应用时,系统才会清除这个目录。在 iOS 上,这个目录对应于 NSDocumentDirectory 。在 Android 上,则是 AppData 目录。

在本示例中,你需要将信息存储在 Documents 目录中。可以按如下所示,找到 Documents 目录路径:

dart
import 'package:path_provider/path_provider.dart';
// ···
  Future<String> get _localPath async {
    final directory = await getApplicationDocumentsDirectory();
    return directory.path;
            

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

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

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

3. 将数据写入文件

现在你已经有了可以使用的 File,接下来使用这个文件来读写数据。首先,将一些数据写入该文件。由于使用了计数器,因此只需将整数存储为字符串格式,使用 '$counter' 即可调用。

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

4. 从文件读取数据

现在,你的磁盘上已经有了一些数据可供读取。此时同样需要使用 File 类。

dart
Future<int> readCounter() async {
  try {
    final file = await _localFile;
    // Read the file
    final contents = await file.readAsString();
    return int.parse(contents);
  } catch (e) {
    // If encountering an error, return 0
    return 0;
dart
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
void main() {
  runApp(
    MaterialApp(
      title: 'Reading and Writing Files',
      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;
      // Read the file
      final contents = await file.readAsString();
      return int.parse(contents);
    } catch (e) {
      // If encountering an error, return 0
      return 0;
  Future<File> writeCounter(int counter) async {
    final file = await _localFile;
    // Write the file
    return file.writeAsString('$counter');
class FlutterDemo extends StatefulWidget {
  const FlutterDemo({super.key, required this.storage});
  final CounterStorage storage;
  @override
  State<FlutterDemo> 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++;
    // Write the variable as a string to the file.
    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),