Hive 在 Flutter 中的使用

序言

官方原话:Hive是为Flutter设计的。如果您需要一个轻量级的数据存储来支持您的应用,它非常合适。添加所需的依赖并初始化Hive后,您就可以在项目中使用Hive了

Hive 是一款用纯 Dart 编写的轻量级且极速的键值数据库,其灵感来源于 Bitcask。

其实简单的来说,上手简单

上链接官方库地址

特点

  • 跨平台:移动、桌面、浏览器
  • ⚡ 性能卓越(参见基准测试)
  • ❤️ 简单、强大、直观的应用程序接口
  • 内置强大的加密功能
  • 无本地依赖性

使用

第一步,先引入库

yaml 复制代码
dependencies: 
  hive: ^2.2.3
  hive_flutter: ^1.1.0

dev_dependencies: 
  hive_generator: 2.0.1
  build_runner: 2.4.8 

接下来在main 里初始化

csharp 复制代码
Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Hive.initFlutter();
  Hive.registerAdapter(ContactAdapter());//实体方式保存
  await Hive.openBox(userBox);//直接键对值保存
  runApp(const MyApp());
}

疑问一:ContactAdapter 这个怎么来的呢? 先看图

我们在目录(这里为了测试,放在根目录了,建议是放置在数据目录)新建contact_page.dart

scala 复制代码
import 'package:hive/hive.dart';

part 'contact_page.g.dart';//一定要注意,跟实体名称一致

@HiveType(typeId: 0)
class Contact extends HiveObject {
  @HiveField(0)
  final String name;
  @HiveField(1)
  final int age;

  Contact({required this.name,required this.age});
}

接下来我们在命令窗口执行这串命令,会自动生成文件

arduino 复制代码
flutter packages pub run build_runner build --delete-conflicting-outputs

下面为主页demo的完整代码

scss 复制代码
```

const String userBox = "user_box"; //临时键值存储表
const String contactBox = "contact_box"; //实体数据表
class MyHomePage extends StatefulWidget {
  const MyHomePage({
    super.key,
  });

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _shoppingBox = Hive.box(userBox);

  int _counter = 0;
  List<Contact> contractLis = [];

  void _add() {
    _counter++;
    addData(_counter);
    _shoppingBox.put('key', '我是普通的键值');
    loadData();
  }

  @override
  void initState() {
    super.initState();
    loadData();
  }

  Future<void> addData(int index) async {
    var box = await Hive.openBox<Contact>(contactBox); // 存储数据
    var user = Contact(name: 'Johnny $index', age: index);
    await box.put('${DateTime.timestamp().millisecond}', user);
  }

  Future<void> loadData() async {
// 读取数据
    var box = await Hive.openBox<Contact>(contactBox); // 存储数据
    contractLis = box.values.toList();
    contractLis.sort((a, b) => b.age.compareTo(a.age));
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        backgroundColor: Theme.of(context).colorScheme.inversePrimary,
        title: Text("demo"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              '简单存储',
            ),
            Text(
              _shoppingBox.get('key') ?? "暂无设置",
            ),
            const SizedBox(
              height: 12,
            ),
            const Text(
              '实体存储',
            ),
            ...contractLis
                .map((e) => Text(
                      e.name ?? "",
                    ))
                .toList(),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _add,
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

说明

final _shoppingBox = Hive.box(userBox); 可以不用在Future 调用,非常的舒服 但是要执行 openBox操作一定需要,切记

ini 复制代码
  var box = await Hive.openBox<Contact>(contactBox);  

首次编译成功后,本地会增加俩文件 user_box 和 contact_box,这俩文件是存储咋们的内容的文件

一起看看效果吧

结束语

如果本文对你有帮助,请转发让更多的朋友阅读。

也许这个操作只要你 3 秒钟,对我来说是一个激励,感谢。

相关推荐
丘狸尾2 小时前
[cisco 模拟器] ftp服务器配置
android·运维·服务器
van叶~4 小时前
探索未来编程:仓颉语言的优雅设计与无限可能
android·java·数据库·仓颉
Crossoads8 小时前
【汇编语言】端口 —— 「从端口到时间:一文了解CMOS RAM与汇编指令的交汇」
android·java·汇编·深度学习·网络协议·机器学习·汇编语言
li_liuliu9 小时前
Android4.4 在系统中添加自己的System Service
android
C4rpeDime11 小时前
自建MD5解密平台-续
android
鲤籽鲲13 小时前
C# Random 随机数 全面解析
android·java·c#
m0_5485147717 小时前
2024.12.10——攻防世界Web_php_include
android·前端·php
凤邪摩羯17 小时前
Android-性能优化-03-启动优化-启动耗时
android
凤邪摩羯17 小时前
Android-性能优化-02-内存优化-LeakCanary原理解析
android
喀什酱豆腐18 小时前
Handle
android