美文网首页
Flutter的三种本地存储方式: 文件,SharedPrefe

Flutter的三种本地存储方式: 文件,SharedPrefe

作者: yytester | 来源:发表于2021-01-07 10:24 被阅读0次

    SharedPreferences 存储

    缓存少量的键值对信息(比如记录用户是否阅读了公告,或是简单的计数),可以使用 SharedPreferences。

    SharedPreferences 会以原生平台相关的机制,为简单的键值对数据提供持久化存储,即在 iOS 上使用 NSUserDefaults,在 Android 使用 SharedPreferences。

    SharedPreferences 的使用方式非常简单方便。不过需要注意的是,以键值对的方式只能存储基本类型的数据,比如 int、double、bool 和 string。

    1. pubspec.yaml引入

    shared_preferences: 0.5.12+4

    2. 代码

    import 'dart:developer';
    
    import 'package:flutter/material.dart';
    import 'package:shared_preferences/shared_preferences.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      int _counter = 0;
    
    //涉及到耗时的文件读写,以异步的方式对这些操作进行包装
    
    //读取SharedPreferences中key为counter的值
      Future<int> _loadCounter() async {
        SharedPreferences prefs = await SharedPreferences.getInstance();
        int counter = (prefs.getInt('counter') ?? 0);
        return counter;
      }
    
    //递增写入SharedPreferences中key为counter的值
      Future<void> _incrementCounter() async {
        SharedPreferences prefs = await SharedPreferences.getInstance();
        int counter = (prefs.getInt('counter') ?? 0) + 1;
        print("当前值: " + counter.toString());
        prefs.setInt('counter', counter);  //setter(setInt)方法会同步更新内存中的键值对,然后将数据保存至磁盘,因此无需再调用更新方法强制刷新缓存
      }
    
      _fresh() {
        // _incrementCounter();
    
        _incrementCounter().then((_) => {
              _loadCounter().then((value) {
                setState(() {
                  _counter = value;
                });
                print("before:$value");
              })
            });
      }
    
      // void _incrementCounter() {
      //   setState(() {
    
      //     _counter++;
      //   });
      // }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            // Here we take the value from the MyHomePage object that was created by
            // the App.build method, and use it to set our appbar title.
            title: Text(widget.title),
          ),
          body: Center(
            // Center is a layout widget. It takes a single child and positions it
            // in the middle of the parent.
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  '$_counter',
                  style: Theme.of(context).textTheme.headline4,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _fresh,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ), // This trailing comma makes auto-formatting nicer for build methods.
        );
      }
    }
    
    

    数据库存储

    如果需要持久化大量格式化后的数据,并且这些数据还会以较高的频率更新,为了考虑进一步的扩展性,通常会选用 sqlite 数据库来应对这样的场景。

    与文件和 SharedPreferences 相比,数据库在数据读写上可以提供更快、更灵活的解决方案。

    1. pubspec.yaml引入

      sqflite: 1.3.2+1 
      path_provider: ^1.6.24
        
    

    2.代码

    import 'package:flutter/material.dart';
    import 'package:sqflite/sqflite.dart';
    import 'package:path/path.dart';
    import 'package:path_provider/path_provider.dart';
    import 'dart:io';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page'),
        );
      }
    }
    
    class MyHomePage extends StatefulWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      _MyHomePageState createState() => _MyHomePageState();
    }
    
    class Student {
      String id;
      String name;
      int score;
      //构造方法
      Student({
        this.id,
        this.name,
        this.score,
      });
      //用于将JSON字典转换成类对象的工厂类方法
      factory Student.fromJson(Map<String, dynamic> parsedJson) {
        return Student(
          id: parsedJson['id'],
          name: parsedJson['name'],
          score: parsedJson['score'],
        );
      }
      Map<String, dynamic> toJson() {
        return {
          'id': id,
          'name': name,
          'score': score,
        };
      }
    }
    
    class _MyHomePageState extends State<MyHomePage> {
      var student1 = Student(id: '123', name: '张三', score: 110);
    
      query_database(id) {
        Future<Student> user = query_by_id(id);
        user.then((t) {
          print("单用户查询成功");
          print('the sroce is : ' + t.score.toString());
          student1.score = t.score;
        });
      }
    
      //插入数据
      Future<void> insertStudent(Student std) async {
        final Database db = await database;
        await db.insert(
          'students',
          std.toJson(),
          //插入冲突策略,新的替换旧的
          conflictAlgorithm: ConflictAlgorithm.replace,
        );
      }
    
      Future<Student> query_by_id(String id) async {
        final Database db = await database;
        List<Map> maps = await db.query('students',
            columns: ['id', 'name', 'score'], where: 'id = ?', whereArgs: [id]);
        if (maps.length > 0) {
          print("根据id查到了数据");
          return Student.fromJson(maps.first);
        }
        print("根据id没有查到数据");
        return null;
      }
    
      //初始化数据库方法
      initDB() async {
        Directory documentsDirectory = await getApplicationDocumentsDirectory();
        String path = join(documentsDirectory.path, "students_database.db");
    
        return await openDatabase(path, version: 1, onOpen: (db) {},
            onCreate: (Database db, int version) async {
          await db.execute('''
                CREATE TABLE students(id TEXT PRIMARY KEY, name TEXT, score INTEGER)
                ''');
        });
      }
    
      Database _database;
    
      Future<Database> get database async {
        if (_database != null) {
          print(_database);
          return _database;
        }
    
        _database = await initDB();
        print("创建新数据库");
        return _database;
      }
    
      void _incrementCounter() async {
        student1.score += 1;
        await insertStudent(student1);
    
        setState(() {});
      }
    
      Future<List<Student>> students() async {
        final Database db = await database;
        final List<Map<String, dynamic>> maps = await db.query('students');
        return List.generate(maps.length, (i) => Student.fromJson(maps[i]));
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text(widget.title),
          ),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Text(
                  'You have pushed the button this many times:',
                ),
                Text(
                  student1.score.toString(),
                  style: Theme.of(context).textTheme.headline4,
                ),
              ],
            ),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: _incrementCounter,
            tooltip: 'Increment',
            child: Icon(Icons.add),
          ),
        );
      }
    
      @override
      void dispose() async {
        // TODO: implement dispose
        super.dispose();
        final Database db = await database;
    
        db.close();
      }
    }
    

    Flutter 写的app, 需要源码可以私信~~

    最好的笔记软件


    最好的笔记软件

    https://www.wolai.com/signup?invitation=6Z8Z3BP

    相关文章

      网友评论

          本文标题:Flutter的三种本地存储方式: 文件,SharedPrefe

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