У розробці мобільних додатків на Flutter часто виникає потреба зберігати дані локально і працювати з ними. Одним з популярних інструментів для локального сховища даних є Hive. Hive дозволяє зберігати об’єкти за допомогою ключ-значення, а також працювати зі списками об’єктів, використовуючи тип даних HiveList. У цій статті ми розглянемо, як ефективно фільтрувати спостереження HiveList у Flutter для практичного застосування.
Почнемо з того, що розглянемо структуру наших моделей. У нашому випадку ми маємо моделі Student
і Observation
, які представляють студента та його спостереження відповідно. Клас Student
містить поле observations
, яке є HiveList типу Observation
. Це означає, що ми можемо зберігати список спостережень для кожного студента. Отже, перше, що нам потрібно зробити, це зберегти спостереження для конкретного студента.
1 2 3 4 5 6 7 8 9 10 11 12 |
```dart void saveObservation() { final newObservation = Observation() ..date = date ..rating = _selectedRating! ..wording = textController.text ..subject = _selectedSubject!; widget.student.observations?.add(newObservation); widget.student.save(); _observationsBox?.add(newObservation); Navigator.of(context).pop(); } |
Код вище показує метод saveObservation()
, який додає нове спостереження до списку спостережень студента і зберігає зміни. Це працює коректно, і ми можемо побачити всі збережені спостереження.
Однак, коли ми намагаємося показати лише спостереження, які стосуються певного студента, виникає питання про ефективне фільтрування. У нашому випадку ми маємо сторінку ObservationsPage
, яка повинна відображати тільки спостереження, що стосуються певного студента.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
```dart class ObservationsPage extends StatefulWidget { final Student student; const ObservationsPage({super.key, required this.student}); @override State<ObservationsPage> createState() => _ObservationsPageState(); } class _ObservationsPageState extends State<ObservationsPage> { Box<Observation>? _observationsBox; List<Observation> studentObservations = []; @override void initState() { _observationsBox = Boxes.getObservations(); studentObservations = _observationsBox!.values.toList(); super.initState(); } } ``` |
У вищеприведеному коді ми отримуємо всі спостереження з коробки і зберігаємо їх у змінну studentObservations
. Однак нам потрібно лише ті спостереження, які стосуються конкретного студента. Тому нам потрібно додатково фільтрувати список.
Щоб ефективно фільтрувати спостереження, ми можемо скористатися методом where
для HiveList. Цей метод дозволяє вибирати елементи, які відповідають певному умові. У нашому випадку ми хочемо відфільтрувати спостереження за полем student
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
```dart class _ObservationsPageState extends State<ObservationsPage> { Box<Observation>? _observationsBox; List<Observation> studentObservations = []; @override void initState() { _observationsBox = Boxes.getObservations(); studentObservations = _observationsBox!.values .where((observation) => observation.student == widget.student) .toList(); super.initState(); } } ``` |
У вищеприведеному коді ми використовуємо метод where
для фільтрації спостережень за умовою, що поле student
спостереження дорівнює переданому студенту. Тепер studentObservations
містить лише спостереження, які стосуються певного студента.
Таким чином, ми ефективно фільтруємо спостереження HiveList у Flutter за допомогою методу where
, що дозволяє нам працювати з даними лише тих студентів, які нас цікавлять.
`