Hive - schnelle lokale Basis fĂĽr Flutter, Dart

Vor ungefähr einem Monat gab es im Gespräch mit einem Anwendungsentwickler über Flutter ein Problem beim Bremsen der Verarbeitung kleiner (Zehntausende) Datenfelder auf dem Telefon des Benutzers.


Viele Anwendungen erfordern eine Datenverarbeitung auf dem Telefon und darĂĽber hinaus eine Synchronisierung mit dem Backend. Zum Beispiel: Aufgabenlisten, Listen aller Daten (Analysen, Notizen usw.).


Es ist überhaupt nicht cool, wenn die Liste von nur ein paar tausend Elementen, wenn Sie eines davon löschen und dann in den Cache schreiben oder wenn Sie den Cache durchsuchen, langsamer wird.


Es gibt eine Lösung! Hive - noSql Basis in reinem Dart geschrieben, sehr schnell. Darüber hinaus sind die Vorteile von Hive:


  • PlattformĂĽbergreifend - da es keine nativen Abhängigkeiten von reinem Dart gibt - mobil, Desktop, Browser.
  • Hochleistung.
  • Eingebaute starke VerschlĂĽsselung.

In diesem Artikel erfahren Sie, wie Sie Hive verwenden und eine einfache ToDo-Anwendung erstellen, die im nächsten Artikel durch Autorisierung und Synchronisierung mit der Cloud ergänzt wird.



 


Start


Hier werden wir eine solche Anwendung am Ende des Artikels schreiben, der Code wird auf github gepostet .



Einer der Vorteile von Hive ist die sehr gute Dokumentation https://docs.hivedb.dev/ - theoretisch ist alles da. In dem Artikel werde ich einfach kurz beschreiben, wie man mit was arbeitet und ein Beispiel machen.


Um hive mit dem Projekt zu verbinden, fĂĽgen Sie es zu pubspec.yaml hinzu


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

Als nächstes initialisieren Sie normalerweise zu Beginn der Anwendung.


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