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