Flutter安全存储插件get_secure_storage的使用
Flutter安全存储插件get_secure_storage的使用
插件介绍
get_secure_storage
是 GetStorage
的加密版本,最初由 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
更多关于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应用,它允许用户保存、读取和删除一个认证令牌。请注意,在实际应用中,你应该从用户输入中获取令牌值,并且可能需要添加更多的错误处理和验证逻辑。