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,有什么错误欢迎大家评论指正哦!❤