Hive - basis lokal cepat untuk Flutter, Dart

Sekitar sebulan yang lalu, berbicara dengan satu pengembang aplikasi di Flutter, ada masalah pengereman pemrosesan array data kecil (dalam puluhan ribu) di ponsel pengguna.


Banyak aplikasi memerlukan pemrosesan data pada ponsel dan, lebih lanjut, sinkronisasi dengan backend. Misalnya: daftar yang harus dilakukan, daftar data apa saja (analisis, catatan, dll.).


Sama sekali tidak keren ketika daftar hanya beberapa ribu item, ketika Anda menghapus salah satu dari mereka dan kemudian menulis ke cache atau ketika mencari cache, mulai melambat.


Ada solusinya! Sarang - basis noSql ditulis dalam Dart murni, sangat cepat. Selain itu, kelebihan Hive:


  • Cross-platform - karena tidak ada dependensi asli pada Dart murni - ponsel, desktop, browser.
  • Performa tinggi.
  • Enkripsi kuat bawaan.

Dalam artikel ini, kita akan melihat cara menggunakan Hive dan membuat aplikasi ToDo sederhana, yang dalam artikel selanjutnya akan dilengkapi dengan otorisasi dan sinkronisasi dengan cloud.



 


Mulailah


Di sini kita akan menulis aplikasi seperti itu di akhir artikel, kodenya diposting di github .



Salah satu kelebihan Hive adalah dokumentasi yang sangat bagus https://docs.hivedb.dev/ - secara teori semuanya ada di sana. Dalam artikel itu, saya hanya akan menjelaskan secara singkat bagaimana bekerja dengan apa dan membuat contoh.


Jadi, untuk menghubungkan sarang ke proyek, tambahkan ke pubspec.yaml


dependencies:
  hive: ^1.4.1+1
  hive_flutter: ^0.3.0+2

dev_dependencies:
  hive_generator: ^0.7.0+2
  build_runner: ^1.8.1

Selanjutnya, inisialisasi, biasanya di awal aplikasi.


await Hive.initFlutter();


, , . hive_flutter: ^0.3.0+2 — Flutter.



, Hive List, Map, DateTime, BigInt Uint8List.


, TypeAdapters. https://docs.hivedb.dev/#/custom-objects/type_adapters ( hive_generator: ^0.7.0+2).



class Todo {
  bool complete;
  String id;
  String note;
  String task;
}

id — typeId: 0


import 'package:hive/hive.dart';
part 'todo.g.dart';
@HiveType(typeId: 0)
class Todo {
  @HiveField(0)
  bool complete;
@HiveField(1)
  String id;
@HiveField(2)
  String note;
@HiveField(3)
  String task;
}

, , . Hive.



flutter packages pub run build_runner build --delete-conflicting-outputs
todo.g.dart


\ Hive.


HiveObject — Todo HiveObject


class Todo extends HiveObject {


2 save() delete(), .


— Box


hive (box). , , ..


Box . , ( ).
var todoBox = await Hive.openBox<Todo>('box_for_todo');
read / write .


, :


,
var stringBox = await Hive.openBox<String>('name_of_the_box');



stringBox.put('key1', 'value1');
print(stringBox.get('key1')); // value1
stringBox.put('key2', 'value2');
print(stringBox.get('key2')); // value2

+


List. autoinrement.


: getAt(), putAt() and deleteAt()


add() .


stringBox.put('value1');
stringBox.put('value2');
stringBox.put('value3');
print(stringBox.getAt(1)); //value2

? , Hive. Listeners , . ( , ), Listeners . await .

,
var stringBox = await Hive.box<String>('name_of_the_box');
, singleton.


, , , ,
var stringBox = await Hive.openBox<String>('name_of_the_box');


  • , .

, :


  /// Returns a previously opened box.
  Box<E> box<E>(String name);
  /// Returns a previously opened lazy box.
  LazyBox<E> lazyBox<E>(String name);
  /// Checks if a specific box is currently open.
  bool isBoxOpen(String name);
  /// Closes all open boxes.
  Future<void> close();

Devhack , Flutter — open source, , , .

LazyBox —


, . . , - .


, lazily


var lazyBox = await Hive.openLazyBox('myLazyBox');
var value = await lazyBox.get('lazyVal');

Hive . , Hive .



Hive AES-256 .
256-
var key = Hive.generateSecureKey();
Fortuna random number generator.



var encryptedBox = await Hive.openBox('vaultBox', encryptionKey: key);
encryptedBox.put('secret', 'Hive is cool');
print(encryptedBox.get('secret'));

:


  • , plaintext.
  • flutter_secure_storage .
  • , , .


, , .


,


var box = Hive.box('myBox');
await box.compact();
await box.close();

todo_hive_example


, , , .
, .


:


  • — +

:


  • +
  • — \

1 —


, , ( +.


, .
.


(, Dart (extensions)), /hive_flutter-0.3.0+2/lib/src/box_extensions.dart


/// Flutter extensions for boxes.
extension BoxX<T> on Box<T> {
  /// Returns a [ValueListenable] which notifies its listeners when an entry
  /// in the box changes.
  ///
  /// If [keys] filter is provided, only changes to entries with the
  /// specified keys notify the listeners.
  ValueListenable<Box<T>> listenable({List<dynamic> keys}) =>
      _BoxListenable(this, keys?.toSet());
}

, .

, ,


      body: ValueListenableBuilder(
        valueListenable: Hive.box<Todo>(HiveBoxes.todo).listenable(),
        builder: (context, Box<Todo> box, _) {
          if (box.values.isEmpty)
            return Center(
              child: Text("Todo list is empty"),
            );
          return ListView.builder(
            itemCount: box.values.length,
            itemBuilder: (context, index) {
              Todo res = box.getAt(index);
              return ListTile(
                title: Text(res.task),
                subtitle: Text(res.note),
              );
            },
          );
        },
      ),

. + .


, +.


Add , .


void _onFormSubmit() {
    Box<Todo> contactsBox = Hive.box<Todo>(HiveBoxes.todo);
    contactsBox.add(Todo(task: task, note: note));
    Navigator.of(context).pop();
  }

, , Todo. Hive.


github .


2 — \


. , class Todo extends HiveObject



                  leading: res.complete
                      ? Icon(Icons.check_box)
                      : Icon(Icons.check_box_outline_blank),
                  onTap: () {
                    res.complete = !res.complete;
                    res.save();
                  });

github .


3 — —


. dismissable .


                background: Container(color: Colors.red),
                key: Key(res.id),
                onDismissed: (direction) {
                  res.delete();
                },

, , .


github — https://github.com/awaik/todo_hive_example


To be continued:


  • BLoC. , , Apple Id.
  • Firebase GraphQl . ( ).

All Articles