Flutter本地数据存储插件shared_preferences_wrapper的使用
Flutter本地数据存储插件shared_preferences_wrapper的使用
shared_preferences_wrapper
是一个用于简化 SharedPreferences
操作的 Flutter 包。它支持多种数据类型,并提供了许多实用功能来管理共享偏好设置。
特性
- 存储和检索字符串、整数、双精度浮点数、布尔值、字符串列表和映射。
- 设置默认值(针对字符串、布尔值、双精度浮点数和整数)。
- 轻松更新存储在共享偏好设置中的映射值。
- 检查共享偏好设置中的键是否存在。
- 删除特定键或清除所有数据。
- 将所有共享偏好设置作为映射检索。
- 检查共享偏好设置是否为空。
- 加密/解密存储在共享偏好设置中的敏感数据。
- 批量添加或更新多个键值对。
- 添加或移除共享偏好设置更改的监听器。
- 根据特定组或类别组织偏好设置。
- 命名空间支持:实现命名空间以便更有效地管理不同的偏好设置集。
支持的数据类型
- 字符串
- 整数
- 双精度浮点数
- 布尔值
- 字符串列表
- 映射
安装
在你的 pubspec.yaml
文件中添加以下依赖:
dependencies:
shared_preferences_wrapper: ^your_version_here
使用
单独函数设置和检索数据
import 'package:shared_preferences_wrapper/shared_preferences_wrapper.dart';
// 设置字符串值
await SharedPreferencesWrapper.setValue('name', 'Yung');
// 通过键检索值
final val = await SharedPreferencesWrapper.getValue('name');
print(val); // 输出 Yung
// 设置不同数据类型的值
// 设置整数值
await SharedPreferencesWrapper.setValue('qty', 10);
final qty = await SharedPreferencesWrapper.getValue('qty');
// 设置双精度浮点数值
await SharedPreferencesWrapper.setValue('amount', 4.5);
final amount = await SharedPreferencesWrapper.getValue('amount');
// 设置布尔值
await SharedPreferencesWrapper.setValue('processed', true);
final processed = await SharedPreferencesWrapper.getValue('processed');
// 设置字符串列表
await SharedPreferencesWrapper.setValue('items', ['item 1', 'item 2']);
final items = await SharedPreferencesWrapper.getValue('items');
// 设置映射
await SharedPreferencesWrapper.setValue('user', {'name': 'Yung', 'lname': 'Cet'});
final user = await SharedPreferencesWrapper.getValue('user');
设置默认值
你可以为不存在的键指定默认值,而不是返回 null
。
final name = await SharedPreferencesWrapper.getValue('name', defaultValue: '');
使用特定函数基于数据类型
import 'package:shared_preferences_wrapper/shared_preferences_wrapper.dart';
// 存储值
await SharedPreferencesWrapper.addString('key', 'value'); // 存储字符串
await SharedPreferencesWrapper.addInt('int', 100); // 存储整数
await SharedPreferencesWrapper.addDouble('double', 10.0); // 存储双精度浮点数
await SharedPreferencesWrapper.addBool('bool', true); // 存储布尔值
await SharedPreferencesWrapper.addStringList('list', ['item 1', 'item 2', 'item 3']); // 存储列表
await SharedPreferencesWrapper.addMap('map', {'key': 'value'}); // 存储映射
// 从共享偏好设置检索字符串
String? retrievedValue = await SharedPreferencesWrapper.getString('key');
int? intValue = await SharedPreferencesWrapper.getInt('int');
double? value = await SharedPreferencesWrapper.getDouble('key');
bool? value = await SharedPreferencesWrapper.getBool('key');
List<String> value = await SharedPreferencesWrapper.getStringList('key');
Map<String, dynamic>? value = await SharedPreferencesWrapper.getMap('key');
设置默认值
可以设置默认值以替代 null
返回。
// 返回空字符串而不是 null
String? stringValue = await SharedPreferencesWrapper.getString('myKey', defaultValue: '');
// 返回 0 而不是 null
int? intValue = await SharedPreferencesWrapper.getInt('myKey', defaultValue: 0);
// 返回 0.0 而不是 null
double? doubleValue = await SharedPreferencesWrapper.getDouble('myKey', defaultValue: 0.0);
// 返回 false 而不是 null
bool? boolValue = await SharedPreferencesWrapper.getBool('myKey', defaultValue: false);
使用命名空间
命名空间支持可以帮助你更有效地组织和管理不同的偏好设置集。
// 创建命名空间
final userPrefs = SharedPreferencesWrapper.createNamespace('user');
// 在命名空间中设置值
await userPrefs.setValue('name', 'John Doe'); // 值可以是任何支持的数据类型
// 从命名空间获取值
String? userName = await userPrefs.getValue('name');
print('name: $userName');
// 清除命名空间
await userPrefs.clearNamespace();
// 创建另一个命名空间
final appPrefs = SharedPreferencesWrapper.createNamespace('app');
await appPrefs.setValue('dark_mode', true);
bool? mode = await appPrefs.getValue('dark_mode');
print('mode: $mode');
方法链
可以通过构建器链式调用多个操作,使代码更具可读性。
// 创建构建器并链式调用方法
await SharedPreferencesWrapper.getBuilder().then((builder) => {
builder
.addBool('is_logged_in', true)
.addDouble('amount', 10.0)
.addString('account', 'Prestige')
.addInt('quantity', 100)
.addMap('users', {'name': 'Yung','lname': 'Cet'})
.addStringList('items', ['item 1', 'item 2'])
});
// 获取上述值,可以使用特定方法或 getValue()
final is_logged_in =
await SharedPreferencesWrapper.getValue('is_logged_in');
print('is_logged_in: $is_logged_in');
检查键是否存在
bool? exists = await SharedPreferencesWrapper.keyExists('key');
if (exists){
print('key exists');
}else{
print('key does not exist');
}
清除所有偏好设置
await SharedPreferencesWrapper.clearAll();
检查共享偏好设置是否为空
bool? isEmpty = await SharedPreferencesWrapper.isSharedPreferencesEmpty();
if (isEmpty){
print('shared preferences are not empty');
}else{
print('shared preferences are empty');
}
移除一个键
await SharedPreferencesWrapper.removeAtKey('key');
检索所有存储的偏好设置
Map<String, dynamic> allPreferences = await SharedPreferencesWrapper.getAllSharedPreferences();
print(allPreferences);
处理映射
存储映射
await SharedPreferencesWrapper.addMap('mapKey', {
'name': 'Yung',
'age': 30,
'isStudent': true,
});
检索映射
Map<String, dynamic>? value = await SharedPreferencesWrapper.getMap('mapKey');
print(value);
检索映射中特定键的值
dynamic value = await SharedPreferencesWrapper.getMapKey('mapKey', 'name');
print('value'); // 输出: Yung
更新映射
await SharedPreferencesWrapper.updateMap('mapKey', {'surname': 'Cet'});
更新后的映射现在看起来像这样:
{
'name': 'Yung',
'age': 30,
'isStudent': true,
'surname': 'Cet' // 新增项
}
更新映射中特定键的值
// 这将年龄值更新为 40
await SharedPreferencesWrapper.updateMapKey('mapKey', 'age', 40);
检查映射中特定键是否存在
final value = await SharedPreferencesWrapper.mapContainsKey('mapKey', 'mapKeyToCheck');
if (value){
print('key exists');
}else{
print('key does not exist');
}
删除映射中的特定键
await SharedPreferencesWrapper.removeMapKey('mapKey', 'mapKeyToRemove');
单批操作
一次性添加或更新多个键值对。
// 一次添加多个偏好设置
Map<String, dynamic> dataToAdd = {
'key1': 'value1',
'key2': 42,
'key3': true,
'key4': ['item1', 'item2'],
'key5': {'nestedKey': 'nestedValue'},
// 添加更多键值对
};
await SharedPreferencesWrapper.addBatch(dataToAdd);
// 正常访问批处理数据
bool boolValue = await SharedPreferencesWrapper.getBool('key3');
int intValue = await SharedPreferencesWrapper.getInt('key2');
// 批量更新现有偏好设置
Map<String, dynamic> dataToUpdate = {
'key3': false,
'key2': 100,
// 更新其他键
};
await SharedPreferencesWrapper.updateBatch(dataToUpdate);
使用监听器
监听器充当系统不同部分之间的中介,允许组件在不直接耦合的情况下响应变化。 有两种添加监听器的方法:
使用 addListener()
方法
// 定义处理监听器变化的函数
void handleChangeListener() {
print("Listener triggered!");
}
@override
void initState() {
WidgetsBinding.instance?.addPostFrameCallback((_) async {
// 注册监听器,当共享偏好设置发生变化时调用回调函数
SharedPreferencesWrapper.addListener('key', handleChangeListener);
});
}
也可以在内联定义回调函数,但如果你计划稍后移除监听器,最好定义一个回调函数,以确保函数签名相同。
SharedPreferencesWrapper.addListener('key', () {
print("Preference with key changed!");
});
移除 addListener()
中的监听器
// 定义处理监听器变化的函数
void handleChangeListener() {
print("Listener triggered!");
}
@override
void initState() {
WidgetsBinding.instance?.addPostFrameCallback((_) async {
SharedPreferencesWrapper.removeListener('key', handleChangeListener);
});
}
使用 addObserver()
方法
// 定义观察变化的函数
Function(String, dynamic) handleObserverChanges = (String key, dynamic newValue) {
print("Observer triggered with data: key=$key value=$newValue");
};
@override
void initState() {
WidgetsBinding.instance?.addPostFrameCallback((_) async {
// 添加观察者
SharedPreferencesWrapper.addObserver('observer', handleObserverChanges);
});
}
移除 addObserver()
中的监听器
SharedPreferencesWrapper.removeObserver('observer', handleObserverChanges);
共享偏好设置包装器加密
共享偏好设置包装器加密允许使用密钥加密和解密敏感数据。这仅适用于字符串数据类型。
AES 加密
// 导入加密库
import 'package:shared_preferences_wrapper/shared_preferences_wrapper_encryption.dart';
// 加密
String key = 'pin';
String value = '123456';
String secretKey16Char = 'my16CharacterKey';
await SharedPreferencesWrapper.addString(key, value,
aesEncryption:
AESEncryption( // 加密类型
encryptionKey: secretKey16Char, // 加密密钥
));
// 获取解密后的值
String? mypin = await SharedPreferencesWrapper.getString(key,
aesDecryption: // 解密类型
AESDecryption(
encryptionKey: encryptionKey // 加密密钥
));
print(mypin); // 输出 123456
Salsa20 加密
// 导入加密库
import 'package:shared_preferences_wrapper/shared_preferences_wrapper_encryption.dart';
// 加密
String key = 'pin';
String value = '123456';
String secretKey16Char = 'my16CharacterKey';
await SharedPreferencesWrapper.addString(key, value,
salsa20Encryption:
Salsa20Encryption( // 加密类型
encryptionKey: secretKey16Char, // 加密密钥
));
// 获取解密后的值
String? mypin = await SharedPreferencesWrapper.getString(key,
salsa20Decryption: // 解密类型
Salsa20Decryption(
encryptionKey: encryptionKey // 加密密钥
));
print(mypin); // 输出 123456
组织偏好设置
根据特定组或类别组织偏好设置。
// 向特定组添加偏好设置
await SharedPreferencesWrapper.addToGroup('UserSettings', 'username', 'JohnDoe');
await SharedPreferencesWrapper.addToGroup('UserSettings', 'email', 'john@example.com');
await SharedPreferencesWrapper.addToGroup('AppSettings', 'darkMode', true);
await SharedPreferencesWrapper.addToGroup('AppSettings', 'language', 'English');
// 从特定组检索偏好设置
Map<String, dynamic>? userSettings = await SharedPreferencesWrapper.getGroup('UserSettings');
Map<String, dynamic>? appSettings = await SharedPreferencesWrapper.getGroup('AppSettings');
print('userSettings: $userSettings');
print('appSettings: $appSettings');
更多关于Flutter本地数据存储插件shared_preferences_wrapper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter本地数据存储插件shared_preferences_wrapper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter应用中使用shared_preferences_wrapper
插件进行本地数据存储的示例代码。这个插件是对shared_preferences
的一个封装,提供了一些额外的功能和更好的类型安全。不过需要注意的是,shared_preferences_wrapper
本身并不是一个广泛认可的官方或知名第三方库,这里假设它是一个对shared_preferences
进行了封装的自定义库。如果你实际上是指直接使用shared_preferences
,代码逻辑是类似的。
首先,确保你已经在pubspec.yaml
文件中添加了依赖:
dependencies:
flutter:
sdk: flutter
shared_preferences: ^2.0.15 # 假设shared_preferences_wrapper依赖于shared_preferences
# 如果shared_preferences_wrapper确实存在,并且不是直接依赖于shared_preferences,
# 则应该添加其实际的依赖项,例如:
# shared_preferences_wrapper: ^x.y.z
然后,运行flutter pub get
来安装依赖。
接下来,是一个简单的示例,展示如何使用shared_preferences
(或假设的shared_preferences_wrapper
,如果它有类似的API)来存储和检索数据:
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart'; // 或 import 'package:shared_preferences_wrapper/shared_preferences_wrapper.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('SharedPreferences Demo'),
),
body: SharedPreferencesDemo(),
),
);
}
}
class SharedPreferencesDemo extends StatefulWidget {
@override
_SharedPreferencesDemoState createState() => _SharedPreferencesDemoState();
}
class _SharedPreferencesDemoState extends State<SharedPreferencesDemo> {
String? _savedValue;
@override
void initState() {
super.initState();
_loadPreferences();
}
Future<void> _loadPreferences() async {
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
setState(() {
_savedValue = sharedPreferences.getString('my_key');
});
}
Future<void> _savePreferences(String value) async {
SharedPreferences sharedPreferences = await SharedPreferences.getInstance();
await sharedPreferences.setString('my_key', value);
setState(() {
_savedValue = value;
});
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'Saved Value: $_savedValue',
style: TextStyle(fontSize: 20),
),
SizedBox(height: 20),
TextField(
decoration: InputDecoration(
border: OutlineInputBorder(),
labelText: 'Enter a value',
),
onChanged: (value) {
_savePreferences(value);
},
),
],
),
);
}
}
在这个示例中,我们做了以下几件事:
- 在
pubspec.yaml
中添加了shared_preferences
依赖(或假设的shared_preferences_wrapper
)。 - 在
SharedPreferencesDemo
组件中,使用SharedPreferences.getInstance()
异步获取SharedPreferences
实例。 - 使用
_loadPreferences
函数从SharedPreferences
中加载数据,并在组件状态初始化时调用它。 - 使用
_savePreferences
函数将用户输入的数据保存到SharedPreferences
中。这里,每当文本字段的内容改变时,都会调用这个函数来更新存储的值。
注意:如果shared_preferences_wrapper
确实存在并且提供了不同的API,你需要根据它的文档调整代码。上面的代码是基于shared_preferences
的标准用法,如果shared_preferences_wrapper
有额外的封装或功能,你应该参考其官方文档或源代码来正确使用。