рд╣рд╛рдЗрд╡ - рд╕реНрдкрдВрджрди, рдбрд╛рд░реНрдЯ рдХреЗ рд▓рд┐рдП рддреЗрдЬреА рд╕реЗ рд╕реНрдерд╛рдиреАрдп рдЖрдзрд╛рд░

рд▓рдЧрднрдЧ рдПрдХ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ, рдлрд╝реНрд▓рдЯрд░ рдкрд░ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд╕рд╛рде рдмрд╛рдд рдХрд░рддреЗ рд╣реБрдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдлреЛрди рдкрд░ рдЫреЛрдЯреЗ (рджрд╕рд┐рдпреЛрдВ рд╣рдЬрд╛рд░реЛрдВ) рдбреЗрдЯрд╛ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдмреНрд░реЗрдХ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдереАред


рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдлреЛрди рдкрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░, рдЖрдЧреЗ, рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдЙрдирдХрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рдиред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ (рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдиреЛрдЯреНрд╕, рдЖрджрд┐) рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдХрд░рдирд╛ред


рдпрд╣ рддрдм рд╢рд╛рдВрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рдЬрдм рдХреЗрд╡рд▓ рдХреБрдЫ рд╣рдЬрд╛рд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА, рдЬрдм рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдХреИрд╢ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдпрд╛ рдЬрдм рдХреИрд╢ рдЦреЛрдЬрддреЗ рд╣реИрдВ, рддреЛ рдзреАрдорд╛ рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред


рдПрдХ рдЙрдкрд╛рдп рд╣реИ! рд╣рд╛рдЗрд╡ - noSql рдЖрдзрд╛рд░ рд╢реБрджреНрдз рдбрд╛рд░реНрдЯ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рд╛рдЗрд╡ рдХреЗ рдлрд╛рдпрджреЗ:


  • рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо - рдЪреВрдВрдХрд┐ рд╢реБрджреНрдз рдбрд╛рд░реНрдЯ рдкрд░ рдХреЛрдИ рдореВрд▓ рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИрдВ - рдореЛрдмрд╛рдЗрд▓, рдбреЗрд╕реНрдХрдЯреЙрдк, рдмреНрд░рд╛рдЙрдЬрд╝рд░ред
  • рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рдиред
  • рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдордЬрдмреВрдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рдиред

рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╣рд╛рдЗрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдПрдХ рд╕рд░рд▓ рдЯреВрдбреВ рдЖрд╡реЗрджрди рдХрд░реЗрдВ, рдЬреЛ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдФрд░ рдХреНрд▓рд╛рдЙрдб рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреВрд░рдХ рд╣реЛрдЧрд╛ред



 


рд╢реБрд░реВ


рдпрд╣рд╛рдВ рд╣рдо рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЖрд╡реЗрджрди рдХреЛ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдХреЛрдб рдЬреАрдердм рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред



рд╣рд╛рдЗрд╡ рдХреЗ рдлрд╛рдпрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ https://docs.hivedb.dev/ - рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рд╕рдм рдХреБрдЫ рд╣реИред рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдмрд╕ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╣реИ рдФрд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рд╣реИред


рддреЛ, рд╣рд╛рдЗрд╡ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, 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

рдЕрдЧрд▓рд╛, рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ, рдЖрдорддреМрд░ рдкрд░ рдЖрд╡реЗрджрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВред


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