美文网首页
从零开始用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