Flutter本地存储管理插件storage_wrapper的使用

Flutter本地存储管理插件storage_wrapper的使用

storage_wrapper 是一个用于简化 shared_preferencesflutter_secure_storage 使用的封装插件。它提供了统一的API接口,并且方便进行测试时的数据模拟。

如何工作

调用 StorageWrapper.common() 构造函数将返回一个实例,该实例使用 shared_preferences 插件保存数据到 SharedPreferences 中。

调用 StorageWrapper.secure() 构造函数将返回一个实例,该实例使用 flutter_secure_storage 插件安全地保存数据。

一旦获得实例,您可以使用以下方法:

  • write
  • read
  • delete
  • containsKey
  • getAll
  • deleteAll

这些方法都接受以下参数:

  • key: 用于标识值的键(字符串)
  • iOptions: 指定iOS安全存储访问选项的 IOSOptions 对象
  • aOptions: 指定Android安全存储访问选项的 AndroidOptions 对象

虽然 AndroidOptions 看起来没有被 flutter_secure_storage 使用,但您可以在此了解更多关于 IOSOptions 的信息。

注意: 在版本 1.3.0 及以上版本中,您可以通过 StorageWrapper.secure() 构造函数传递 iOptionsaOptions 参数,以避免在每次方法调用时重复传递相同的选项。然而,单个方法中的选项会覆盖实例中的选项。

测试时的数据模拟

您可以调用 enableMock 方法并传递一个可选的 Map<String, String> 作为初始值。如果未传递任何内容,存储器将保持模拟模式(isMocking 将为真),但没有任何初始数据,默认为空的 Map<String, String>

模拟的数据不会持久化,每个 StorageWrapper 实例都不会有相同的数据:

final mockWrapper = StorageWrapper.secure();
mockWrapper.enableMock();

final mockWrapper2 = StorageWrapper.secure();
mockWrapper2.enableMock({'foo': 'bar'});

final anotherWrapper = StorageWrapper.secure();

// mockWrapper 和 mockWrapper2 将有不同的数据源
// anotherWrapper 不是模拟的

后续调用 enableMock 不会产生任何效果。您可以通过访问 mockEntries 属性来操纵数据。

更多文档

该包包装了:

Web支持

该包也适用于Web平台。

当使用Flutter Web时,CommonStorage 用于 commonsecure 模式。这可能是因为 pub.dev 未识别与Web的兼容性,因为 flutter_secure_storage 不支持。

完整示例Demo

下面是完整的示例代码,展示了如何使用 storage_wrapper 插件:

import 'dart:convert';
import 'dart:math';

import 'package:flutter/material.dart';
import 'package:storage_wrapper/storage_wrapper.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String commonValue;
  String secureValue;
  final commonStorage = StorageWrapper.common();
  final secureStorage = StorageWrapper.secure();
  String allCommon;
  String allSecure;

  void writeRandom() async {
    final int random = Random().nextInt(100);
    await commonStorage.write(key: 'common', value: random.toString());
    await secureStorage.write(key: 'secure', value: random.toString());
  }

  void readValues() async {
    commonValue = await commonStorage.read(key: 'common');
    secureValue = await secureStorage.read(key: 'secure');
    setState(() {});
  }

  void clearAll() async {
    await commonStorage.deleteAll();
    await secureStorage.deleteAll();
    readValues();
  }

  void getAll() async {
    allCommon = jsonEncode(await commonStorage.getAll());
    allSecure = jsonEncode(await secureStorage.getAll());
    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Storage Wrapper example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              'Secure value: $secureValue',
            ),
            Text(
              'Common value: $commonValue',
            ),
            Text('All commons: $allCommon'),
            Text('All secure: $allSecure'),
            ElevatedButton(onPressed: writeRandom, child: Text('Write random')),
            ElevatedButton(onPressed: readValues, child: Text('Read values')),
            ElevatedButton(onPressed: clearAll, child: Text('Clear values')),
            ElevatedButton(onPressed: getAll, child: Text('Get all values')),
          ],
        ),
      ),
      // 这个尾随逗号使自动格式化更美观
    );
  }
}

更多关于Flutter本地存储管理插件storage_wrapper的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter本地存储管理插件storage_wrapper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用Flutter本地存储管理插件storage_wrapper的代码示例。这个插件通常用于简化本地存储(如SharedPreferences、SQLite等)的操作。

首先,确保你已经在pubspec.yaml文件中添加了storage_wrapper依赖:

dependencies:
  flutter:
    sdk: flutter
  storage_wrapper: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来获取依赖。

接下来,你可以在Flutter项目中使用storage_wrapper进行本地存储管理。以下是一个完整的示例,包括初始化插件、存储和读取数据:

import 'package:flutter/material.dart';
import 'package:storage_wrapper/storage_wrapper.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Storage Wrapper Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: StorageWrapperExample(),
    );
  }
}

class StorageWrapperExample extends StatefulWidget {
  @override
  _StorageWrapperExampleState createState() => _StorageWrapperExampleState();
}

class _StorageWrapperExampleState extends State<StorageWrapperExample> {
  late StorageWrapper _storage;

  @override
  void initState() {
    super.initState();
    // 初始化StorageWrapper
    _storage = StorageWrapper();
    _storage.init().then((_) {
      // 可以在这里执行一些初始化后的操作
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Storage Wrapper Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                // 存储数据
                await _storage.setString('key_string', 'Hello, World!');
                await _storage.setInt('key_int', 42);
                await _storage.setDouble('key_double', 3.14);
                await _storage.setBool('key_bool', true);
                
                // 读取数据
                String? stringValue = await _storage.getString('key_string');
                int? intValue = await _storage.getInt('key_int');
                double? doubleValue = await _storage.getDouble('key_double');
                bool? boolValue = await _storage.getBool('key_bool');
                
                // 显示读取到的数据
                showDialog(
                  context: context,
                  builder: (BuildContext context) {
                    return AlertDialog(
                      title: Text('Stored Data'),
                      content: Text(
                        'String: $stringValue\n'
                        'Int: $intValue\n'
                        'Double: $doubleValue\n'
                        'Bool: $boolValue',
                      ),
                      actions: <Widget>[
                        TextButton(
                          onPressed: () {
                            Navigator.of(context).pop();
                          },
                          child: Text('OK'),
                        ),
                      ],
                    );
                  },
                );
              },
              child: Text('Store and Retrieve Data'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们:

  1. pubspec.yaml文件中添加了storage_wrapper依赖。
  2. 创建了一个Flutter应用,并在其中使用StorageWrapper进行本地存储管理。
  3. initState方法中初始化了StorageWrapper
  4. 创建了一个按钮,当点击按钮时,将数据存储到本地,并立即读取这些数据,然后在对话框中显示。

请注意,storage_wrapper插件的实际API可能会根据版本有所不同,因此请查阅最新的官方文档以获取最准确的信息。

回到顶部