作者:很想爱到极限 | 来源:互联网 | 2023-08-06 13:13
flutter中数据共享和数据持久化词语解释单例模式数据共享数据持久化具体实现单例模式数据共享数据持久化数据持久化的拓展flutter项目中的共享数据和数据持久化,我都是在单例模式
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)储存数据(在需要储存数据的地方,添加代码,数据类似于键值对的形式存在缓存中的,&#8217;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,有什么错误欢迎大家评论指正哦!