Flutter第三方插件objectbox的使用

news2024/9/25 21:23:40

Flutter基础

demo地址
参考地址


文章目录

  • Flutter基础
  • 前言
  • 一、demo效果图
  • 二、objectbox是什么?
  • 三、objectbox的使用
    • 1.在pubspec.yaml文件中添加
    • 2.执行flutter pub get命令
    • 3.创建数据库模型
    • 4.执行flutter pub run build_runner build 命令
    • 5.如果报错则执行flutter pub run build_runner build --delete-conflicting-outputs 命令
  • 三、demo代码
    • 1.order_data_table.dart文件
    • 2.home_page.dart文件
  • 总结


前言

这篇文章主要分享flutter第三方插件objectbox的简单使用。


一、demo效果图

请添加图片描述

二、objectbox是什么?

ObjectBox Flutter database is a great option for storing Dart objects in your cross-platform apps. Designed for high performance, the ObjectBox Flutter database is ideal or mobile and IoT devices. ObjectBox uses minimal CPU, memory and battery, making your app not only effective, but also sustainable. By storing data locally on device, ObjectBox helps you cut your cloud costs down and make an app that doesn't depend connection. Get started with our intuitive native Dart API in minutes, without the hassle of SQL. Plus: We built a data synchronization solution that allows you to keep data in sync across devices and servers, both online and offline.

翻译:
ObjectBox Flutter数据库是在你的跨平台应用程序中存储Dart对象的一个很好的选择。ObjectBox Flutter数据库专为高性能而设计,是移动和物联网设备的理想选择。ObjectBox使用最少的CPU、内存和电池,使您的应用程序不仅有效,而且可持续。通过在设备上本地存储数据,ObjectBox可以帮助你降低云计算成本,并制作一个不依赖连接的应用程序。在几分钟内开始使用我们直观的本机Dart API,没有SQL的麻烦。另外:我们构建了一个数据同步解决方案,允许您在设备和服务器之间保持数据同步,包括在线和离线。

三、objectbox的使用

1.在pubspec.yaml文件中添加

objectbox: 1.6.2
objectbox_flutter_libs: 1.6.2

请添加图片描述

2.执行flutter pub get命令

如图可以看到已经把objectbox_flutter_lbs库拉下来了
请添加图片描述

3.创建数据库模型

import 'package:objectbox/objectbox.dart';

()
class ShopOrder {
  int id;
  int price;
  final customer = ToOne<Customer>();

  ShopOrder({this.id = 0, required this.price});
}

()
class Customer {
  int id;
  String name;
  ()
  final orders = ToMany<ShopOrder>();
  Customer({this.id = 0, required this.name});
}

4.执行flutter pub run build_runner build 命令

这时会自动生成objectbox.g.dart和objectbox-model.json文件
请添加图片描述

5.如果报错则执行flutter pub run build_runner build --delete-conflicting-outputs 命令

三、demo代码

1.order_data_table.dart文件

import 'package:flutter/material.dart';
import 'package:flutter_objectbox/entities.dart';

import '../objectbox.g.dart';

class OrderDataTable extends StatefulWidget {
  final List<ShopOrder> orders;
  final void Function(int columnIndex, bool ascending) onSort;
  final Store store;

  const OrderDataTable({
    Key? key,
    required this.orders,
    required this.onSort,
    required this.store,
  }) : super(key: key);

  
  _OrderDataTableState createState() => _OrderDataTableState();
}

class _OrderDataTableState extends State<OrderDataTable> {
  bool _sortAscending = true;
  int _sortColumnIndex = 0;

  
  Widget build(BuildContext context) {
    return SingleChildScrollView(
      scrollDirection: Axis.horizontal,
      child: SingleChildScrollView(
        child: DataTable(
          sortColumnIndex: _sortColumnIndex,
          sortAscending: _sortAscending,
          columns: [
            DataColumn(
              label: Text('Number'),
              onSort: _onDataColumnSort,
            ),
            DataColumn(
              label: Text('Customer'),
            ),
            DataColumn(
              label: Text('Price'),
              numeric: true,
              onSort: _onDataColumnSort,
            ),
            DataColumn(
              label: Container(),
            ),
          ],
          rows: widget.orders.map((order) {
            return DataRow(
              cells: [
                DataCell(
                  Text(order.id.toString()),
                ),
                DataCell(
                  Text(order.customer.target?.name ?? 'NONE'),
                  onTap: () {
                    showModalBottomSheet(
                      context: context,
                      builder: (context) {
                        return Material(
                          child: ListView(
                            children: order.customer.target!.orders
                                .map(
                                  (_) => ListTile(
                                    title: Text(
                                      '${_.id}    ${_.customer.target?.name}    \$${_.price}',
                                    ),
                                  ),
                                )
                                .toList(),
                          ),
                        );
                      },
                    );
                  },
                ),
                DataCell(
                  Text(
                    '\$${order.price}',
                  ),
                ),
                DataCell(
                  Icon(Icons.delete),
                  onTap: () {
                    widget.store.box<ShopOrder>().remove(order.id);
                  },
                ),
              ],
            );
          }).toList(),
        ),
      ),
    );
  }

  void _onDataColumnSort(int columnIndex, bool ascending) {
    setState(() {
      _sortColumnIndex = columnIndex;
      _sortAscending = ascending;
    });
    widget.onSort(columnIndex, ascending);
  }
}

2.home_page.dart文件

import 'package:faker/faker.dart';
import 'package:flutter/material.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';

import '../objectbox.g.dart';
import 'entities.dart';
import 'order_data_table.dart';

class HomePage extends StatefulWidget {
  
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  final faker = Faker();

  late Store _store;
  bool hasBeenInitialized = false;

  late Customer _customer;
  late Stream<List<ShopOrder>> _stream;

  
  void initState() {
    super.initState();
    setNewCustomer();
    getApplicationDocumentsDirectory().then((dir) {
      print('打印一下数据库地址==${dir.path}');
      _store = Store(
          // This method is from the generated file
          getObjectBoxModel(),
          directory: join(dir.path, 'objectbox1'));

      setState(() {
        _stream = _store
            .box<ShopOrder>()
            .query()
            .watch(triggerImmediately: true)
            .map((query) => query.find());

        hasBeenInitialized = true;
      });
    });
    setNewCustomer();
  }

  
  void dispose() {
    _store.close();
    super.dispose();
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Orders App'),
        actions: [
          IconButton(
            icon: Icon(Icons.person_add_alt),
            onPressed: setNewCustomer,
          ),
          IconButton(
            icon: Icon(Icons.attach_money),
            onPressed: addFakeOrderForCurrentCustomer,
          ),
        ],
      ),
      body: !hasBeenInitialized
          ? Center(
              child: CircularProgressIndicator(),
            )
          : StreamBuilder<List<ShopOrder>>(
              stream: _stream,
              builder: (context, snapshot) {
                if (!snapshot.hasData) {
                  return Center(
                    child: CircularProgressIndicator(),
                  );
                } else {
                  return OrderDataTable(
                    orders: snapshot.data!,
                    onSort: (columnIndex, ascending) {
                      final newQueryBuilder = _store.box<ShopOrder>().query();
                      final sortField = columnIndex == 0 ? ShopOrder_.id : ShopOrder_.price;
                      newQueryBuilder.order(sortField, flags: ascending ? 0 : Order.descending);

                      setState(() {
                        _stream = newQueryBuilder
                            .watch(triggerImmediately: true)
                            .map((query) => query.find());
                      });
                    },
                    store: _store,
                  );
                }
              },
            ),
    );
  }

  void setNewCustomer() {
    _customer = Customer(name: faker.person.name());
  }

  void addFakeOrderForCurrentCustomer() {
    final order = ShopOrder(
      price: faker.randomGenerator.integer(500, min: 10),
    );
    order.customer.target = _customer;
    _store.box<ShopOrder>().put(order);
  }
}


总结

以上就是今天要讲的内容,本文简单介绍了objectbox的使用。希望文章对你有所帮助,后续继续完善。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367250.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Renderdoc中一个daraw的API调用以及其作用

分析renderdoc中一个draw调用的api接口&#xff0c;如下是一个draw调用的渲染api的过程&#xff0c;下面来分析一下这几个函数的作用。 PSSetShaderResources、VSSetShader、PSSetShader这三个方法在renderdoc调用过程使用的方法&#xff0c;这三个方法的做法分别如下&#xff…

【华为OD机试模拟题】用 C++ 实现 - 日志采集系统(2023.Q1)

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…

NMS详解

(类别&#xff0c;坐标1&#xff0c;坐标2&#xff0c;坐标3&#xff0c;坐标4&#xff0c;类别分数) step1&#xff1a;对最后一列分数进行排序 &#xff0c;可以看到类别就被打乱了 step2&#xff1a; 弹出得到selected_bboxes作为基准&#xff0c;减少bbox_list。其实就是准…

寻路库recastnavigation改造

本文是介绍对寻路库recastnavigation 改造&#xff0c;使得使用更加友好。 Git仓库: https://github.com/jiangguilong2000/recastnavigation 首先&#xff0c;我们要做一些前置操作 SDL: 开放源代码的跨平台多媒体开发库 Premake&#xff1a;量跨平台构建系统 环境: VS 2019…

国内知名插画培训机构有哪些,学习插画怎么选培训班

国内知名插画培训机构有哪些&#xff1f;给大家梳理了国内5家专业的插画师培训班&#xff0c;最新无大插画班排行榜&#xff0c;各有优势和特色&#xff01; 一&#xff1a;国内知名插画培训机构排名 1、轻微课&#xff08;五颗星&#xff09; 主打课程有日系插画、游戏原画…

Linux 计划任务讲解

目录 计划任务 一次性计划任务 长期性计划任务 计划任务 管理员可以编辑自己的和普通用户的计划任务 普通用户只可以编辑自己的计划任务 计划任务根据执行方式分为一次性计划任务、长期性计划任务 一次性计划任务 此计划只执行一次&#xff0c;执行后或就不会再执行了 通…

项目管理之三点估算(正态分布)

三点估算法主要来自于项目的计划评审技术 PERT&#xff0c;能评估时间与概率的关系。 三点估算法不仅可以用于定量风险分析&#xff0c;也可用于进度管理中活动历时估算。先记住几个概念&#xff1a;最乐观时间TO&#xff1a;完成该工作最少需要的时间&#xff1b;最悲观时间TP…

R统计绘图-PCA详解1(princomp/principal/prcomp/rda等)

此文为《精通机器学习&#xff1a;基于R》的学习笔记&#xff0c;书中第九章详细介绍了无监督学习-主成分分析(PCA)的分析过程和结果解读。 PCA可以对相关变量进行归类&#xff0c;从而降低数据维度&#xff0c;提高对数据的理解。分析的主要目的一般是&#xff1a;1)识别数据…

CVPR2022 | ABINet+: 似人阅读: 场景文本识别的自主、双向和迭代语言建模

论文标题&#xff1a;ABINet&#xff1a;Read Like Humans: Autonomous, Bidirectional and Iterative Language Modeling for Scene Text Recognition代码&#xff1a;https://github.com/FangShancheng/ABINet链接&#xff1a;https://arxiv.org/abs/2103.06495一、AbstractH…

Linux 安装php环境

1.下载php wget http://am1.php.net/distributions/php-7.3.2.tar.gz 2.解压 tar -zxvf php-7.3.2.tar.gz 3.安装扩展 接下来进行参数配置&#xff0c;配置前如果没有libxml2和libxml2-devel会报错&#xff0c;所以应该更新libxml2并安装libxml2-devel&#xff0c;使用在线…

C++回顾(一)——从C到C++

前言 在学习了C语言的基础上&#xff0c;C到底和C有什么区别呢&#xff1f; 1.1 第一个C程序 #include <iostream>// 使用名为std的命名空间 using namespace std;int main() {// printf ("hello world\n");// cout 标准输出 往屏幕打印内容 相当于C语言的…

ELK日志分析--Kibana

Kibana 概述 部署安装浏览页面并使用 1.Kibana 概述 Kibana-是进入Elastic的窗口使用Kibana&#xff0c;可以 1 搜索&#xff0c;观察和保护。 从发现文档到分析日志再到发现安全漏洞&#xff0c;Kibana是您访问这些功能及其他功能的门户。 2 可视化和分析您的数据。 搜索隐藏的…

github ssh密钥配置,克隆远程仓库

GitHub的SSH配置 在往github上push项目的时候&#xff0c;如果走https的方式&#xff0c;每次都需要输入账号密码&#xff0c;非常麻烦。而采用ssh的方式&#xff0c;就不再需要输入&#xff0c;只需要在github自己账号下配置一个ssh key即可&#xff01; 很多朋友在用github管…

kkfileview在预览word文档中文乱码

因为liunx服务器没有相关中文字体 1.下载中文字体包 http://kkfileview.keking.cn/fonts.zip 2.上传服务器至目录/usr/share/fonts 解压 unzip fonts.zip 3.执行命令 mkfontscale mkfontdir fc-cache 如果报错命令没有找到&#xff0c;则安装对应命令&#xff0c;例如 yum in…

Mikrotik Ros安全加固

基本概述 Mikrotik系列路由器也成RouterOS软路由&#xff0c;RouterOS是基于Linux内核的网络操作系统&#xff0c;其预装在MikroTik生产的路由器、无线设备以及RouterBOARD上。同时&#xff0c;它也可以安装在x86平台的个人电脑上&#xff0c;用于将电脑转化为路由器&#xff…

【01】从零开始学Python—数据分析与挖掘概述

马云曾说“中国正迎来从IT时代到DT时代的变革”&#xff0c;DT就是大数据时代。数据已成为企业的核心资产和宝贵资源&#xff0c;企业愈加重视和善加利用数据分析与挖掘技术。 1.1什么是数据分析与挖掘 数据分析和挖掘都是基于搜集来的数据&#xff0c;应用数学、统计、计算机…

6个思维矩阵,90%的项目经理都收藏了

早上好&#xff0c;我是老原。我们都是知道&#xff0c;项目经理的管理能力如何&#xff0c;往往也决定项目的走向如何&#xff1f;今天老原给大家分享这6个管理矩阵&#xff0c;是每一位项目经理需要修炼的能力。01、项目领导力矩阵项目领导力矩阵还是蛮有意思的&#xff0c;四…

记忆化搜索

一.记忆化搜索概述 1.概念 搜索是一种简单有效但是效率又很低下的算法结构&#xff0c;其低效的原因主要在于存在很多重叠子问题。而记忆化搜索则是在搜索的基础上&#xff0c;利用数组来记录已经计算出来的重叠子问题状态&#xff0c;进行合理化的剪枝&#xff0c;从而降低时…

程序员如何发展第二职业?这几种副业方式超赚钱

很多程序员曾表示&#xff0c;虽然月薪一两万&#xff0c;但有时候还是会焦虑。 尤其是遇上了年初裁员年底裁员这样的就业环境&#xff0c;焦虑就会逐步放大&#xff0c;这时候副业赚钱的重要性就体现出来了。 发展第二职业&#xff0c;可以让程序员们增加抗风险能力&#xf…

扩展学习之时间戳趣谈

目录 一、介绍 二、转换工具 三、获取Unix时间戳的指令 四、普通时间转Unix时间戳 五、扩展 一、介绍 时间戳&#xff1a;一份数据在特定时间点存在的可验证的数据。 Unix时间戳&#xff08;英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp&#xff09;&…