Flutter数据存储插件sunday_get_storage的使用
Flutter数据存储插件sunday_get_storage的使用
sunday_get_storage
是一个快速、超轻量级且同步的内存键值存储,它在每次操作时将数据备份到磁盘。该插件完全用Dart编写,并且可以轻松与Flutter的Get框架集成。
支持平台
- Android
- iOS
- Web
- Mac
- Linux
- Fuchsia
- Windows
支持的数据类型
String
int
double
Map
List
1. 添加依赖
在 pubspec.yaml
文件中添加 sunday_get_storage
依赖:
dependencies:
sunday_get_storage:
2. 安装依赖
通过命令行安装依赖:
flutter packages get
3. 导入库
在你的 Dart 代码中导入 sunday_get_storage
:
import 'package:sunday_get_storage/sunday_get_storage.dart';
4. 初始化存储驱动
在 main
函数中初始化存储驱动,确保使用 await
:
void main() async {
await GetStorage.init();
runApp(App());
}
5. 使用 GetStorage
你可以通过创建 GetStorage
的实例来使用它,或者直接使用 GetStorage().read('key')
。
创建实例
final box = GetStorage();
写入数据
使用 write
方法写入数据:
box.write('quote', 'GetX est le meilleur');
读取数据
使用 read
方法读取数据:
print(box.read('quote'));
// 输出:GetX est le meilleur
删除数据
使用 remove
方法删除指定键的数据:
box.remove('quote');
监听变化
使用 listen
方法监听所有变化:
Function? disposeListen;
disposeListen = box.listen(() {
print('存储已更改');
});
确保在不再需要监听时调用 dispose
:
disposeListen?.call();
监听特定键的变化
使用 listenKey
方法监听特定键的变化:
box.listenKey('key', (value) {
print('新值:$value');
});
清空存储
使用 erase
方法清空整个存储:
box.erase();
创建多个存储容器
你可以为不同的存储容器命名,并监听特定的存储容器或删除它们:
GetStorage g = GetStorage('MyStorage');
初始化特定的存储容器:
await GetStorage.init('MyStorage');
6. 实现 SharedPreferences
你可以使用 sunday_get_storage
来替代 SharedPreferences
,以下是一个示例:
class MyPref {
static final _otherBox = () => GetStorage('MyPref');
final username = ''.val('username');
final age = 0.val('age');
final price = 1000.val('price', getBox: _otherBox);
// 或者
final username2 = ReadWriteValue('username', '');
final age2 = ReadWriteValue('age', 0);
final price2 = ReadWriteValue('price', '', _otherBox);
}
void updateAge() {
final age = 0.val('age');
// 或者
final age = ReadWriteValue('age', 0, () => box);
// 或者
final age = Get.find<MyPref>().age;
age.val = 1; // 将被保存到存储中
final realAge = age.val; // 从存储中读取
}
7. 性能基准测试结果
sunday_get_storage
非常快,因为它基于内存进行操作。所有操作都是即时完成的,每次操作后会将数据备份到磁盘上的容器中。每个容器都有自己的文件。
8. 什么时候使用 GetStorage
- 简单的 Map 存储
- HTTP 请求缓存
- 用户信息的简单存储
- 简单的持久化状态管理
- 替代
SharedPreferences
的场景
9. 什么时候不使用 GetStorage
- 需要索引时
- 需要在每次写入后立即确认数据是否已写入磁盘(内存中的存储是即时完成的,可以立即通过
box.read()
读取,而磁盘备份是在后台进行的。如果你总是需要等待磁盘写入完成,那么使用await
没有意义)
10. 示例代码
以下是一个完整的示例代码,展示了如何使用 sunday_get_storage
进行主题切换并持久化存储:
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:sunday_get_storage/sunday_get_storage.dart';
void main() async {
// 初始化 GetStorage
await GetStorage.init();
runApp(App());
}
class Controller extends GetxController {
// 创建 GetStorage 实例
final box = GetStorage();
// 获取当前是否为暗黑模式,默认为 false
bool get isDark => box.read('darkmode') ?? false;
// 根据 isDark 返回相应的主题
ThemeData get theme => isDark ? ThemeData.dark() : ThemeData.light();
// 切换主题
void changeTheme(bool val) => box.write('darkmode', val);
}
class App extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
// 创建 Controller 实例
final controller = Get.put(Controller());
return Obx(() {
// 使用 Obx 监听 controller 的变化
return MaterialApp(
theme: controller.theme,
home: Scaffold(
appBar: AppBar(title: Text("Get Storage")),
body: Center(
child: SwitchListTile(
value: controller.isDark,
title: Text("点击切换主题"),
onChanged: controller.changeTheme,
),
),
),
);
});
}
}
更多关于Flutter数据存储插件sunday_get_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter数据存储插件sunday_get_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter应用中使用sunday_get_storage
插件进行数据存储和检索的代码示例。这个插件提供了一个简单的方法来在本地存储键值对数据。
首先,你需要在pubspec.yaml
文件中添加sunday_get_storage
依赖:
dependencies:
flutter:
sdk: flutter
sunday_get_storage: ^latest_version # 请替换为最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,你可以在你的Flutter应用中使用这个插件。以下是一个完整的示例,展示了如何存储和检索数据:
import 'package:flutter/material.dart';
import 'package:sunday_get_storage/sunday_get_storage.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: StorageExample(),
);
}
}
class StorageExample extends StatefulWidget {
@override
_StorageExampleState createState() => _StorageExampleState();
}
class _StorageExampleState extends State<StorageExample> {
final GetStorage _box = GetStorage();
String? _retrievedValue;
@override
void initState() {
super.initState();
// 在应用启动时尝试从存储中检索数据
_retrieveData();
}
Future<void> _retrieveData() async {
// 从存储中检索数据
String? value = await _box.read('my_key');
if (value != null) {
setState(() {
_retrievedValue = value;
});
}
}
Future<void> _saveData(String value) async {
// 将数据保存到存储中
await _box.write('my_key', value);
setState(() {
_retrievedValue = value; // 更新界面显示
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Sunday Get Storage Example'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
TextField(
decoration: InputDecoration(labelText: 'Enter some text'),
onChanged: (value) {
// 当文本改变时,不立即保存,而是在点击按钮时保存
},
),
SizedBox(height: 16.0),
ElevatedButton(
onPressed: () {
// 获取TextField的当前文本(这里假设有一个控制器来管理TextField)
// TextEditingController _controller = TextEditingController();
// String currentValue = _controller.text;
// 由于示例中没有使用控制器,这里我们仅用一个静态字符串代替
String currentValue = 'Sample Text'; // 替换为实际获取的值
_saveData(currentValue);
},
child: Text('Save Data'),
),
SizedBox(height: 16.0),
Text(
'Retrieved Value: $_retrievedValue',
style: TextStyle(fontSize: 18.0),
),
],
),
),
);
}
}
注意:
- 在实际使用中,你可能需要使用
TextEditingController
来获取TextField
的当前文本值。 - 确保处理可能的异常,例如读写失败的情况。
- 由于
sunday_get_storage
是基于get_storage
的一个封装或变体(具体细节可能有所不同),上述代码假设sunday_get_storage
的使用方式与get_storage
类似。如果sunday_get_storage
有特定的初始化步骤或API差异,请参考其官方文档进行调整。
这个示例展示了如何使用sunday_get_storage
插件来存储和检索简单的字符串数据。你可以根据需要扩展这个示例来存储更复杂的数据类型。