Flutter数据库管理插件easy_hive的使用

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

Flutter数据库管理插件easy_hive的使用

Easy Hive

Easy Hive 是一个封装了 Hive 数据库的插件,使得数据管理更加简单易用。

Outline 📋

  1. Features 🎁
  2. Installation 💻
  3. Usage 📖
  4. Advanced Usage 😈

Features 🎁

  • Encryption 🔐
  • Lazy loading 🐢
  • Enum key support
  • Listenable 🎧

Installation 💻

pubspec.yaml 中添加依赖:

dependencies:
  easy_hive: ^1.0.1+2

安装插件:

flutter pub get

Usage 📖

你可以将你的盒子定义为 Singleton 类,或者使用服务定位器如 get_it

1. 定义盒子键 🔑
enum Settings {
  key, // 使用作为盒子键。可以使用字符串常量代替。
  themeMode,
  counter,
}
1. 定义一个盒子 📦
import 'package:easy_hive/easy_hive.dart';

class SettingsBox extends EasyBox {
  @override
  String get boxKey => Settings.key.toString();

  /// Singleton.
  static final SettingsBox _instance = SettingsBox._();

  factory SettingsBox() => _instance;

  SettingsBox._();
}
或者使用 get_it
import 'package:easy_hive/easy_hive.dart';

class SettingsBox extends EasyBox {
  @override
  String get boxKey => Settings.key.toString();
}
2. 初始化盒子 🚀
import 'package:easy_hive/easy_hive.dart';

Future<void> main() async {
  await EasyBox.initialize();

  await SettingsBox().init();

  runApp(...);
}
或者使用 get_it
import 'package:easy_hive/easy_hive.dart';

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Hive.initFlutter();

  final settingsBox = SettingsBox();
  await settingsBox.init();
  GetIt.I.registerSingleton<SettingsBox>(settingsBox);

  runApp(...);
}
3. 定义 getter & setter 为你的数据 💄
extension GeneralSettingsExtension on SettingsBox {
  ThemeMode get themeMode {
    final index = get(Settings.themeMode, defaultValue: 0);
    return ThemeMode.values[index];
  }

  set themeMode(ThemeMode value) => put(Settings.themeMode, value.index);

  int get counter => get(Settings.counter, defaultValue: 0);

  set counter(int value) => put(Settings.counter, value);
}
4. 在任何地方使用它 🔥
Text(
  'You have pushed: ${SettingsBox().counter} times.',
  style: Theme.of(context).textTheme.headlineMedium,
),
FilledButton(
  onPressed: () {
    SettingsBox().counter++;
  },
  child: Text('Increment'),
),
FilledButton(
  onPressed: () {
    SettingsBox().themeMode = ThemeMode.dark;
  },
  child: Text('Dark Theme'),
),
或者使用 get_it
Text(
  'Count: ${GetIt.I&lt;SettingsBox&gt;().counter}',
  style: Theme.of(context).textTheme.headlineMedium,
),

Advanced Usage 😈

启用加密 🔐
  1. 安装 easy_hive_encryption
    import 'package:easy_hive/easy_hive.dart';
    import 'package:easy_hive_encryption/easy_hive_encryption.dart';
    
    class SettingsBox extends EasyBox with EncryptionMixin {
      @override
      String get boxKey => Settings.key.toString();
    
      /// 自定义加密密钥名称(可选)。
      @override
      String get encryptionKeyName => "your-own-key-name";
    }
    
  2. 按照 flutter_secure_storage 的特定平台设置指南进行配置。
启用懒加载 🐢
  1. LazyMixin 添加到你的盒子类中:
    class SettingsBox extends EasyBox with LazyMixin {
      @override
      String get boxKey => Settings.key.toString();
    }
    
  2. 使用 await 获取值:
    extension GeneralSettingsExtension on SettingsBox {
      Future&lt;ThemeMode&gt; getThemeMode() async {
        final index = await get(Settings.themeMode, defaultValue: 0);
        return ThemeMode.values[index];
      }
    }
    
监听值的变化 🎧

推荐:使用 RefreshableBox + provider

  1. 延伸 RefreshableBox 而不是 EasyBox
    class SettingsBox extends RefreshableBox {
      @override
      String get boxKey => Settings.key.toString();
    }
    
  2. 作为提供者使用:
    ChangeNotifierProvider(
      create: (_) =&gt; SettingsBox(),
      child: SomeWidget(),
    ),
    
    // 在 SomeWidget 内部。
    Text(
      'You have pushed: '
      '${context.select((SettingsBox _) =&gt; _.counter)} times.',
    ),
    
如果你不想使用 RefreshableBox

只需使用 ValueListenableBuilder 来监听变化:

ValueListenableBuilder(
  valueListenable: [
    Settings.counter,
  ].of(SettingsBox()),
  builder: (context, _, __) {
    return Text(
      '${SettingsBox().counter}',
    );
  },
),

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

1 回复

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


当然,以下是一个关于如何使用Flutter数据库管理插件easy_hive的代码案例。这个插件提供了一个简单的键值存储解决方案,适用于Flutter应用中的本地数据存储。

首先,确保你已经在pubspec.yaml文件中添加了easy_hive依赖:

dependencies:
  flutter:
    sdk: flutter
  easy_hive: ^latest_version  # 替换为实际最新版本号

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

接下来,让我们编写一些代码来演示如何使用easy_hive

1. 初始化Hive

在你的应用入口文件(通常是main.dart)中初始化Hive:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 初始化Hive
  await Hive.initFlutter();
  
  // 打开一个Box(类似于一个表)
  var box = await Hive.openBox<String>('myBox');
  
  // 你可以在这里关闭Box,但通常不需要在main函数中关闭
  // await box.close();

  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

2. 读写数据

在你的主页面或其他需要读写数据的组件中,使用Hive Box来进行数据操作:

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Box<String>? box;

  @override
  void initState() {
    super.initState();
    
    // 打开Box
    box = Hive.box<String>('myBox');
  }

  @override
  void dispose() {
    // 关闭Box(可选,通常在应用关闭时Hive会自动处理)
    box?.close();
    super.dispose();
  }

  void _writeValue() async {
    await box?.put('key', 'value');
    print('Value written: key -> value');
  }

  void _readValue() async {
    var value = await box?.get('key');
    print('Value read: $value');
  }

  void _deleteValue() async {
    await box?.delete('key');
    print('Value deleted: key');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Easy Hive Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: _writeValue,
              child: Text('Write Value'),
            ),
            ElevatedButton(
              onPressed: _readValue,
              child: Text('Read Value'),
            ),
            ElevatedButton(
              onPressed: _deleteValue,
              child: Text('Delete Value'),
            ),
          ],
        ),
      ),
    );
  }
}

3. 运行应用

运行你的Flutter应用,你应该会看到三个按钮:写值、读值和删除值。点击这些按钮将分别在控制台中打印相应的日志,表示数据已经被写入、读取或删除。

这个示例展示了如何使用easy_hive进行基本的键值存储操作。根据你的需求,你可以进一步扩展这些功能,例如处理更复杂的数据类型、批量操作等。

回到顶部