Flutter数据存储插件sunday_get_storage的使用

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

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 非常快,因为它基于内存进行操作。所有操作都是即时完成的,每次操作后会将数据备份到磁盘上的容器中。每个容器都有自己的文件。

Delete Benchmark Write Benchmark Read Benchmark

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

1 回复

更多关于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),
            ),
          ],
        ),
      ),
    );
  }
}

注意

  1. 在实际使用中,你可能需要使用TextEditingController来获取TextField的当前文本值。
  2. 确保处理可能的异常,例如读写失败的情况。
  3. 由于sunday_get_storage是基于get_storage的一个封装或变体(具体细节可能有所不同),上述代码假设sunday_get_storage的使用方式与get_storage类似。如果sunday_get_storage有特定的初始化步骤或API差异,请参考其官方文档进行调整。

这个示例展示了如何使用sunday_get_storage插件来存储和检索简单的字符串数据。你可以根据需要扩展这个示例来存储更复杂的数据类型。

回到顶部