Flutter 学习 之 封装 shared_preferenc
2022-04-03 本文已影响0人
半城半离人
如果有遇到在flutter侧存储 在Android原生侧读取的时候 flutter保存的时候名字前默认加了 flutter. 你设置的名字 在原生调用时候记得加上[flutter. ]~~~~
一. 添加shared_preferences的依赖
在 pubspec.yaml 文件下新增 shared_preferences
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
#持久化存储
shared_preferences: ^2.0.13
二.封装SPUtil
class SPUtil{
//创建工厂方法
static SPUtil? _instance;
factory SPUtil() => _instance ??= SPUtil._initial();
SharedPreferences? _preferences;
//创建命名构造函数
SPUtil._initial() {
//为什么在这里需要新写init方法 主要是在命名构造中不能使用async/await
init();
}
//初始化SharedPreferences
void init() async {
_preferences ??= await SharedPreferences.getInstance();
}
//到这里还没有完 有时候会遇到使用时提示 SharedPreferences 未初始化,所以还需要提供一个static 的方法
static Future<SPUtil?> perInit() async {
if (_instance == null) {
//静态方法不能访问非静态变量所以需要创建变量再通过方法赋值回去
SharedPreferences preferences = await SharedPreferences.getInstance();
_instance = SPUtil._pre(preferences);
}
return _instance;
}
SPUtil._pre(SharedPreferences prefs) {
_preferences = prefs;
}
///设置String类型的
void setString(key, value) {
_preferences?.setString(key, value);
}
///设置setStringList类型的
void setStringList(key, value) {
_preferences?.setStringList(key, value);
}
///设置setBool类型的
void setBool(key, value) {
_preferences?.setBool(key, value);
}
///设置setDouble类型的
void setDouble(key, value) {
_preferences?.setDouble(key, value);
}
///设置setInt类型的
void setInt(key, value) {
_preferences?.setInt(key, value);
}
///存储Json类型的
void setJson(key, value) {
value = jsonEncode(value);
_preferences?.setString(key, value);
}
///通过泛型来获取数据
T? get<T>(key) {
var result = _preferences?.get(key);
if (result != null) {
return result as T;
}
return null;
}
///获取JSON
Map<String, dynamic>? getJson(key) {
String? result = _preferences?.getString(key);
if (StringUtil.isNotEmpty(result)) {
return jsonDecode(result!);
}
return null;
}
///文中的StringUtil中的isNotEmpty的判断
/// static isNotEmpty(String? str) {
/// return str?.isNotEmpty ?? false;
/// }
///清除全部
void clean() {
_preferences?.clear();
}
///移除某一个
void remove(key) {
_preferences?.remove(key);
}
}
三.SPUtil的初始化
///在main.dart中使用
@override
Widget build(BuildContext context) {
//预先加载SPUtil
return FutureBuilder<SPUtil?>(
future: SPUtil.perInit(),
builder: (BuildContext context, AsyncSnapshot<SPUtil?> snapshot) {
//加载完成进入HomePgae 否则就转圈
Widget widget = snapshot.connectionState == ConnectionState.done
? HomePage() //自己定义的页面
: Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
return MaterialApp(
home: widget,
title: '这个title的内容应该显示在Android任务栏',
);
},
);
}