微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 Flutter/Dart 中的 Hive 框和索引以简单的方式将数据动态加载到 DataTable?

如何解决如何使用 Flutter/Dart 中的 Hive 框和索引以简单的方式将数据动态加载到 DataTable?

我想要一种非常简单的方法来动态填充我的 DataTable,并且能够在添加新数据时刷新它,以便它立即更新和重建。以最简单的方式使用 Hive 框。

我正在使用 Hive 加密的盒子,但这并不重要

我提出这个问题并在下面给出答案。我花了大量时间来发现这一点,因为使用 Hive 框和 SIMPLE 找不到其他类似的东西。我真的希望这对其他人有所帮助,作为一名绿色开发人员,我在 SO 上获得了大量帮助。我很自豪我可能会回报他们的人情。

我有一个连接了适配器并注册到 Hive 的类

import 'package:hive/hive.dart';
part 'person.g.dart';

@HiveType(typeId: 0)
class Person {
  @HiveField(0)
  final String firstName;
  @HiveField(1)
  final String lastName;
  @HiveField(2)
  final int age;
  @HiveField(3)
  final String Status;
  Person(
    this.firstName,this.lastName,this.age,this.status,);
  @override
  String toString() {
    return '{${this.firstName},${this.lastName},${this.age},${this.status}}';
  }
}

按下按钮保存到蜂巢

onpressed: () {
                  final newPersonData = Person(
                    _firstName,_lastName,int.parse(_age),_status,);

                  addPerson(newPersonData);

                  var Box = Hive.Box(personTable);
                  for (var index in Box.values) {
                    print(index);
                  }
                },

DataTable 构建方法

  _buildDataTable() {
        return SingleChildScrollView(
          scrollDirection: Axis.horizontal,child: DataTable(
            columns: const <DataColumn>[
              DataColumn(
                label: Text('First'),),DataColumn(
                label: Text('Last'),DataColumn(
                label: Text('Age'),DataColumn(
                label: Text('Status'),],rows: List<DaTarow>
                                    // How to dynamically load cells in a ***SIMPLE*** manner?
                );
              },);
      }

解决方法

DataTable 构建方法

  _buildDataTable() {
    final hiveBox = Hive.box(personTable);

    return ValueListenableBuilder(
      valueListenable: Hive.box(personTable).listenable(),builder: (context,personBox,_) {
        return SingleChildScrollView(
          scrollDirection: Axis.horizontal,child: DataTable(
            columns: const <DataColumn>[
              DataColumn(
                label: Text('First'),),DataColumn(
                label: Text('Last'),DataColumn(
                label: Text('Age'),DataColumn(
                label: Text('Status'),],rows: List<DataRow>.generate(
              hiveBox.length,(index) {
                final person = hiveBox.getAt(index) as Person;
                return DataRow(
                  cells: [
                    DataCell(Text(person.firstName)),DataCell(Text(person.lastName)),DataCell(Text(person.age.toString())),DataCell(Text(person.status))
                  ],);
              },);
      },);
  }

说明

我会尽可能多地解释我在上面所做的事情。

  • ValueListenableBuilder - 此方法侦听 Hive.box 的添加内容,并在发生任何新更新时刷新。如果没有此方法,DataTable 将不会在添加数据时重建。
  • DataRow.generate() 方法允许您遍历您想要遍历的任何内容,在我的例子中,它的字符串来自我的 Person 对象,而后者又来自我的加密 Hive。

差不多就是这样!超级简单-希望这可以帮助其他人:)

编辑:我注意到应该使用 watch() 而不是 ValueListenableBuilder() 以及这个应用程序呈现整个图表的一个重要事实。对于我的应用程序,这没问题,因为我没有使用太多数据进行构建。深思熟虑。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。