Flutter数据存储插件the_storage的使用
Flutter数据存储插件the_storage的使用
TheStorage
一个用于Flutter的快速且安全的数据存储库。
特性
- 快速高效的存储操作
- 数据加密安全
- 易于使用的API
开始使用
要使用该包,请在pubspec.yaml
文件中添加the_storage
作为依赖项。
dependencies:
the_storage: ^x.x.x
然后运行flutter pub get
以安装该包。
使用方法
导入包
import 'package:the_storage/the_storage.dart';
初始化存储实例
// 初始化存储实例,可以指定数据库文件名
TheStorage.i().init(dbName: 'my_storage.db');
写入键值对到存储
// 写入键值对到存储
TheStorage.i().set('myKey', 'myValue');
从存储读取值
// 从存储读取值
final value = await TheStorage.i().get('myKey');
使用域来分离数据
// 在特定域下写入键值对
await TheStorage.i().set('myKey', 'myValue', domain: 'myDomain');
// 从特定域读取键值对
final data = await TheStorage.i().get('myKey', domain: 'myDomain');
删除键值对
// 删除特定域下的键值对
await TheStorage.i().delete(
'myKey',
domain: 'myDomain',
);
批量操作
// 在特定域下批量写入多个键值对,并指定是否覆盖现有值
await TheStorage.i().setDomain(
{
'myKey': 'myValue',
'myKey2': 'myValue2',
},
domain: 'myDomain',
overwrite: false,
);
获取特定域下的所有键值对或仅获取键
// 获取特定域下的所有键值对
final domain = await TheStorage.i().getDomain(
domain: 'myDomain',
);
// 获取特定域下的所有键
final domainKeys = await TheStorage.i().getDomainKeys(
domain: 'myDomain',
);
删除特定域下的数据
// 删除特定域下的数据
await TheStorage.i().deleteDomain(
[
'myKey',
'myKey2',
],
domain: 'myDomain',
);
清除所有数据
// 清除所有数据
await TheStorage.i().clear();
重置存储(用于调试)
// 重置存储,这将删除存储文件并释放存储实例。因此,应该在重置后再次调用 `init()` 方法
await TheStorage.i().reset();
反应式监听
TheStorage 提供了一种反应式的方式来监听存储的变化。你可以使用 stream
版本的 get
, getDomain
和 getDomainKeys
方法来监听存储的变化:
// 监听特定键的变化
final valueStream = await TheStorage.i().subscribe('myKey', domain: 'myDomain');
// 监听特定域下的所有键值对的变化
final domainStream = await TheStorage.i().subscribeDomain('myDomain');
// 监听特定域下的所有键的变化
final domainKeysStream = await TheStorage.i().subscribeDomainKeys('myDomain');
这些方法除了与非流版本相同的方法参数外,还接受一个布尔类型的 keepAlive
参数,该参数指定在最后一个订阅者取消订阅时是否保持流活跃,以便数据保留在内存中而不是从存储重新获取。默认情况下,keepAlive
为 true
。
加密
TheStorage 使用 flutter_secure_storage
包来存储密钥和初始向量。每个记录键都使用AES算法和256位密钥及128位初始向量进行加密。为了加密记录数据,使用相同的256位密钥和唯一的(对于每个记录)128位种子向量,该向量与加密数据一起存储。因此,每个记录都有自己的初始向量。这种方法使得不可能通过比较已知源数据的加密数据来进行重放攻击。
存储
TheStorage 使用 sqflite
包来存储数据。这是一种在设备上存储数据的快速可靠的方法。TheStorage 使用单个表来存储所有数据,并使用索引来加速数据搜索。
测试
该包包含几个单元测试以验证其功能。要运行这些测试,请使用以下命令:
flutter test
完整示例
以下是一个完整的示例代码,展示了如何使用 the_storage
插件:
// ignore_for_file: public_member_api_docs
import 'dart:developer' as developer;
import 'package:flutter/material.dart';
import 'package:the_storage/the_storage.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
// 这个小部件是你的应用的根。
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'TheStorage Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key});
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
[@override](/user/override)
void initState() {
super.initState();
TheStorage.i().init();
}
[@override](/user/override)
void dispose() {
TheStorage.i().dispose();
super.dispose();
}
Future<void> writeDb() async {
await TheStorage.i().set('myKey', 'myValue');
developer.log("read from DB: myKey: 'myValue'");
}
Future<void> readDb() async {
developer.log("read from DB: myKey: '${await TheStorage.i().get('myKey')}'");
}
Future<void> clearDb() async {
await TheStorage.i().clearAll();
developer.log('clear DB');
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
ElevatedButton(
onPressed: writeDb,
child: const Text('Write to DB'),
),
ElevatedButton(
onPressed: readDb,
child: const Text('Read from DB'),
),
ElevatedButton(
onPressed: clearDb,
child: const Text('Clear DB'),
),
],
),
),
);
}
}
更多关于Flutter数据存储插件the_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据存储插件the_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用the_storage
插件进行数据存储的示例代码。the_storage
是一个简单的键值对存储插件,非常适合存储小型数据。
步骤 1: 添加依赖
首先,在你的pubspec.yaml
文件中添加the_storage
插件的依赖:
dependencies:
flutter:
sdk: flutter
the_storage: ^2.0.0 # 确保版本号是最新的
然后运行flutter pub get
来安装依赖。
步骤 2: 导入插件
在你的Dart文件中导入the_storage
插件:
import 'package:the_storage/the_storage.dart';
步骤 3: 使用存储功能
下面是一个完整的示例,展示如何使用the_storage
插件进行数据存储和读取。
import 'package:flutter/material.dart';
import 'package:the_storage/the_storage.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Storage Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: StorageDemo(),
);
}
}
class StorageDemo extends StatefulWidget {
@override
_StorageDemoState createState() => _StorageDemoState();
}
class _StorageDemoState extends State<StorageDemo> {
final Storage storage = new Storage("my_prefs");
String _storedValue = "";
@override
void initState() {
super.initState();
// 尝试从存储中读取值
_readValue();
}
Future<void> _writeValue(String value) async {
await storage.save("my_key", value);
setState(() {
// 更新界面显示存储的值(这里只是为了演示,实际上值已经被存储)
_storedValue = value;
});
}
Future<void> _readValue() async {
String? value = await storage.load("my_key");
if (value != null) {
setState(() {
_storedValue = value;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Flutter Storage Demo'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text("Stored Value:", style: TextStyle(fontSize: 18)),
Text(_storedValue, style: TextStyle(fontSize: 16)),
SizedBox(height: 20),
TextField(
decoration: InputDecoration(labelText: 'Enter a value'),
onChanged: (value) {
// 每当文本框内容变化时,更新存储的值
_writeValue(value);
},
),
],
),
),
);
}
}
解释
- 依赖添加:在
pubspec.yaml
中添加the_storage
依赖。 - 导入插件:在Dart文件中导入
the_storage
。 - 初始化存储:创建一个
Storage
实例,指定一个文件名(例如my_prefs
)。 - 存储数据:使用
storage.save
方法存储键值对数据。 - 读取数据:使用
storage.load
方法读取存储的值。 - UI更新:在UI中显示存储的值,并在文本框内容变化时更新存储的值。
这个示例展示了如何使用the_storage
插件进行简单的数据存储和读取操作。你可以根据需要扩展和修改这个示例。