Flutter对象存储与管理插件stash_objectbox的使用

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

Flutter对象存储与管理插件stash_objectbox的使用

stash_objectbox

stash_objectbox 是一个为 stash 提供基于 objectbox 的存储扩展。它利用了高效的二进制序列化(通过 msgpack 序列化格式)来实现对象的存储与管理。

概述

stash_objectbox 是一个为 stash 提供的存储扩展,它基于 objectbox 提供了一个高度性能的二进制序列化存储方案。该方案通过 msgpack 序列化格式来实现对象的高效存储。

入门指南

在你的 pubspec.yaml 文件中添加以下依赖(或创建它),并将 x.x.x 替换为最新的 stash_objectbox 版本:

dependencies:
    stash_objectbox: ^x.x.x

然后运行以下命令以安装依赖:

dart pub get

最后,导入库以开始开发:

import 'package:stash/stash_api.dart';
import 'package:stash_objectbox/stash_objectbox.dart';

使用方法

Vault(保险箱)

以下示例展示了如何创建一个使用 objectbox 存储后端的保险箱。在这个简单的例子中,对象的序列化和反序列化是手动编码的,但通常我们会使用像 json_serializable 这样的库来简化这一过程。

import 'dart:io';

import 'package:stash/stash_api.dart';
import 'package:stash_objectbox/stash_objectbox.dart';

class Task {
  final int id;
  final String title;
  final bool completed;

  Task({required this.id, required this.title, this.completed = false});

  /// 从 JSON 映射创建 [Task]
  factory Task.fromJson(Map<String, dynamic> json) => Task(
      id: json['id'] as int,
      title: json['title'] as String,
      completed: json['completed'] as bool);

  /// 将 [Task] 转换为 JSON 映射
  Map<String, dynamic> toJson() =>
      {'id': id, 'title': title, 'completed': completed};

  [@override](/user/override)
  String toString() {
    return 'Task $id, "$title" is ${completed ? "completed" : "not completed"}';
  }
}

void main() async {
  // 创建临时目录
  final path = Directory.systemTemp.path;

  // 创建存储
  final store = await newObjectboxLocalVaultStore(path: path);

  // 从先前创建的存储中创建保险箱
  final vault = await store.vault<Task>(
      name: 'vault',
      fromEncodable: (json) => Task.fromJson(json),
      eventListenerMode: EventListenerMode.synchronous)
    ..on<VaultEntryCreatedEvent<Task>>().listen(
        (event) => print('Key "${event.entry.key}" added to the vault'));

  // 向保险箱中添加一个任务
  await vault.put(
      'task1', Task(id: 1, title: 'Run vault store example', completed: true));
  
  // 从保险箱中检索任务
  print(await vault.get('task1'));
  
  // 关闭保险箱
  vault.close();
}

Cache(缓存)

以下示例展示了如何创建一个使用 objectbox 存储后端的缓存。在这个简单的例子中,对象的序列化和反序列化是手动编码的,但通常我们会使用像 json_serializable 这样的库来简化这一过程。

import 'dart:io';

import 'package:stash/stash_api.dart';
import 'package:stash_objectbox/stash_objectbox.dart';

class Task {
  final int id;
  final String title;
  final bool completed;

  Task({required this.id, required this.title, this.completed = false});

  /// 从 JSON 映射创建 [Task]
  factory Task.fromJson(Map<String, dynamic> json) => Task(
      id: json['id'] as int,
      title: json['title'] as String,
      completed: json['completed'] as bool);

  /// 将 [Task] 转换为 JSON 映射
  Map<String, dynamic> toJson() =>
      {'id': id, 'title': title, 'completed': completed};

  [@override](/user/override)
  String toString() {
    return 'Task $id, "$title" is ${completed ? "completed" : "not completed"}';
  }
}

void main() async {
  // 创建临时目录
  final path = Directory.systemTemp.path;

  // 创建存储
  final store = await newObjectboxLocalCacheStore(path: path);

  // 从先前创建的存储中创建具有容量限制的缓存
  final cache = await store.cache<Task>(
      name: 'cache1',
      fromEncodable: (json) => Task.fromJson(json),
      maxEntries: 10,
      eventListenerMode: EventListenerMode.synchronous)
    ..on<CacheEntryCreatedEvent<Task>>().listen(
        (event) => print('Key "${event.entry.key}" added to the cache'));

  // 向缓存中添加一个任务
  await cache.put(
      'task1', Task(id: 1, title: 'Run cache store example', completed: true));
  
  // 从缓存中检索任务
  print(await cache.get('task1'));
  
  // 关闭缓存
  cache.close();
}

更多关于Flutter对象存储与管理插件stash_objectbox的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter对象存储与管理插件stash_objectbox的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于Flutter中对象存储与管理插件stash_objectbox的使用,下面是一个简单的代码示例,展示了如何在Flutter项目中集成和使用stash_objectbox来存储和管理对象。

步骤 1: 添加依赖

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

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

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

步骤 2: 配置ObjectBox模型

接下来,你需要定义一个ObjectBox模型。创建一个新的Dart文件,例如models/person.dart,并定义一个简单的Person类:

import 'package:objectbox/objectbox.dart';

@Entity()
class Person extends EntityBase {
  Int id = 0.assignable();
  String? name;
  int age;

  Person({this.name, this.age});
}

步骤 3: 初始化ObjectBox存储

在你的主应用文件(通常是main.dart)中,初始化ObjectBox存储:

import 'package:flutter/material.dart';
import 'package:stash_objectbox/stash_objectbox.dart';
import 'models/person.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化ObjectBox存储
  final store = await BoxStoreBuilder()
      .registerEntities([Person()])  // 注册实体
      .build();

  runApp(MyApp(store));
}

class MyApp extends StatelessWidget {
  final BoxStore store;

  MyApp(this.store);

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

步骤 4: 使用ObjectBox存储和管理对象

在你的MyHomePage类中,你可以使用ObjectBox来存储、查询和更新对象。例如:

import 'package:flutter/material.dart';
import 'package:stash_objectbox/stash_objectbox.dart';
import 'models/person.dart';

class MyHomePage extends StatefulWidget {
  final BoxStore store;

  MyHomePage(this.store);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  late Box<Person> personBox;

  @override
  void initState() {
    super.initState();
    // 获取Person实体的Box
    personBox = widget.store.boxFor<Person>();

    // 示例:存储对象
    _storePerson();

    // 示例:查询对象
    _queryPersons();
  }

  void _storePerson() async {
    Person person = Person(name: "Alice", age: 30);
    await personBox.put(person);
  }

  void _queryPersons() async {
    Query<Person> query = personBox.query().build();
    List<Person> persons = await query.find();
    persons.forEach((person) {
      print("${person.id}: ${person.name}, ${person.age}");
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ObjectBox Demo'),
      ),
      body: Center(
        child: Text('Check the console for stored and queried persons.'),
      ),
    );
  }
}

总结

这个示例展示了如何在Flutter项目中使用stash_objectbox插件来存储和管理对象。通过定义实体类、初始化ObjectBox存储以及在UI中使用Box对象,你可以轻松地实现对象存储和管理功能。请确保在实际项目中处理异步操作和错误,并根据需要扩展功能。

回到顶部