Flutter安全存储插件get_secure_storage的使用

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

Flutter安全存储插件get_secure_storage的使用

插件介绍

get_secure_storageGetStorage 的加密版本,最初由 Jonny Borges 编写(GitHub链接)。它是一个安全、快速、额外轻量且同步的内存中的键值对存储,支持在每次操作时将数据备份到磁盘。该插件完全用 Dart 编写,并基于 Cryptography dart 包。

  • 使用的加密库:cryptography
  • 加密算法:128位 AES-CTR 与 MAC sha256
  • 支持平台:Android, iOS, Web, Mac, Linux 和 Windows
  • 支持的数据类型:String, int, double, Map 和 List

添加依赖

在项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  get_secure_storage:

然后通过命令行安装依赖包:

flutter packages get

导入包

在 Dart 代码中导入 get_secure_storage 包:

import 'package:get_secure_storage/get_secure_storage.dart';

初始化存储

在应用启动时初始化 GetSecureStorage,建议在 main 函数中使用 await 来确保初始化完成:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await GetSecureStorage.init(password: 'strongpassword');
  runApp(const App());
}

基本操作

创建实例

可以通过创建一个 GetSecureStorage 实例来使用该插件,或者直接调用静态方法进行操作:

final box = GetSecureStorage(password: 'strongpassword');

写入数据

使用 write 方法向存储中写入数据:

box.write('quote', 'GetSecureStorage is the best');

读取数据

使用 read 方法从存储中读取数据:

print(box.read('quote'));
// 输出: GetSecureStorage is the best

删除数据

使用 remove 方法删除指定键的数据:

box.remove('quote');

监听变化

可以使用 listen 方法监听整个存储的变化:

Function? disposeListen;
disposeListen = box.listen(() {
  print('box changed');
});

记得在不再需要监听时调用 disposeListen?.call() 来释放资源。

对于特定键的变化,可以使用 listenKey 方法:

box.listenKey('key', (value) {
  print('new key is $value');
});

清空存储

要清空整个存储,可以调用 erase 方法:

box.erase();

创建不同容器

如果需要创建不同的容器,可以在初始化时指定名称:

GetSecureStorage g = GetSecureStorage(container: 'MyStorage', password: 'strongpassword');

同样地,初始化特定容器也需要指定名称:

await GetSecureStorage.init(container: 'MyStorage', password: 'strongpassword');

示例代码

下面是一个完整的示例应用程序,展示了如何使用 get_secure_storage 来存储和读取主题模式的状态以及上次更新的时间戳。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await GetSecureStorage.init(password: 'strongpassword');
  runApp(const App());
}

class App extends StatefulWidget {
  const App({Key? key}) : super(key: key);

  @override
  State<App> createState() => _AppState();
}

class _AppState extends State<App> {
  final box = GetSecureStorage();

  String get lastupdated => box.read('lastupdated') ?? 'never';

  bool get isDark => box.read('darkmode') ?? false;

  void changeTheme(bool val) {
    box.write('darkmode', val);
    box.write('lastupdated', DateTime.now().toLocal().toString());
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: isDark ? ThemeData.dark() : ThemeData.light(),
      home: Scaffold(
        appBar: AppBar(title: const Text("GetSecureStorage")),
        body: Row(
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            const Spacer(flex: 1),
            Flexible(
              flex: 3,
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                children: [
                  SwitchListTile(
                    value: isDark,
                    title: const Text("Touch to change ThemeMode"),
                    onChanged: changeTheme,
                  ),
                  const SizedBox(height: 10),
                  Text('Last updated: $lastupdated')
                ],
              ),
            ),
            const Spacer(flex: 1),
          ],
        ),
      ),
    );
  }
}

这个示例应用程序允许用户切换主题模式(浅色/深色),并将选择保存到 get_secure_storage 中。同时,它还会记录并显示最后一次更新的时间。


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

1 回复

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


当然,以下是如何在Flutter应用中使用get_secure_storage插件的一个代码示例。get_secure_storage插件允许你以安全的方式在设备上存储和检索敏感数据,如用户的认证令牌等。

首先,你需要在你的pubspec.yaml文件中添加依赖项:

dependencies:
  flutter:
    sdk: flutter
  get_secure_storage: ^4.0.0  # 请检查最新版本号

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

接下来,在你的Flutter应用中,你可以按照以下步骤使用get_secure_storage插件:

1. 导入包

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

import 'package:get_secure_storage/get_secure_storage.dart';

2. 初始化存储

你可以在应用启动时初始化存储。通常,这会在你的主文件(如main.dart)或某个服务文件中完成。

final SecureStorage storage = SecureStorage();

Future<void> initStorage() async {
  // 等待存储初始化完成
  await storage.init();
}

3. 写入数据

使用write方法将数据写入安全存储。例如,存储一个用户的认证令牌:

Future<void> saveAuthToken(String authToken) async {
  await storage.write(key: 'authToken', value: authToken);
}

4. 读取数据

使用read方法从安全存储中读取数据:

Future<String?> readAuthToken() async {
  return await storage.read(key: 'authToken');
}

5. 删除数据

使用delete方法从安全存储中删除数据:

Future<void> deleteAuthToken() async {
  await storage.delete(key: 'authToken');
}

6. 完整示例

以下是一个完整的示例,展示了如何在Flutter应用中使用get_secure_storage插件:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final SecureStorage storage = SecureStorage();
  await storage.init();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SecureStorageExample(),
    );
  }
}

class SecureStorageExample extends StatefulWidget {
  @override
  _SecureStorageExampleState createState() => _SecureStorageExampleState();
}

class _SecureStorageExampleState extends State<SecureStorageExample> {
  final SecureStorage storage = SecureStorage();
  String? authToken;

  Future<void> saveAuthToken(String token) async {
    setState(() {
      authToken = token; // 更新UI显示
    });
    await storage.write(key: 'authToken', value: token);
  }

  Future<void> readAuthToken() async {
    String? token = await storage.read(key: 'authToken');
    setState(() {
      authToken = token; // 更新UI显示
    });
  }

  Future<void> deleteAuthToken() async {
    setState(() {
      authToken = null; // 更新UI显示
    });
    await storage.delete(key: 'authToken');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Secure Storage Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            TextField(
              decoration: InputDecoration(labelText: 'Enter Auth Token'),
              onChanged: (value) {
                // 这里可以添加一些逻辑来实时保存或验证输入
              },
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () async {
                String token = 'exampleAuthToken123'; // 这里应该使用TextField的值
                await saveAuthToken(token);
              },
              child: Text('Save Auth Token'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () async {
                await readAuthToken();
              },
              child: Text('Read Auth Token'),
            ),
            SizedBox(height: 16),
            if (authToken != null)
              Text('Stored Auth Token: $authToken'),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () async {
                await deleteAuthToken();
              },
              child: Text('Delete Auth Token'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它允许用户保存、读取和删除一个认证令牌。请注意,在实际应用中,你应该从用户输入中获取令牌值,并且可能需要添加更多的错误处理和验证逻辑。

回到顶部