Flutter安全存储插件stash_secure_storage的使用

Flutter安全存储插件stash_secure_storage的使用

stash_secure_storage

一个基于stash的存储扩展插件,用于secure_storage

Pub Package Coverage Status Package Documentation GitHub License

概述

这个存储扩展插件为stash提供了一个基于secure_storage的存储方式。

开始使用

在你的pubspec.yaml文件中添加以下依赖(或者创建它),并将x.x.x替换为stash_secure_storage的最新版本:

dependencies:
    stash_secure_storage: ^x.x.x

运行以下命令以安装依赖项:

flutter pub get

最后,导入库:

import 'package:stash/stash_api.dart';
import 'package:stash_secure_storage/stash_secure_storage.dart';

使用方法

下面的例子展示了如何创建一个带有secure_storage存储后端的保险库。在这个简单的例子中,对象的序列化和反序列化是由手写的,但更常见的是依靠像json_serializable这样的库。

示例代码

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:stash/stash_api.dart';
import 'package:stash_secure_storage/stash_secure_storage.dart';

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

class Counter {
  final int value;
  final DateTime updateTime;

  Counter({required this.value, required this.updateTime});

  /// 从json映射创建一个[Counter]
  factory Counter.fromJson(Map<String, dynamic> json) => Counter(
      value: json['value'] as int,
      updateTime: DateTime.parse(json['timestamp'] as String));

  /// 创建一个json映射
  Map<String, dynamic> toJson() => <String, dynamic>{
        'value': value,
        'timestamp': updateTime.toIso8601String()
      };
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // 这个小部件是你的应用的根节点。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Stash Secure Storage Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const SharedPreferencesDemo(),
    );
  }
}

class SharedPreferencesDemo extends StatefulWidget {
  const SharedPreferencesDemo({super.key});

  [@override](/user/override)
  SharedPreferencesDemoState createState() => SharedPreferencesDemoState();
}

class SharedPreferencesDemoState extends State<SharedPreferencesDemo> {
  final Future<Vault<Counter>> _vault = newSecureStorageVaultStore().then(
      (store) => store.vault<Counter>(
          name: 'vault', fromEncodable: (json) => Counter.fromJson(json)));
  late Future<Counter> _counter;

  Future<Counter> _getCounter([Vault<Counter>? vault]) {
    final v = vault == null ? _vault : Future.value(vault);

    return v.then((vault) => vault.get('counter')).then(
        (counter) => counter ?? Counter(value: 0, updateTime: DateTime.now()));
  }

  Future<void> _incrementCounter() async {
    final Vault<Counter> vault = await _vault;
    final Counter currentCounter = await _getCounter(vault);

    setState(() {
      final newCounter =
          Counter(value: currentCounter.value + 1, updateTime: DateTime.now());
      _counter = vault.put('counter', newCounter).then((value) => newCounter);
    });
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    _counter = _getCounter();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Secure Storage Demo'),
      ),
      body: Center(
          child: FutureBuilder<Counter>(
              future: _counter,
              builder: (BuildContext context, AsyncSnapshot<Counter> snapshot) {
                switch (snapshot.connectionState) {
                  case ConnectionState.none:
                  case ConnectionState.waiting:
                    return const CircularProgressIndicator();
                  case ConnectionState.active:
                  case ConnectionState.done:
                    if (snapshot.hasError) {
                      return Text('Error: ${snapshot.error}');
                    } else {
                      final count = snapshot.data?.value ?? 0;
                      final updateTime = snapshot.data?.updateTime;
                      final lastPressed = updateTime != null
                          ? ' (last pressed on ${DateFormat('dd-MM-yyyy HH:mm:ss').format(updateTime)})'
                          : '';
                      return Text(
                        'Button tapped $count time${count == 1 ? '' : 's'}.\n\n'
                        'This should persist across restarts$lastPressed.',
                      );
                    }
                }
              })),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ),
    );
  }
}

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

1 回复

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


stash_secure_storage 是一个用于 Flutter 的插件,它允许你在设备上安全地存储数据。这个插件基于 stash 库,并且使用了平台提供的安全存储机制(如 Android 的 EncryptedSharedPreferences 和 iOS 的 Keychain)来保护数据。

以下是如何在 Flutter 项目中使用 stash_secure_storage 插件的步骤:

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 stash_secure_storage 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  stash_secure_storage: ^2.0.0

然后运行 flutter pub get 来安装依赖。

2. 导入包

在你的 Dart 文件中导入 stash_secure_storage 包:

import 'package:stash_secure_storage/stash_secure_storage.dart';

3. 创建并配置存储

你可以使用 SecureStorageVault 来创建一个安全的存储实例:

final vault = await newSecureStorageVault();

4. 存储数据

你可以使用 put 方法来存储数据:

await vault.put('key', 'value');

5. 读取数据

使用 get 方法来读取存储的数据:

String? value = await vault.get('key');
print(value); // 输出: value

6. 删除数据

你可以使用 remove 方法来删除存储的数据:

await vault.remove('key');

7. 检查数据是否存在

使用 containsKey 方法来检查某个键是否存在:

bool exists = await vault.containsKey('key');
print(exists); // 输出: true 或 false

8. 清除所有数据

你可以使用 clear 方法来清除所有存储的数据:

await vault.clear();

9. 使用自定义配置

你还可以通过传递配置参数来定制存储行为,例如设置加密密钥:

final vault = await newSecureStorageVault(encryptionKey: 'your-encryption-key');

示例代码

以下是一个完整的示例,展示了如何使用 stash_secure_storage 插件进行数据的存储、读取、删除和检查:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 创建安全的存储实例
  final vault = await newSecureStorageVault();

  // 存储数据
  await vault.put('username', 'john_doe');

  // 读取数据
  String? username = await vault.get('username');
  print('Username: $username'); // 输出: Username: john_doe

  // 检查数据是否存在
  bool exists = await vault.containsKey('username');
  print('Username exists: $exists'); // 输出: Username exists: true

  // 删除数据
  await vault.remove('username');

  // 再次检查数据是否存在
  exists = await vault.containsKey('username');
  print('Username exists: $exists'); // 输出: Username exists: false

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Stash Secure Storage Example'),
        ),
        body: Center(
          child: Text('Check the console for output'),
        ),
      ),
    );
  }
}
回到顶部