Как динамически загружать данные в DataTable ПРОСТОЙ с помощью Hive box и индексации во Flutter/Dart?

Мне нужен очень ПРОСТОЙ способ динамического заполнения моего DataTable и возможность обновлять его при добавлении новых данных, чтобы он обновлялся и перестраивался мгновенно. Используя коробки Hive и как можно проще.

Я использую зашифрованные ящики Hive, но это даже не имеет значения

Я задаю этот вопрос с ответом ниже. Я потратил массу времени, чтобы обнаружить это, так как я не мог найти ничего подобного, используя Hive box & 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?
                );
              },
            ),
          ),
        );
      }

1 ответ

Метод сборки 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(), а также на важный факт, что это приложение отображает всю диаграмму. Для моего приложения это нормально, потому что я не использую много данных. Пища для размышлений.

Другие вопросы по тегам