Flutter本地数据存储插件shared_preferences_wrapper的使用

发布于 1周前 作者 yuanlaile 来自 Flutter

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

1 回复

更多关于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);
            },
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. pubspec.yaml中添加了shared_preferences依赖(或假设的shared_preferences_wrapper)。
  2. SharedPreferencesDemo组件中,使用SharedPreferences.getInstance()异步获取SharedPreferences实例。
  3. 使用_loadPreferences函数从SharedPreferences中加载数据,并在组件状态初始化时调用它。
  4. 使用_savePreferences函数将用户输入的数据保存到SharedPreferences中。这里,每当文本字段的内容改变时,都会调用这个函数来更新存储的值。

注意:如果shared_preferences_wrapper确实存在并且提供了不同的API,你需要根据它的文档调整代码。上面的代码是基于shared_preferences的标准用法,如果shared_preferences_wrapper有额外的封装或功能,你应该参考其官方文档或源代码来正确使用。

回到顶部