Flutter数据持久化插件keeper的使用

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

Flutter数据持久化插件keeper的使用

Keeper简化了状态存储。只需指定存储位置,Keeper就会处理其余的事情。你不需要编写代码来加载、保存和转换数据,Keeper会为你处理这些事情。

特性

  • ✅ 同步存储
  • 🚧 异步存储*
    • ✅ 存储单个异步值
    • ❌ 在同步键中存储值
  • ❌ MobX存储支持
  • ❌ 函数类型
  • ❌ 观察存储更改
  • ✅ 可扩展为多种存储容器

支持的存储容器:

  • ✅ 内存存储
  • ✅ Hive存储(通过keeper_hive

* 每个字段仅支持一个异步注解,异步字段不支持同步注解

✅ 可用 | 🚧 开发中 | ❌ 不支持

入门指南

Keeper依赖于代码生成来避免编写存储代码。代码由keeper_codegen生成,该工具需要build_runner

⚠️ 这是一个实验性项目。谨慎使用。

使用方法

pubspec.yaml文件中添加依赖项:

dependencies:
  keeper: ^0.0.1

dev_dependencies:
  build_runner: ^2.1.5 # 检查pub.dev上的最新版本
  keeper_codegen: ^0.0.1 # 检查pub.dev上的最新版本

在你的Dart文件中导入keeper

import 'package:keeper/keeper.dart';

设置存储键:

KeepKey counterValue() => MemoryKeep().key('counter_value');

设置类:

part 'counter.g.dart';

class Counter = _Counter with _$CounterKeeper;

[@kept](/user/kept)
class _Counter {
  @At(counterValue)
  int value = 0;

  void increment() {
    value++;
  }
}

当值发生变化时,它将自动存储。

不同的存储机制可能需要不同的初始化。

额外信息

欢迎贡献和报告问题!请包含相关信息以帮助解决问题。

该项目在MIT许可证下授权。


示例

以下是简单的计数器类示例。它们展示了如何使用插件与同步和异步键。

计数器 (counter.dart)

使用同步键的计数器示例:

import 'package:keeper/keeper.dart';

part 'counter.g.dart';

class Counter = _Counter with _$CounterKeeper;

KeepKey counterValue() => MemoryKeep().key('counter_value');

[@kept](/user/kept)
class _Counter {
  @At(counterValue)
  int value = 0;

  void increment() {
    value++; // 增加计数值
  }
}

异步计数器 (counter_async.dart)

使用异步键的计数器示例:

import 'package:keeper/keeper.dart';

part 'counter_async.g.dart';

class CounterAsync = _CounterAsync with _$CounterAsyncKeeper;

KeepAsyncKey<int> counterAsyncValue() => MemoryKeep().asyncKey('counter_async');

[@kept](/user/kept)
class _CounterAsync {
  [@AtAsync](/user/AtAsync)(counterAsyncValue)
  KeepAsyncValue<int> value = KeepAsyncValue(0); // 初始化计数值为0

  Future increment() async {
    await value.set(await value.get() + 1); // 增加计数值并存储
  }
}

更多关于Flutter数据持久化插件keeper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter数据持久化插件keeper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用keeper插件进行数据持久化的代码示例。keeper是一个轻量级、易用的Flutter本地存储插件,支持简单的键值对存储。

步骤 1: 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  keeper: ^x.y.z  # 请替换为最新版本号

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

步骤 2: 导入并使用Keeper

在你的Dart文件中导入keeper包,并使用它来存储和检索数据。

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

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Keeper Example',
      home: KeeperExampleScreen(),
    );
  }
}

class KeeperExampleScreen extends StatefulWidget {
  @override
  _KeeperExampleScreenState createState() => _KeeperExampleScreenState();
}

class _KeeperExampleScreenState extends State<KeeperExampleScreen> {
  final Keeper _keeper = Keeper();
  String? _savedValue;

  @override
  void initState() {
    super.initState();
    // 尝试从Keeper中获取之前保存的值
    _loadValue();
  }

  Future<void> _loadValue() async {
    String? value = await _keeper.getString('my_key');
    setState(() {
      _savedValue = value;
    });
  }

  Future<void> _saveValue(String value) async {
    await _keeper.setString('my_key', value);
    setState(() {
      _savedValue = value;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Keeper Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text(
              'Saved Value:',
              style: TextStyle(fontSize: 18),
            ),
            SizedBox(height: 8),
            Text(
              _savedValue ?? 'No value saved yet',
              style: TextStyle(fontSize: 16),
            ),
            SizedBox(height: 24),
            TextField(
              decoration: InputDecoration(labelText: 'Enter a value'),
              onChanged: (value) {
                // 你可以在这里实时保存数据,或者点击按钮保存
                // _saveValue(value);
              },
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () async {
                // 获取TextField中的当前值(这里假设你有一个controller来获取它)
                // String currentValue = textFieldController.text;
                // 由于示例中未使用controller,这里直接用一个示例值
                String currentValue = 'Example Value';
                await _saveValue(currentValue);
              },
              child: Text('Save Value'),
            ),
          ],
        ),
      ),
    );
  }
}

注意事项

  1. TextField Controller: 在实际项目中,你可能需要一个TextEditingController来管理TextField的值。上面的代码为了简化,没有使用TextEditingController
  2. 异常处理: 在实际项目中,进行异步操作时应该添加异常处理,以确保应用的健壮性。
  3. 清理资源: 在适当的时机清理资源,例如在应用关闭时取消未完成的异步操作。

这个示例展示了如何使用keeper插件进行简单的键值对存储。keeper还提供了其他类型的数据存储方法,如setIntsetDoublesetBool等,你可以根据需求选择合适的方法进行数据持久化。

回到顶部