flutter中数据共享和数据持久化

  • 词语解释
  • 单例模式
  • 数据共享
  • 数据持久化
  • 具体实现
  • 单例模式
  • 数据共享
  • 数据持久化
  • 数据持久化的拓展


flutter项目中的共享数据和数据持久化,我都是在单例模式中进行处理的,所以在本文的最开始,先大致解释一下共享数据和数据持久化以及展示一下单例模式。

词语解释

有一定基础的开发者可以直接略过“词语解释”这部分。

单例模式

顾名思义,整个项目生命周期,都保持一个实例,无论你几次引用,皆为一个实例。

数据共享

所以在单例模式中定义的变量,无论在什么界面进行了修改,对于所有文件而言,都是发生了同步修改的,遂实现了数据共享。

数据持久化

flutter在开发app的过程中,当我们重现启动app时,需要将某些数据存储到缓存里,比如用户名密码,这样下次开启app进行登录时,这部分数据是可以直接取到的。比如闲鱼上的聊天记录以及app的登录信息等。

具体实现

下面先整体介绍单例模式,之后在分别单例模式中拓展实现数据共享和数据持久化。

单例模式

1 创建一个单例的Manager类

// An highlighted block
class Manager {
  // 工厂模式
  factory Manager() =>_getInstance();
  static Manager get instance => _getInstance();
  static Manager _instance;
  Manager._internal() {
    // 初始化
  }
  static Manager _getInstance() {
    if (_instance == null) {
      _instance = new Manager._internal();
    }
    return _instance;
  }
}

2 调用

// An highlighted block
// 无论如何初始化,取到的都是同一个对象
Manager manager = new Manager();
Manager manager2 = Manager.instance;

!注意(新手参考):具体操作如下----a 在项目中创建一个dart文件,假设这个dart文件叫做manage.dart将单例模式的代码直接复制进去;b 在需要使用的dart文件(假设这个文件叫做invoking.dart)中import单例模式,再使用调用代码即可。

数据共享

1 在单例模式manage.dart中进行共享数据的添加

// An highlighted block
class Manager {
  // 工厂模式
  //存收藏的新闻,定义了Map类型的变量savedNews,这个就是我需要用的共享数据
  Map<String, Map> savedNews = {}; 
  factory Manager() =>_getInstance()
  static Manager get instance => _getInstance();
  static Manager _instance;
  Manager._internal() {
    // 初始化
  }
  static Manager _getInstance() {
    if (_instance == null) {
      _instance = new Manager._internal();
    }
    return _instance;
  }
}

2 在文件invoking.dart中,需要使用共享数据savedNews的地方对该数据进行获取和操作。
具体:在使用时候,取共享数据Manager.instance.savedNews,将其赋值给invoking.dart文件中类的私有变量_savedNews,此时_savedNews和savedNews指向同一个地址,就会一起变化,达到共享。

//引入单例模式设计
import 'package:myapp/manage.dart';
...
Map<String, Map> _savedNews = Manager.instance.savedNews;
// 之后可以对_savedNews操作,实则是对共享数据savedNews一起操作

数据持久化

借用了插件shared_preferences来实现数据的持久化
1 pubspec.yaml文件中添加依赖并pub get

dependencies:
  flutter:
    sdk: flutter

  shared_preferences: ^0.5.4

2 持久化的数据的存取和移除
1)导入头文件(在需要使用的文件中,导入该插件)

import 'package:shared_preferences/shared_preferences.dart';

2)储存数据(在需要储存数据的地方,添加代码,数据类似于键值对的形式存在缓存中的,'counter’就是缓存数据中的key,counter就是自己文件中的变量名称,即keyvalue)

final prefs = await SharedPreferences.getInstance();
prefs.setInt('counter', counter);

3)读取数据

final prefs = await SharedPreferences.getInstance();
final counter = prefs.getInt('counter') ?? 0;

4)移除数据

final prefs = await SharedPreferences.getInstance();
prefs.remove('counter');

数据持久化的拓展

有时候我们不仅仅是在单个界面需要存取操作持久化的数据,我们希望在进入程序时取值,程序结束时存值,这种时候,我们将存取数据功能分别写两个接口会方便使用。另外,注意存取数据时都是String型的数据,所以需要我们借助JsonEncoder和JsonDecoder实例中的convert方法对数据进行转换。
以下是我写在单例模式中的存取数据的两个方法,其中还有数据类型的转换,需要使用的时候进行调用即可,以供大家参考。

import 'dart:convert';
import 'package:shared_preferences/shared_preferences.dart';

class Manager {
  // 工厂模式
  Map<String, Map> savedNews = {}; //存收藏的新闻
  factory Manager() =>_getInstance();
  static Manager get instance => _getInstance();
  static Manager _instance;
  Manager._internal() {
    // 初始化
  }
  Future<Map> loadData() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    String counter = prefs.getString('counter');
    if(counter == null || counter.isEmpty) {
      return null;
    } else {
       JsonDecoder jsonDecoder = new JsonDecoder();
       Map<String, dynamic>  map = jsonDecoder.convert(counter);
       for(String key in map.keys){
         if(map[key] is Map){
           savedNews[key] = map[key];
         }
       }
       return savedNews;
    }
  }
  //储存数据
  void saveData() async{
    // obtain shared preferences
    SharedPreferences prefs = await SharedPreferences.getInstance();
    JsonEncoder jsonEncoder = new JsonEncoder();
// set new value
     prefs.setString('counter', jsonEncoder.convert(savedNews));
  }

  static Manager _getInstance() {
    if (_instance == null) {
      _instance = new Manager._internal();
    }
    return _instance;
  }
}

调用代码

...
 Manager.instance.loadData(); //取数据
 ...
 Manager.instance.saveData(); //存数据
 ...

刚刚开始接触flutter和dart,有什么错误欢迎大家评论指正哦!❤